欢迎来到天天文库
浏览记录
ID:15004283
大小:57.50 KB
页数:10页
时间:2018-07-31
《linux设备驱动程式》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Linux设备驱动程式之读书笔记第三章字符设备驱动程式○、说明笔记适用于Linux的2.6.10以后的内核。笔记以LinuxDeviceDriver3提供的scull程式(scull目录中的main.c和scull.h)为记录主线,并以该驱动程式中的各种系统调用和函数调用流程为记录顺序。比如,module_init()和module_exit()为相对应的一对系统调用,一般书籍中都会放在一起讨论,不过本笔记却不会这样,而是在需要调用的时候才会涉及,因此module_init()会放在笔记开始时,也就是刚
2、加载module时讨论,而module_exit()则会放在笔记结束前,也就是要卸载module时再加以讨论。该笔记的的目的是为了对LinuxDeviceDrvier3中提到的各个知识点作一下整理,理清一下头绪,从而能让我对Linux驱动程式加深整体或全局上的理解。注:个人理解,有误难免!*******************************************驱动程式module的工作流程主要分为四个部分:1、用Linux提供的命令加载驱动module2、驱动module的初始化(初始化结
3、束后即进入“潜伏”状态,直到有系统调用)3、当操作设备时,即有系统调用时,调用驱动module提供的各个服务函数4、卸载驱动module一、驱动程式的加载Linux驱动程式分为两种形式:一种是直接编译进内核,另一种是编译成module形式,然后在需要该驱动module时手动加载。对于前者,更有待学习。Module形式的驱动,Linux提供了两个命令用来加载:modprobe和insmod。其中modprobe能解决驱动module的依赖性,即如果正加载的驱动module若引用了其他module提供的内核
4、符号或其他资源,则modprobe就会自动加载那些module,不过,使用modprobe时,必须把要加载的驱动module放在当前模块搜索路径中。而insmod命令不会考虑驱动module的依赖性,不过他却能加载任意目录下的驱动module。一般来说,在驱动研发阶段,使用/sbin/insmod比较方便,因为不用将module放入当前module搜索路径中。一旦使用insmod加载模块,则Linux内核就会调用module_init(scull_init_module)特别宏,其中scull_init
5、_module是驱动初始化函数,可自定义名称。在用insmod加载module时,还能给module提供模块参数,不过这需要在驱动原始码中加入几条语句,让模块参数对insmod和驱动程式可见,如:staticchar*whom=”world”;staticinthowmany=10;module_param(howmany,int,S_IRUGO);module_param(whom,charp,S_IRUGO);这样,当使用/sbin/insmodscull.kowhom=”string”howman
6、y=20这样的命令加载驱动时,whom和howmay的值就会传入scull驱动模块了。驱动程式module被加载后,若对设备进行操作(如open,read,write等),驱动module就会调用相应的函数响应该操作。那么,当对设备进行操作时,驱动module又怎么知道是自己应该有所响应,而不是其他的驱动module呢,也就是说,Linux内核怎么知道应该调用哪一个驱动module呢?目前我只知道有两种方式将设备和驱动module联系在一起(也许应该说提供访问设备的一种途径比较恰当):其一是通过某些设备
7、的ID(比如PCI设备和USB设备的DeviceID和ProductID),Linux内核根据这些ID调用驱动module;其二是在/dev目录下根据设备的主次设备号创建对应的设备节点(即设备文件),这样当操作/dev目录下的设备文件时,就会调用相应的驱动module。一、驱动module的初始化使用insmod加载驱动module时,需要让驱动module为设备做一些初始化动作,主要目的是让Linux内核知道这个设备(或说module?),及在以后对该设备进行操作(如open,read,write等等
8、)时,让Linux内核知道,本module拥有哪些函数能服务于系统调用。因此,scull_init_module函数中主要做了以下几件事情:a)分配并注册主设备号和次设备号b)初始化代表设备的struct结构体:scull_devc)初始化互斥体init_MUTEX(本笔记不整理)d)初始化在内核中代表设备的cdev结构体,最主要是将该设备和file_operations结构体联系起来。1、分配并注册主次设备号设备号是在驱动module中分
此文档下载收益归作者所有