




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
发表文章 Linux 2.6内核的设备模型(sys)2006-08-1711:01:35大中小找到一个中文版的,也贴上来。Linux2.6内核的一个重要特色是提供了统一的内核设备模型。随着技术的不断进步,系统的拓扑结构越来越复杂,对智能电源管理、热插拔以及plugandplay的支持要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,2.6内核开发了全新的设备模型。 Sysfs文件系统Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其顶层目录主要有:Block目录:包含所有的块设备Devices目录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构Bus目录:包含系统中所有的总线类型Drivers目录:包括内核中所有已注册的设备驱动程序Class目录:系统中的设备类型(如网卡设备,声卡设备等) 内核对象机制关键数据结构2.1kobject内核对象Kobject是Linux2.6引入的新的设备管理机制,在内核中由structkobject表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject结构定义为:structkobjectchar *k_name;指向设备名称的指针char nameKOBJ_NAME_LEN;设备名称structkref kref;对象引用计数structlist_head entry;挂接到所在kset中去的单元structkobject *parent;指向父对象的指针structkset *kset;所属kset的指针structkobj_type *ktype;指向其对象类型描述符的指针structdentry *dentry;sysfs文件系统中与该对象对应的文件节点路径指针;其中的kref域表示该对象引用的计数,内核通过kref实现对象引用计数管理,内核提供两个函数kobject_get()、kobject_put()分别用于增加和减少引用计数,当引用计数为0时,所有该对象使用的资源将被释放。Ktype域是一个指向kobj_type结构的指针,表示该对象的类型。Kobj_type数据结构包含三个域:一个release方法用于释放kobject占用的资源;一个sysfs_ops指针指向sysfs操作表和一个sysfs文件系统缺省属性列表。Sysfs操作表包括两个函数store()和show()。当用户态读取属性时,show()函数被调用,该函数编码指定属性值存入buffer中返回给用户态;而store()函数用于存储用户态传入的属性值。2.2kset内核对象集合Kobject通常通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合,在内核中用kset数据结构表示,定义为:structksetstructsubsystem *subsys;所在的subsystem的指针structkobj_type *ktype;指向该kset对象类型描述符的指针structlist_head list;用于连接该kset中所有kobject的链表头structkobject kobj;嵌入的kobjectstructkset_hotplug_ops *hotplug_ops;指向热插拔操作表的指针;包含在kset中的所有kobject被组织成一个双向循环链表,list域正是该链表的头。Ktype域指向一个kobj_type结构,被该kset中的所有kobject共享,表示这些对象的类型。Kset数据结构还内嵌了一个kobject对象(由kobj域表示),所有属于这个kset的kobject对象的parent域均指向这个内嵌的对象。此外,kset还依赖于kobj维护引用计数:kset的引用计数实际上就是内嵌的kobject对象的引用计数。2.3 subsystem内核对象子系统Subsystem是一系列kset的集合,描述系统中某一类设备子系统,如block_subsys表示所有的块设备,对应于sysfs文件系统中的block目录。类似的,devices_subsys对应于sysfs中的devices目录,描述系统中所有的设备。Subsystem由structsubsystem数据结构描述,定义为:structsubsystemstructkset kset;内嵌的kset对象structrw_semaphore rwsem;互斥访问信号量;每个kset必须属于某个subsystem,通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量,用于同步访问kset中的链表。 内核对象机制主要相关函数针对内核对象不同层次的数据结构,linux2.6内核定义了一系列操作函数,定义于lib/kobject.c文件中。3.1kobject相关函数voidkobject_init(structkobject*kobj);kobject初始化函数。设置kobject引用计数为,entry域指向自身,其所属kset引用计数加。intkobject_set_name(structkobject*kobj,constchar*format,.);设置指定kobject的名称。voidkobject_cleanup(structkobject*kobj)和voidkobject_release(structkref*kref);kobject清除函数。当其引用计数为时,释放对象占用的资源。structkobject*kobject_get(structkobject*kobj);将kobj对象的引用计数加1,同时返回该对象的指针。voidkobject_put(structkobject*kobj);将kobj对象的引用计数减1,如果引用计数降为0,则调用kobject_release()释放该kobject对象。intkobject_add(structkobject*kobj);将kobj对象加入Linux设备层次。挂接该kobject对象到kset的list链中,增加父目录各级kobject的引用计数,在其parent指向的目录下创建文件节点,并启动该类型内核对象的hotplug函数。intkobject_register(structkobject*kobj);kobject注册函数。通过调用kobject_init()初始化kobj,再调用kobject_add()完成该内核对象的注册。voidkobject_del(structkobject*kobj);从Linux设备层次(hierarchy)中删除kobj对象。voidkobject_unregister(structkobject*kobj);kobject注销函数。与kobject_register()相反,它首先调用kobject_del从设备层次中删除该对象,再调用kobject_put()减少该对象的引用计数,如果引用计数降为0,则释放该kobject对象。3.2kset相关函数与kobject相似,kset_init()完成指定kset的初始化,kset_get()和kset_put()分别增加和减少kset对象的引用计数。Kset_add()和kset_del()函数分别实现将指定keset对象加入设备层次和从其中删除;kset_register()函数完成kset的注册而kset_unregister()函数则完成kset的注销。3.3subsystem相关函数subsystem有一组完成类似的函数,分别是:voidsubsystem_init(structsubsystem*subsys);intsubsystem_register(structsubsystem*subsys);voidsubsystem_unregister(structsubsystem*subsys);structsubsystem*subsys_get(structsubsystem*subsys)voidsubsys_put(structsubsystem*subsys); 设备模型组件在上述内核对象机制的基础上,Linux的设备模型建立在几个关键组件的基础上,下面我们详细阐述这些组件。4.1devices系统中的任一设备在设备模型中都由一个device对象描述,其对应的数据结构structdevice定义为:structdevicestructlist_headg_list;structlist_headnode;structlist_headbus_list;structlist_headdriver_list;structlist_headchildren;structdevice*parent;structkobjectkobj;charbus_idBUS_ID_SIZE;structbus_type*bus;structdevice_driver*driver;void*driver_data;/*Severalfieldsomitted*/;g_list将该device对象挂接到全局设备链表中,所有的device对象都包含在devices_subsys中,并组织成层次结构。Node域将该对象挂接到其兄弟对象的链表中,而bus_list则用于将连接到相同总线上的设备组织成链表,driver_list则将同一驱动程序管理的所有设备组织为链表。此外,children域指向该device对象子对象链表头,parent域则指向父对象。Device对象还内嵌一个kobject对象,用于引用计数管理并通过它实现设备层次结构。Driver域指向管理该设备的驱动程序对象,而driver_data则是提供给驱动程序的数据。Bus域描述设备所连接的总线类型。内核提供了相应的函数用于操作device对象。其中Device_register()函数将一个新的device对象插入设备模型,并自动在/sys/devices下创建一个对应的目录。Device_unregister()完成相反的操作,注销设备对象。Get_device()和put_device()分别增加与减少设备对象的引用计数。通常device结构不单独使用,而是包含在更大的结构中作为一个子结构使用,比如描述PCI设备的structpci_dev,其中的dev域就是一个device对象。4.2drivers系统中的每个驱动程序由一个device_driver对象描述,对应的数据结构定义为:structdevice_driverchar*name;设备驱动程序的名称structbus_type*bus;该驱动所管理的设备挂接的总线类型structkobjectkobj;内嵌kobject对象structlist_headdevices;该驱动所管理的设备链表头int(*probe)(structdevice*dev);指向设备探测函数,用于探测设备是否可以被该驱动程序管理int(*remove)(structdevice*dev);用于删除设备的函数/*somefieldsomitted*/;与device结构类似,device_driver对象依靠内嵌的kobject对象实现引用计数管理和层次结构组织。内核提供类似的函数用于操作device_driver对象,如get_driver()增加引用计数,driver_register()用于向设备模型插入新的driver对象,同时在sysfs文件系统中创建对应的目录。Device_driver()结构还包括几个函数,用于处理热拔插、即插即用和电源管理事件。4.3buses系统中总线由structbus_type描述,定义为:structbus_typechar *name; 总线类型的名称structsubsystem subsys;与该总线相关的subsystemstructkset drivers;所有与该总线相关的驱动程序集合structkset devices;所有挂接在该总线上的设备集合structbus_attribute *bus_attrs;总线属性structdevice_attribute *dev_attrs;设备属性structdriver_attribute *drv_attrs;驱动程序属性int (*match)(structdevice*dev,structdevice_driver*drv);int (*hotplug)(structdevice*dev,char*envp,intnum_envp,char*buffer,intbuffer_size);int (*suspend)(structdevice*dev,u32state);int (*resume)(structdevice*dev);;每个bus_type对象都内嵌一个subsystem对象,bus_subsys对象管理系统中所有总线类型的subsystem对象。每个bus_type对象都对应/sys/bus目录下的一个子目录,如PCI总线类型对应于/sys/bus/pci。在每个这样的目录下都存在两个子目录:devices和drivers(分别对应于bus_type结构中的devices和drivers域)。其中devic
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆传媒职业学院《马克思主义经典原著选读》2024-2025学年第一学期期末试卷
- 沈阳大学《车载信息处理》2024-2025学年第一学期期末试卷
- 过敏科普及护理
- (2025年标准)城管审批安全协议书
- 宜春学院《经济林栽培学》2024-2025学年第一学期期末试卷
- 成都体育学院《食品工艺学导论》2024-2025学年第一学期期末试卷
- 平凉职业技术学院《采矿工程学科发展动态》2024-2025学年第一学期期末试卷
- (2025年标准)承包事故赔偿协议书
- 浙江药科职业大学《色彩静物及人物头像》2024-2025学年第一学期期末试卷
- (2025年标准)承办冷餐酒会协议书
- 外科术后康复
- 2025年全国工会系统经审业务技能大赛知识总题库(1800题)-中部分
- 口腔科主任述职报告
- 心脏骤停的急救及处理
- 狂犬处置门诊管理制度
- 营养科专案管理制度
- 达州国企考试试题及答案
- 2025四川省人力资源和社会保障厅制劳动合同书
- 纳米复合高分子膜材料企业制定与实施新质生产力项目商业计划书
- 2025-2030年海洋环境监测行业市场发展分析及发展前景与投资机会研究报告
- 浙江花园营养科技有限公司 年产750吨饲料级VD3油剂项目环评报告
评论
0/150
提交评论