Linux设备模型之底层模型(上).pdf
《Linux设备模型之底层模型(上).pdf》由会员分享,可在线阅读,更多相关《Linux设备模型之底层模型(上).pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、努力成为linux kernel hacker 的人李万鹏原创作品,转载请标明出处http:/ 2.6.29.1 的。建立设备模型主要为了管理方便。最初引入设备模型是为了电源管理。建立一个全局的设备树(device tree),当系统进入休眠时,系统可以通过这棵树找到所有的设备,随时让他们挂起(suspend)或者唤醒(resume)。2.6 版内核提供的功能:电源管理和系统关机 完成这些工作需要对一些系统结构的理解。比如一个USB 宿主适配器,在处理完所有与其连接的设备前是不能被关闭的。设备模型使得操作系统能够以正确的顺序遍历硬件。与用户空间通信 sysfs 虚拟文件系统的实现与设备模型密切
2、相关,并且向外界展示了它所表示的结构。向用户空间所提供的系统信息,以及改变操作参数的接口,将越来越多的通过 sysfs 实现,也就是说通过设备模型实现。热插拔设备 内核中的热插拔机制可以处理热插拔设备,特别是能够与用户空间进行关于热插拔设备的通信,而这种机制也是通过热插拔管理的。设备类型 把设备分门别类有助于设备的管理与使用。比如要找USB 鼠标,只要去classes/input/里去找就可以了,而不必关心这个鼠标是接到哪个USB 主机控制器的哪个 Hub 的第几个端口上。对象生命周期 得有一个好的机制来实现设备生命周期的管理。比如把USB 鼠标拔了之后,全局设备树和 sysfs 里面得相应去
3、掉。设备底层模型:Linux 设备模型的底层是数据结构kobject,内核用kobject 结构将各个对象连接起来组成一个分层的结构体系,从而与模块化的子系统相匹配。一个 kset是嵌入相同类型结构的 kobject 集合。kset 和他的 kobject 的关系与下图类似,请记住:在图中所有被包含的kobject,实际上是被嵌入到其他类型中的,甚至可能是其他的 kset。一个kobject 的父节点不一定是包含它的kset。Object 1Object 2Object 3Object 4Object 5Object 6Object 7Object 8Object 9Object 10Obje
4、ct 11Object 12Object 13Object 14Object 15Object 16Object 17Object 18Object 19Object 20Object 21Object 22Object 23Object 24Object 25Object 26Object 27Object 28Object 29Object 30Object 31Object 32Object 33Object 34Object 35Object 36Object 37Object 38Object 39Object 40Object 41Object 42Object 43Object
5、44Object 45Object 46Object 47Object 48Object 49Object 50Object 51Object 52Object 53Object 54Object 55Object 56Object 57Object 58Object 59Object 60Object 61Object 62Object 63Object 64Object 65Object 66Object 67Object 68Object 69Object 70Object 71Object 72Object 73Object 74Object 75Object 76Object 77O
6、bject 78Object 79Object 80Object 81Object 82Object 83Object 84Object 85Object 86Object 87Object 88Object 89Object 90Object 91Object 92Object 93Object 94Object 95Object 96Object 97Object 98Object 99Object 100Object 101Object 102Object 103Object 104Object 105Object 106Object 107Object 108Object 109Obj
7、ect 110Object 111Object 112Object 113Object 114Object 115Object 116Object 117Object 118Object 119Object 120Object 121Object 122Object 123Object 124Object 125Object 126Object 127Object 128Object 129Object 130Object 131Object 132Object 133Object 134Object 135Object 136Object 137Object 138Object 139Obj
8、ect 140Object 141Object 142Object 143Object 144Object 145Object 146Kobject 是组成设备模型的基本结构,最初他只是被理解为一个简单的引用计数,但是随着时间的推移,他的任务越来越多,因此也有了许多成员,他的结构体如下:1.struct kobject 2.const char *name;3.struct list_head entry;/挂接到所在kset 中去的单元 4.struct kobject *parent;/指向父对象的指针 5.struct kset *kset;/所属 kset的指针 6.struct ko
9、bj_type *ktype;/指向其对象类型描述符的指针 7.struct sysfs_dirent*sd;/sysfs 文件系统中与该对象对应的目录实体的指针 8.struct kref kref;9.unsigned int state_initialized:1;10.unsigned int state_in_sysfs:1;11.unsigned int state_add_uevent_sent:1;12.unsigned int state_remove_uevent_sent:1;13.unsigned int uevent_suppress:1;14.;name 指向设备的
10、名字,entry,parent,kset 就是用来形成树状结构的指针。Kobj_type*type 用来表示该 kobject 的类型,struct sysfs_dirent 类型的指针指向了该kobject 在 sysfs 中的目录实体,sysfs 中每一个dentry 都会对应一个sysfs_dirent 结构。每个在内核中注册的 kobject 对象都对应于 sysfs 文件系统中的一个目录。/sys 是专为 Linux 设备模型建立的,kobject 是帮助建立/sys 文件系统的。每当我们新增一个 kobject 结构时,同时会在/sys 下创建一个目录。这里隐藏了如下程序调用流程:
11、kobject_add()-kobject_add_varg()-kobject_add_internal()-create_dir()-sysfs_new_dirent()。在sysfs_new_dirent()函数中通过 slab 分配了一个dirent(至于什么是 dirent 会在中讲解),并返回给一个指向这个dirent 的指针sd 给 create_dir(),在 create_dir()函数中有这么一句:sd-s_dir.kobj=kobj;也就是让 dirent 的一个成员的域指向了他所对应的kobject,kobject 中 struct sysfs_dirent *sd;又
12、指向了dirent,所以kobject 与sysfs 死死的拥抱在一起,为了幸福的明天。在kobject_del()函数中会调用sysfs_remove_dir(),sysfs_remove_dir()中有这么一句:kobj-sd=NULL;表示kobject 与 sysfs_dirent 的婚姻破裂了。kobject 的接口函数:1.void kobject_init(struct kobject*kobj);kobject 初始化函数,设置 kobject 引用计数为 1。1.int kobject_set_name(struct kobject*kobj,const char*forma
13、t,);设置kobject 的名字。1.struct kobject*kobject_get(struct kobject*kobj);2.struct kobject*kobject_put(struct kobject*kobj);减少和增加 kobject 的引用计数。1.extern int _must_check kobject_init_and_add(struct kobject*kobj,2.struct kobj_type*ktype,3.struct kobject*parent,4.const char*fmt,.);kobject 注册函数,该函数只是 kobjec_i
14、nit 和kobject_add_varg 的简单组合。旧内核称为1.extern int kobject_register(struct kobject*kobj);1.void kobject_del(struct kobject*kobj);从Linux 设备层次中(hierarchy)中删除 kobj 对象。1.struct kset 2.struct list_head list;/用于连接该 kset 中所有kobject的链表头 3.spinlock_t list_lock;/用于互斥访问 4.struct kobject kobj;/嵌入的kobject 5.struct ks
15、et_uevent_ops*uevent_ops;6.;包含在kset 中的所有kobject 被组织成一个双向循环链表,list 真是该链表的链表头。kset 数据结构还内嵌了一个 kobject 对象(由 kobj 表示),所有属于这个kset 的 kobject 对象的parent 域均指向这个内嵌的对象。此外,kset 还依赖于kobj 维护引用计数:kset 的引用计数实际上就是内嵌的kobject 对象的引用计数。1.struct kobj_type 2.void(*release)(struct kobject*kobj);3.const struct sysfs_ops*sys
16、fs_ops;4.struct attribute*default_attrs;5.const struct kobj_ns_type_operations*(*child_ns_type)(struct kobject*kobj);6.const void*(*namespace)(struct kobject*kobj);7.;释放kobject 使用 release 函数,release 函数并没有包含在kobject 自身内,他包含在与kobject 相关联的 kobj_type 中。sysfs_ops 是指向如何读写的函数的指针。1.struct sysfs_ops 2.ssize_
17、t(*show)(struct kobject*,struct attribute*,char*);3.ssize_t(*store)(struct kobject*,struct attribute*,const char*,size_t);4.;show 相当于 read,store 相当于 write。struct attribute*default_attrs;是属性数组。在sysfs 中,kobject 对应目录,kobject 的属性对应这个目录下的文件。调用show 和 store 函数来读写文件,就可以得到属性中的内容。一个热插拔事件是从内核空间发送到用户空间的通知。它表明系统
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 设备 模型 底层
限制150内