分类: LINUX
2015-11-17 16:24:52
原文地址:Linux设备模型学习笔记——结构体描述 作者:chumojing
l kobject是用来管理设备的。包括设备组成的层次结构,引用计数,属性管理。作为一个底层设备模型数据结构,它有自己的操作函数。比如初始化,引用计 数,删除,注册等。不光是kobject,它的上层结 构,kset,subsystem,bus_type,device,device_driver,class,class_driver,class_interface 都有类似的操作函数。当然了,如果你不是特意想知道它们是怎么一回事,不需要去刻意研究的。每个在内核中注册的kobject,在sysfs中呈现的是一 个目录,它的属性则呈现为一个文件。
l kset,它是具有相同类型kobject的集合。kset数据结构中内嵌入了一个kobject,所有属于这个kset的kobject对象的 parent均指向这个内嵌的对象。这是一个层次管理的概念。相当于把树叶(kobject)长在树枝(kset)上。kobject能报告自己的状态: 增加,删除。kset有一个成员,kset_uevent_ops事件操作集指针,可以过滤事件,或给用户空间设置一些事件变量。用户空间程序据此产生相 应的响应。这些应该udev密切相关。
l subsystem是一系列kset的集合,它描述系统中某一类设备子系统。还是一个层次管理的概念。koject是通过指定父对象来找到自己所属的树支 (kset),kset就是通过指定自己的subsys域找到自己的上一级树支(subsystem)。
l linux设备模型的组件:包括 device,device_driver,bus_type,class,calss_device,class_interface
n device,系统中的任一设备在设备模型中都有一个device对象描述,它关联的是一个物理设备。想要描述清楚一个device结构,要指明这位的家 庭环境(兄弟姐妹,孩子,父母啊),总线,使用的驱动等。它也内嵌入了一个kobject,试想,如果你要删除一个设备,那么其内嵌的kobject就会 报告uevent事件,其所属的kset就会设置相应的事件变量,此时用户空间程序就可以做相应的处理。
n device_driver,系统中每一个驱动程序都有一个devive_driver对象描述。它的结构体描述中,指明了要挂载的总线,以及用于处理设 备探测,移除和电源管理的函数。这些函数在bus_type中也有描述,但内核会优先调用bus_type中的方法。需要指出的是 device_driver内嵌有kobject以实现自己的计算和层次管理。
n bus_type,系统总线由struct bus_type描述。每个bus_type都内嵌一个subsystem对象。它用来管理所有总线类型的subsystem对象。因为bus_type 的每个对象对应/sys/bus内的一个子目录,子目录中又有devices和drivers目录,它们对应于bus_type的drivers和 devices域,所以最终,前面所说的每个实际的device和device_driver在/sys目录下,仅仅体现为它们内嵌的kobject所创 建的一个目录和目录内相应的属性与其它文件。
n class,系统中的设备类用struct class描述,表示某一类设备。它也有一个subsystem对象,所有的class对象都属于class_subsys子系统,依次推 理,bus_type中的对象应都属于bus_subsys子系统。class与class_device,class_interface的关系类似于 bus_type与device,device_driver的关系。因为在class对象中要指明它的class_device和 class_interface。class_device表示一个逻辑设备,并通过struct class_device的dev成员关联一个物理设备。这样,一个逻辑设备总是对应于一个物理设备,但是一个物理设备可能对应多个逻辑设备。当设备加入 或离开类时,class_interface中的成员函数被调用。