linux设备驱动程式

linux设备驱动程式

ID:15004283

大小:57.50 KB

页数:10页

时间:2018-07-31

linux设备驱动程式_第1页
linux设备驱动程式_第2页
linux设备驱动程式_第3页
linux设备驱动程式_第4页
linux设备驱动程式_第5页
资源描述:

《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中分

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。