kobject 和 kset 本来就是相辅相成的,由于 kobject 只能创建一个目录,不能创建包含目录的目录,这里就要用到 kset!
仔细观察 kobject 和 kset 结构中,在 kobject 结构中,有一个 struct kset *kset; 的结构声明,在 kset 结构中(马上就会写出来),有一个 struct kobject kobj;的结构声明,很明显它们是互相配合的喽!!
内核对象集合用结构 kset 描述,内核对象集合是一组内核对象。在面向对象的概念中,kset 是类的顶层容器。内核对象集合并不局限于是同一类内核对象的集合,但如果不是同一类型对象,则应小心使用。
kset 是一个含有一组内核对象的口袋。例如:内核用 kset 跟踪所有的块设备或所有的 PCI 设备驱动程序。一个 kset 是文件系统 sysfs 中的一个子目录,kset 容纳的所有 kobject 在此目录中。每个 kset 含有一个 kobject,可被用来建立为 kset 所容纳的 kobject 的父对象。kset 能支持 kobject 的热插拔,并影响着 uevent 事件如何向用户空间报告。
内核对象集和中的所有内核对象具有相同的时间操作特性,共用一个时间操作函数集。
1、kset 结构:
struct kset{ struct list_head list; /* kset 中所有 kobject 的链表 */ spinlock_t list_lock; /* 访问链表成员的锁 */ struct kobject kobj; /* 内嵌kobject,通常是 kset 中所有 kobject 的父对象 */ struct kset_uevent_ops *uevent_ops; /* kset 的 uevent时间操作函数集 */};
kset 通过操作函数集结构 kset_uevent_ops 控制 kobject 的 uevent 操作,结构 kset_uevent_ops 如下:
struct kset_uevent_ops{ /* 阻止指定的 kobject 发送 uevent 时间到用户空间。函数返回为 0,将不发送 uevent */ int (*filter)(struct kset *kset,struct kobject *kobj); /* 重载 uevent 发送到用户空间的 kset 缺省名。发送的缺省名就是 kset 本身的名称 */ const char *(*name)(struct *kset,struct kobject *kobj); /* 发送 uevent 时间到用户空间,以便允许更多的环境变量加到 uevent */ int (*uevent)(struct kset *kset,struct kobject *kobj,struct kobj_uevent_env *env); }
2、kset 方法函数
void kset_init(struct kset *kset); /* 初始化 kset,未导出标号 */int kset_register(struct kset *kset); /* 注册 kset */struct kset *kset_creat_and_add(const char *name,struct kset_uevent_ops *u,struct kobject *parent); /* 创建并注册 kset */void kset_unregister(struct kset *kset); /* 使用完成 kset 后,销毁 kset */
获致幸福的不二法门是珍视你所拥有的遗忘你所没有的