第六章读书笔记
第6章
Linux系统将每一个驱动都映射成一个文件,这些文件成为设备文件或驱动文件,都保存在/dev目录下,使得与Linux驱动进行交互就像与普通文件或驱动文件一样容易。
C语言中的回调函数相当于Linux驱动的事件,用来响应应用程序传递过来的数据。
编写一个基本的Linux驱动的一般步骤:
第一步:建立Linux驱动骨架(装载和卸载Linux驱动)
驱动初始化:module_init
驱动退出:module_exit
第二步:注册和注销设备文件
建立设备文件:函数misc_register()
移除设备文件:函数misc_deregister()
第三步:指定与驱动相关的信息
第四步:指定回调函数
一个驱动程序不一定要指定所有的回调函数,回调函数会通过相关机制进行注册,例如:与设备文件相关的回调函数会通过misc_register函数进行注册。
第五步:编写业务逻辑
具体的业务逻辑与驱动的功能有关。业务逻辑可能由多个函数、多个文件甚至是多个Linux驱动模块组成。
第六步:编写Makefile文件
Linux内核源代码的编译规则是通过Makefile文件定义的。编写一个新的Linux驱动程序必须有一个Makefile文件
第七步:编译Linux驱动程序
第八步:安装和卸载Linux驱动
如果将Linux驱动编译进内核,只要Linux使用该内核,驱动程序自动装载,
如果Linux驱动程序以模块单独存在,需要使用insmod或modprobe命令装载Linux驱动模块,使用rmmod命令卸载Linux驱动模块。
Printf函数运行在用户空间,printk函数运行在内核空间,用户空间和内核空间的程序不能直接访问,属于内核程序的Linux驱动是不能直接访问printf函数的,运行在用户空间的程序也不能直接调用printk函数。设备文件是一种主要的交互方式。
开源协议:
GPL协议:“传染性”,开源/免费
LGPL协议:不要求使用/修改/衍生的类库的软件必须采用该协议
BSD协议:可自由使用,修改源代码,鼓励代码共享同时尊重源代码作者著作权
设备文件与普通文件不同,不能使用io函数建立,需要使用misc_register函数建立设备文件,使用misc_deregister函数注销设备文件,定义如下:
Extern int misc_register(struct miscdvice * misc);
Extern int misc_deregister(struct miscdevice *misc);
用户空间的应用程序与内核空间的驱动程序最常用的交互方式是读写设备文件,通过file_operations.read和file_operations.write成员变量可以分别指定读写设备文件要调用的回调函数指针。
在word_count_read和word_count_write函数中分别使用copy_to_user和copy_from_user函数将数据从内核空间复制到用户空间或从用户空间复制到内核空间。
装载驱动时,使用insmod或modprobe命令。modprobe命令可以检查驱动模块的依赖性,再使用该命令前需要先使用depmod命令检测Linux驱动模块的依赖关系。depmod命令必须使用Linux驱动模块(.ko文件)的绝对路径。Modprobe命令只需要使用驱动名称,不需要跟.ko。
http://www.cnblogs.com/875825a/