kset内核对象集合以及与kobject的关系
kobject
通常通过kset组织层次化的结构,kset是具有相同类型的kobject的集合,在内核中用kset数据结构表示,在内核中源码如下:(同样在lxr.linux.no中查找,版本为2.6.28)与以前版本有不同之处
134/** 135 * struct kset - a set of kobjects of a specific type, belonging to a specific subsystem. 136 * 137 * A kset defines a group of kobjects. They can be individually 138 * different "types" but overall these kobjects all want to be grouped 139 * together and operated on in the same manner. ksets are used to 140 * define the attribute callbacks and other common events that happen to 141 * a kobject. 142 * 143 * @list: the list of all kobjects for this kset 144 * @list_lock: a lock for iterating over the kobjects 145 * @kobj: the embedded kobject for this kset (recursion, isn't it fun...) 146 * @uevent_ops: the set of uevent operations for this kset. These are 147 * called whenever a kobject has something happen to it so that the kset 148 * can add new environment variables, or filter out the uevents if so 149 * desired.*/
151struct kset { 152 struct list_head list; 153 spinlock_t list_lock; 154 struct kobject kobj; 155 struct kset_uevent_ops *uevent_ops; 156};
包含在kset中的所有kobject被组织成一个双向循环链表,struct list_head即为该链表的头。kobj成员是嵌入在此kset中的成员(下关系图会解释)所有属于这个kset的kobject对象的parent均指向这个内嵌的对象。kset还依赖于kobj维护引用计数,kset的引用计数实际就是内嵌的kobject对象引用计数。
Linux提供的一系列的函数操作kset(http://lxr.linux.no/linux+v2.6.28/lib/kobject.c):
668void kset_init(struct kset *k)//完成指定kset的初始化;
709int kset_register(struct kset *k)//完成kset的注册;
728void kset_unregister(struct kset *k)//完成kset的注销;
kset_get()和kset_put()分别增加和减少kset对象的引用计数(http://lxr.linux.no/linux+v2.6.28/include/linux/kobject.h);
kobject被创建或删除时会产生事件,kobject所属的kset将有机会过滤事件或为用户空间添加信息。每个kset能支持一些特定的事件变量,在热插拔事件发生时,kset的成员函数可以设置一些事件变量,这些变量将被导出到用户空间。kset的
uevent_ops成员是执行该kset事件操作集struct kset_uevent_ops 的指针,struct kset_uevent_ops 的定义代码清单:
117struct kset_uevent_ops {
118 int (*filter)(struct kset *kset, struct kobject *kobj);//事件过滤
119 const char *(*name)(struct kset *kset, struct kobject *kobj);
120 int (*uevent)(struct kset *kset, struct kobject *kobj,
121 struct kobj_uevent_env *env);//环境变量设置
122};
filter()函数
(return 0)时用于过滤掉不需要导出到用户空间的事件,(return 1)时将事件事件导出到用户空间用
dmesg指令查看事件反馈的信息。uevent()用于导出一些环境变量给用户的热插拔处理程序。
kset与kobject的关系图如下所示:
改图充分反映了kset与kobject的关系!kobject对应的目录下只能是文件,而kset对应的目录下都是目录。