- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
linux内核部件分析-设备驱动模型之driver
上节我们分析设备驱动模型中的device,主要是drivers/base/core.c,可以说是代码量最大的一个文件。本节要分析的驱动driver,就要相对简单很多。原因也很简单,对于driver,我们能定义的公共部分实在不多,能再sysfs中表达的也很少。本节的分析将围绕drivers/base/driver.c,但头文件仍然是include/linux/device.h和drivers/base/base.h。先让我们来看看driver的结构。[cpp]?view plaincopyprint?struct?device_driver?{??????const?char??????*name;??????struct?bus_type?????*bus;????????struct?module???????*owner;??????const?char??????*mod_name;??/*?used?for?built-in?modules?*/????????bool?suppress_bind_attrs;???/*?disables?bind/unbind?via?sysfs?*/????????int?(*probe)?(struct?device?*dev);??????int?(*remove)?(struct?device?*dev);??????void?(*shutdown)?(struct?device?*dev);??????int?(*suspend)?(struct?device?*dev,?pm_message_t?state);??????int?(*resume)?(struct?device?*dev);??????const?struct?attribute_group?**groups;????????const?struct?dev_pm_ops?*pm;????????struct?driver_private?*p;??};??struct device_driver就是模型定义的通用驱动结构。name是驱动名称,但这个name也只是在静态定义的初始名称,实际使用的名称还是由kobject中保管的。bus执行驱动所在的总线,owner是驱动所在的模块,还有一个所在模块名称mod_name,suppress_bind_attrs定义是否允许驱动通过sysfs决定挂载还是卸载设备。下面是一系列函数指针,probe是在驱动刚与设备挂接时调用的,remove是在设备卸载时调用的,shutdown是在设备关闭时调用的(说实话我现在还不知道remove和shutdown的区别),suspend是设备休眠时调用的,resume是设备恢复时调用的。group是属性集合,pm是电源管理的函数集合,p是指向driver_private的指针。[cpp]?view plaincopyprint?struct?driver_private?{??????struct?kobject?kobj;??????struct?klist?klist_devices;??????struct?klist_node?knode_bus;??????struct?module_kobject?*mkobj;??????struct?device_driver?*driver;??};??#define?to_driver(obj)?container_of(obj,?struct?driver_private,?kobj)??与device类似,device_driver把与其它组件联系的大部分结构变量移到struct driver_private中来。首先是kobj,在sysfs中代表driver目录本身。klist_devices是驱动下的设备链表,knode_bus是要挂载在总线的驱动链表上的节点。mkobj是driver与相关module的联系,之前在device_driver结构中已经有指向module的指针,但这还不够,在/sys下你能发现一个module目录,所以驱动所属的模块在sysfs中也有显示,具体留到代码中再看。driver指针自然是从driver_private指回struct device_driver的。[cpp]?view plaincopyprint?struct?driver_attribute?{??????struct?attribute?attr;??????ssize_t?(*show)(struct?device_driver?*driver,?char?*buf);??????ssize_t?(*store)(struct?device_driver?*driver,
您可能关注的文档
最近下载
- rcwl-9610低成本分体开放式超声波测距芯片.pdf VIP
- (高清版)DB33∕T 2110.5-2018 实验动物 长爪沙鼠 第5部分:配合饲料营养成分.pdf VIP
- 大学物理(山东联盟)智慧树知到期末考试答案章节答案2024年青岛科技大学.docx VIP
- 《个人所得税培训》课件.ppt VIP
- 实验室生物安全管理体系内审表(2011).docx VIP
- 价值流分析.ppt.ppt VIP
- 小学三年级数学应用题大全(夺冠系列).docx VIP
- 一种SGH换热器以及垃圾发电系统.pdf VIP
- 考研英语-常用词组大全4249个.pdf VIP
- 2025年幼儿园基孔肯雅热防控工作方案.docx
文档评论(0)