kset最重要的是建立上层(sub-system)和下层的(kobject)的关联性。kobject 也会利用它了分辨自已是属于那一個类型,然後在/sys 下建立正确的目录位置。而kset 的优先权比较高,kobject会利用自已的*kset 找到自已所属的kset,并把*ktype 指定成該kset下的ktype,除非沒有定义kset,才会用ktype來建立关系。Kobject通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合,在内核中用kset数据结构表示,定义为:
点击(此处)折叠或打开
-
struct kset
-
{
-
struct subsystem * subsys; //所在的subsystem的指针
-
struct kobj type * ktype; //指向该kset对象类型描述符的指针
-
struct list head list; //用于连接该kset中所有kobject的链表头
-
struct kobject kobj; //嵌入的kobject
-
struct kset hotplug ops * hotplug ops; //指向热插拔操作表的指针
- };
包含在kset中的所有kobject被组织成一个双向循环链表,list域正是该链表的头。Ktype域指向一个kobj type结构,被该kset中的所有kobject共享,表示这些对象的类型。Kset数据结构还内嵌了一个kobject对象(由kobj域表示),所有属于这个kset 的kobject对象的parent域均指向这个内嵌的对象。此外,kset还依赖于kobj维护引用计数:kset的引用计数实际上就是内嵌的kobject对象的引用计数。
见图1,kset与kobject的关系图
点击(此处)折叠或打开
-
相关函数与kobject 相似,
-
kset_init() //完成指定kset的初始化,
-
kset_get()和kset_put() //分别增加和减少kset对象的引用计数。
-
Kset_add()和kset_del() //函数分别实现将指定keset对象加入设备层次和从其中删除;
-
kset_register() //函数完成kset的注册而
- kset_unregister() //函数则完成kset的注销。
