【Tiny6410 And Linux】—(1.2)—kset——原理

来源:互联网 发布:行业研究报告 知乎 编辑:程序博客网 时间:2024/05/02 05:07

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 */


 

原创粉丝点击