- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux2-6字符设备驱动笔记[很好]
Linux 2.6 字符设备驱动程序 *笔记
○、说明
笔记适用于Linux的2.6.10以后的内核。
笔记以Linux Device
Driver3提供的scull程序(scull目录中的main.c和scull.h)为记录主线,并以该驱动程序中的各种系统调用和函数调用流程为记
录顺序。比如,module_init( )和module_exit()为相对应的一对系统调用,一般书籍中都会放在一起讨论,但是本笔记却不会这样,而是在需要调用的时候才会涉及,因此module_init()会放在笔记开始时,也就是刚加载module时讨论,而module_exit( )则会放在笔记结束前,也就是要卸载module时再加以讨论。该笔记的的目的是为了对Linux Device Drvier3中提到的各个知识点作一下整理,理清一下头绪,从而能让我对Linux驱动程序加深整体或者全局上的理解。
注:个人理解,有误难免!
*******************************************
驱动程序module的工作流程主要分为四个部分:
1、 用Linux提供的命令加载驱动module
2、 驱动module的初始化(初始化结束后即进入“潜伏”状态,直到有系统调用)
3、 当操作设备时,即有系统调用时,调用驱动module提供的各个服务函数
4、 卸载驱动module
一、 驱动程序的加载
Linux驱动程序分为两种形式:一种是直接编译进内核,另一种是编译成module形式,然后在需要该驱动module时手动加载。对于前者,还有待学习。
Module形式的驱动,Linux提供了两个命令用来加载:modprobe和insmod。
其中modprobe可以解决驱动module的依赖性,即假如正加载的驱动module若引用了其他module提供的内核符号或者其他资源,则
modprobe就会自动加载那些module,不过,使用modprobe时,必须把要加载的驱动module放在当前模块有哪些信誉好的足球投注网站路径中。而insmod
命令不会考虑驱动module的依赖性,但是它却可以加载任意目录下的驱动module。
一般来说,在驱动开发阶段,使用/sbin/insmod比较方便,因为不用将module放入当前module有哪些信誉好的足球投注网站路径中。
一旦使用insmod加载模块,则Linux内核就会调用module_init(scull_init_module)特殊宏,其中scull_init_module是驱动初始化函数,可自定义名称。
在用insmod加载module时,还可以给module提供模块参数,但是这需要在驱动源代码中加入几条语句,让模块参数对insmod和驱动程序可见,如:
static char *whom=”world”;
static int howmany=10;
module_param(howmany,int,S_IRUGO);
module_param(whom,charp,S_IRUGO);
这样,当使用/sbin/insmod scull.ko whom=”string” howmany=20这样的命令加载驱动时,whom和howmay的值就会传入scull驱动模块了。
驱动程序module被加载后,若对设备进行操作(如open,read,write等),驱动module就会调用相应的函数响应该操作。
那么,当对设备进行操作时,驱动module又怎么知道是自己应该有所响应,而不是其他的驱动module呢,也就是说,Linux内核怎么知道应该调用哪一个驱动module呢?
目前我只知道有两种方式将设备与驱动module联系在一起(也许应该说提供访问设备的一种途径比较恰当):其一是通过某些设备的ID(比如PCI设备和
USB设备的Device ID和ProductID),Linux内核根据这些ID调用驱动module;其二是在/dev目录下根据设备的主次设备号创建对应的设备节点(即设备文件),这样当操作
/dev目录下的设备文件时,就会调用相应的驱动module。
二、 驱动module的初始化
使用insmod加载驱动module时,需要让驱动module为设备做一些初
始化动作,主要目的是让Linux内核知道这个设备(或者说module?),以及在以后对该设备进行操作(如open,read,write等等)时,
让Linux内核知道,本module拥有哪些函数可以服务于系统调用。
因此,scull_init_module函数中主要做了以下几件事情:
a) 分配并注册主设备号和次设备号
b) 初始化代表设备的struct结构体:scull_dev
c) 初始化互斥体init_MUTEX(本笔记不整理)
d) 初始化在内核中代表
文档评论(0)