2014年5月12日Kobject 、Kset 和 Subsy stem - 海王 - 博客园http://www.doczj.com/doc/93b5b6113b3567ec112d8a49.html/leav en/archiv e/2010/04/24/1719191.html 4/8件(2)4. Linux input 子系统 io 控制字段(2)
5. linux 内核定时器 tim er_list 详解(2) (2)把kobject 的 kset 成员指向目标kset 。
(3)将kobject 传递给下面的函数:int kobject_add(struct kobject *kobj); /*函数可能失败(返回一个负错误码),程序应作出相应地反应*/
内核提供了一个组合函数:
extern int kobject_register(struct kobject *kobj); /*仅仅是一个
kobject_init 和 kobject_add 的结合,其他成员的初始化必须在之前手动完成*/
当把一个kobject 从kset 中删除以清除引用时使用:
void kobject_del(struct kobject *kobj); /*是 kobject_del 和kobject_put 的结合*/
kset 在一个标准的内核链表中保存了它的子节点,在大部分情况下, 被包含的 kobjects 在它们的 parent 成员中保存指向 kset 内嵌的 kobject 的指
针,关系如下:
图表中的所有的被包含的 kobjects 实际上被嵌入在一些其他类型中, 甚至可能其他的 kset 。
kset 上的操作
ksets 有类似于kobjects 初始化和设置接口:
void kset_init(struct kset *kset);
int kset_add(struct kset *kset);
int kset_register(struct kset *kset);
void kset_unregister(struct kset *kset);
/*管理 ksets 的引用计数:*/
struct kset *kset_get(struct kset *kset);
void kset_put(struct kset *kset);
/* kset 也有一个名字,存储于嵌入的 kobject,因此设置它的名字用:*/kobject_set_nam e(&m y_set->kobj, "The nam e");
ksets 还有一个指针指向 kobj_type 结构来描述它包含的 kobject ,这个类型优先于 kobject 自身中的 ktype 。因此在典型的应用中, 在 struct
kobject 中的 ktype 成员被设为 NULL, 而 kset 中的ktype 是实际被使用的。
在新的内核里, kset 不再包含一个子系统指针struct subsystem *subsys , 而且subsystem 已经被kset 取代。
子系统
子系统是对整个内核中一些高级部分的表述。子系统通常(但不一定)出现在sysfs 分层结构中的顶层,内核子系统包括 block_subsys(/sys/block 块设备)、 devices_subsys(/sys/devices 核心设备层)以及内核已知的用于各种总线的特定子系统。
对于新的内核已经不再有subsystem 数据结构了,用kset 代替了。每个 kset 必须属于一个子系统,子系统成员帮助内核在分层结构中定位 kset 。 /*子系统通常用以下的宏声明:*/
decl_subsys(nam e, struct kobj_type *type, struct
kset_uevent_ops * uevent_ops);
/*子系统的操作函数:*/