Linux驱动学习笔记(二)--kset内核对象集合

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对应的目录下都是目录。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值