linux设备模型深探.doc

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux设备模型深探

linux设备模型深探 ------------------------------------------ ------------------------------------------ 一:前言 Linux设备模型是一个极其复杂的结构体系,在编写驱动程序的时候,通常不会用到这方面的东西,但是。理解这部份内容,对于我们理解linux设备驱动的结构是大有裨益的。我们不但可以在编写程序程序的时候知其然,亦知其所以然。又可以学习到一种极其精致的架构设计方法。由于之前已经详细分析了sysfs文件系统。所以本节的讨论主要集中在设备模型的底层实现上。上层的接口,如pci.,usb ,网络设备都可以看成是底层的封装。 二:kobject ,kset和ktype Kobject,kset,kypte这三个结构是设备模型中的下层架构。模型中的每一个元素都对应一个kobject.kset和ktype可以看成是kobject在层次结构与属性结构方面的扩充。将三者之间的关系用图的方示描述如下: ? 如上图所示:我们知道。在sysfs中每一个目录都对应一个kobject.这些kobject都有自己的parent。在没有指定parent的情况下,都会指向它所属的kset-object。其次,kset也内嵌了kobject.这个kobject又可以指它上一级的parent。就这样。构成了一个空间上面的层次关系。 其实,每个对象都有属性。例如,电源管理,执插拨事性管理等等。因为大部份的同类设备都有相同的属性,因此将这个属性隔离开来,存放在ktype中。这样就可以灵活的管理了.记得在分析sysfs的时候。对于sysfs中的普通文件读写操作都是由kobject-ktype-sysfs_ops来完成的. 经过上面的分析,我们大概了解了kobject.kset与ktype的大概架设与相互之间的关系。下面我们从linux源代码中的分析来详细研究他们的操作。 ? 三:kobject,kset和ktype的操作 为了说明kobject的操作,先写一个测试模块,代码如下: #include linux/device.h #include linux/module.h #include linux/kernel.h #include linux/init.h #include linux/string.h #include linux/sysfs.h #include linux/stat.h ? MODULE_AUTHOR(eric xiao); MODULE_LICENSE(Dual BSD/GPL); ? void obj_test_release(struct kobject *kobject); ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf); ssize_t eric_test_store(struct kobject *kobject,struct attribute *attr,const char *buf, size_t count); ? struct attribute test_attr = { ??????? .name = eric_xiao, ??????? .mode = S_IRWXUGO, }; ? static struct attribute *def_attrs[] = { ??????? test_attr, ??????? NULL, }; ? ? struct sysfs_ops obj_test_sysops = { ??????? .show = eric_test_show, ??????? .store = eric_test_store, }; ? struct kobj_type ktype = { ??????? .release = obj_test_release, ??????? .sysfs_ops=obj_test_sysops, ??????? .default_attrs=def_attrs, }; ? void obj_test_release(struct kobject *kobject) { ??????? printk(eric_test: release .\n); } ? ssize_t eric_test_show(struct kobject *kobject, struct attribute *attr,char *buf) { ??????? printk(have show.\n); ??????? printk(attrname:%s.\n,

文档评论(0)

f8r9t5c + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档