网站大量收购独家精品文档,联系QQ:2885784924

Linux2-6字符设备驱动笔记[很好].docVIP

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

jdy261842 + 关注
实名认证
文档贡献者

分享好文档!

1亿VIP精品文档

相关文档