驱动学学之驱动学习的准备工作

1:驱动开发的准备工作

(1)正常运行linux系统的开发板。要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的。

(2)内核源码树,其实就是一个经过了配置编译之后的内核源码。这里使用的是九鼎官方提供的kener,因为这个内核已经是移植好的,所以只需要直接编译即可。首先make distclean进行清理,然后make x210ii_qt_defconfig进行配置,最后make 编译得到Zimage(在/arch/arm/boot)目录下。

(3)nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。

2:常用的模块操作命令

(1)lsmod(list module 将模块列表显示):功能是打印出当前内核中已经安装的模块列表

(2)insmod(install module 安装模块):功能是向当前内核中去安装一个模块,用法是insmod xxx.ko

(3)modinfo(module information 模块信息):功能是打印出一个内核模块的自带信息。用法是modinfo xxx.ko

(4)rmmod(remove module 删除模块):功能是从当前内核中卸载一个已经安装了的模块,用法是rmmod xxx(注意卸载模块时只需要输入模块名即可,有些低版本的内核中如果加了后缀.ko会报错)

3:模块的安装(模块的卸载类似 module _exit与rmmod对应)

(1)先lsmod再insmod看安装前后系统内模块记录。实践测试标明内核会将最新安装的模块放在lsmod显示的最前面。

(2)insmod与module_init宏。模块源代码中用module_init宏声明了一个函数(在我们这个例子里是chrdev_init函数),作用就是指定chrdev_init这个函数和insmod命令绑定起来,也就是说当我们insmod module_test.ko时,insmod命令内部实际执行的操作就是帮我们调用执行chrdev_init函数。因为我们当前的驱动是安装在ubuntu中的,由于ubuntu拦截了我们安装时的打印信息,所以我们不能直接看到chrdev_init函数中的printk打印的信息,需要使用dmesg命令来查看。

(3)模块安装时insmod内部除了帮我们调用module_init宏所声明的函数外,实际还做了一些别的事

4:模块的版本信息

(1)使用modinfo查看模块的版本信息

(2)内核zImage中也有一个确定的版本信息

(3)insmod时模块的vermagic必须和内核的相同,否则不能安装,报错信息为:insmod: ERROR: could not insert module module_test.ko: Invalid module format

(4)模块的版本信息是为了保证模块和内核的兼容性,是一种安全措施

(5)如何保证模块的vermagic和内核的vermagic一致?编译模块的内核源码树就是我们编译正在运行的这个内核的那个内核源码树即可。说白了就是模块和内核要同出一门。

5:模块中常用的宏

(1)MODULE_LICENSE,模块的许可证。一般声明为GPL许可证,而且最好不要少,否则可能会出现莫名其妙的错误(譬如一些明显存在的函数提升找不到)。

(2)MODULE_AUTHOR:描述模块的作者

(3)MODULE_DESCRIPTION:描述模块的介绍信息

(4)MODULE_ALIAS:描述模块的别名

这些来自于内核驱动部分的代码,其余的也可以在内核驱动部分去寻找

6:函数修饰符

(1)__init:本质上是个宏定义,在内核源代码中就有#define __init xxxx。这个__init的作用就是将被他修饰的函数放入.init.text段中去(本来默认情况下函数是被放入.text段中)。整个内核中的所有的这类函数都会被链接器链接放入.init.text段中,所以所有的内核模块的__init修饰的函数其实是被统一放在一起的。内核启动时统一会加载.init.text段中的这些模块安装函数,加载完后就会把这个段给释放掉以节省内存。

(2)__exit:和__init类似

注:前面加一个_表示这是给内核使用的,加两个__表示是给内核内部使用的,加三个_表示很靠近内核的核心,基本不用自己去修改的

时间: 2024-09-28 16:51:59

驱动学学之驱动学习的准备工作的相关文章

关于驱动更新的一点学习

1. 如果是类似USB keyboard之类的驱动,就不要到网上去下载了,因为windows已经提供了.在windows中,系统自带驱动所在目录为 C:\Windows\winsxs. 下次如果遇到无法识别的设备,成本最低的做法是,先在设备管理器,右击选中那些问题设备,然后更新驱动程序,选择从本地目录中安装,目录即为:C:\Windows\winsxs. 2. 在利用360安全卫士或者金山卫士之类的优化软件,进行优化加速时,有可能会将一些系统需要的服务给禁用掉,如这里和usb相关的 PnP服务.

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

[kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关

Linux网络设备驱动(一) _驱动模型

Linux素来以其强大的网络功能著名,同时, 设备'>网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对设备'>网络设备贯彻其"一切皆文件"的思想, 设备'>网络设备不以/dev下的设备文件为接口,用户程序通过socket作为访问硬件的接口.本文以Linux3.14.0内核为例, 讨论Linux中的网络驱动模型 Linux的设备'>网络设备并不使用文件作为用户程序访问设备'>网络设备的

spi驱动框架全面分析,从master驱动到设备驱动

内核版本:linux2.6.32.2 硬件资源:s3c2440 参考:  韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.master 驱动框架 3.1 驱动侧 3.2 设备侧 4.SPI 设备驱动框架 4.1 设备册 4.2 驱动侧 5.设备驱动程序实例 1.I2C 驱动框架回顾 在前面学习 I2C 驱动程序的时候我们知道,I2C 驱动框架分为两层,一层是控制器驱动程序 i2c_adapter,它一般是由芯片厂商写好的,主要提供一个 algorithm

(55)Linux驱动开发之一驱动概述

驱动概述 驱动用在哪里?非标准类设备的编写和标准类设备的驱动移植. 驱动实际上是随着linux内核相伴而生的.某段代码能够控制我们的硬件去工作,去动,这段代码就称为我们的驱动代码. 技术只是一种手段,一种技巧,我们应该利用技术去搞出产品. 5.1.1_2.什么是驱动1_2 5.1.1.1.理解驱动的概念 (1)驱动一词的字面意思 (2)物理上的驱动 (3)硬件中的驱动 (4)linux内核驱动.软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序.(本质上是电力

驱动开发 —— 高级驱动学习方法

回顾一下之前的字符设备驱动编程: 1,实现入口函数 xxx_init()和卸载函数 xxx_exit() 2,申请设备号 register_chrdev_region (与内核相关) 3,注册字符设备驱动 cdev_alloc.cdev_init. cdev_add (与内核相关) 4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关) 5,硬件部分初始化 io资源映射 ioremap,内核提供gpio库函数 (与硬件相关) 注

信号驱动和异步驱动的区别

5种I/O模型: 1.阻塞I/O 2.非阻塞I/O 3.异步I/O 4.信号驱动I/O 5.I/O复用 信号驱动和异步驱动的区别 信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程. 异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程.IO操作即内核当中的服务例程. 异步I/O和信号驱动I/O的区别很容易被混淆.前者与后者的区

Linux LCD驱动(四)--驱动的实现

目录(?)[-] 基本原理 写 framebuffer 驱动程序要做什么 LCD 模块 驱动程序 控制器 什么是 frame buffer 设备 Linux Frame Buffer 驱动程序层次结构 数据结构 接口 一个 LCD controller 驱动程序 分配系统内存作为显存 实现 fb_ops 结构 基本原理 通过 framebuffer ,应用程序用 mmap 把显存映射到应用程序虚拟地址空间,将要显示的数据写入这个内存空间就可以在屏幕上显示出来: 驱动程序分配系统内存作为显存:实现