linux/Documentation/kobject.txt的翻译

来源:互联网 发布:matlab 矩阵逻辑运算 编辑:程序博客网 时间:2024/05/17 23:05

               linux/Documentation/kobject.txt的翻译


1.初始化kobjects

1.1      要初始化一个kobject,则调用函数kobject_init():
 void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
ktype 要求kobject必须先创建后,因为每一个kobject必须关联一个kobj_type.当调用kobject_init()后,注册一个kobject到sysfs中需要调用kobject_add():

int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...);

这步会设置kobject的parent 和命名kobject。如果一个kobject关联一个指定的kset,kobj->kset必须在kobject_add()之前赋值。如果一个kset关联一个kobject,那么这个kobject的

parent就可以设置为NULL,然后这个kobject的parent就是kset

1.2      如果要获取kobject的name可以调用kobject_name():

const char *kobject_name(const struct kobject * kobj);
1.3      也有一个便捷的函数可以一步完成初始化和注册kobject_init_and_add():
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype,                             struct kobject *parent, const char *fmt, ...);

2.Uevents

当一个kobject被注册到kobject系统中,你必须向上层宣告这个kobject已经被注册了,这个时候就要调用kobject_uevent():

int kobject_uevent(struct kobject *kobj, enum kobject_action action);

使用KOBJ_ADD action来表示一个kobject第一次注册到Kernel中。这个必须在所有属性和子kobject都初始化完成后才调用。

当kobject移除kernel的时候,KOBJ_REMOVE 的uevent会自动被kobject系统创建。所以我们不必手动的去做。

3.引用计数

kobject的其中一项功能就是充当引用计数器,增加和减少引用计数分别是

struct kobject *kobject_get(struct kobject *kobj);void kobject_put(struct kobject *kobj);

kobject_get的成功调用会增加一个引用计数,而且返回指向kobject的指针


4.ktypes和release 方法

一旦你用kobject_add()注册一个kobject,你必须用kobject_put()来释放对象。

一般在release方法中释放kobject如例子:

void my_object_release(struct kobject *kobj)    {            struct my_object *mine = container_of(kobj, struct my_object, kobj);            /* Perform any additional cleanup on this object, then... */            kfree(mine);    }

一个重要点就是:每一个kobject都必须有一个release()方法。而且kobject将一直存在直到调用release方法。

有趣的是release()方法不是在kobject中,而是在ktype中,下面介绍kobj_type:

struct kobj_type {            void (*release)(struct kobject *kobj);            const struct sysfs_ops *sysfs_ops;            struct attribute **default_attrs;            const struct kobj_ns_type_operations *(*child_ns_type)(struct kobject *kobj);            const void *(*namespace)(struct kobject *kobj);    };


这个结构来表达一类kobject。每一个kobject都需要关联一个kobj_type;(其实也好理解,因为每一个kobject都要有一个release()方法,而release()正在ktype中)
default_attrs指向一组默认的attributes,然后创建在每一个在ktype中的kobject

5.ksets

     kset就是一些你想要联系在一起的kobject的集合,没有规定必须要同样的ktype,但是要小心如果不是同样的ktype

kset有以下几个功能:

-----他是一系列objects的集合,一个kset可以被kernel分类标识为“所有的block devices"或者”所有的PCI device drivers“

-----一个kset是sysfs的子目录,每一个kset包含一个kobject可以设置为其他kobjects的parent.

------ksets 可以支持kobjects的“hotplugging”,影响uevents怎样report到userspace

kset让他的子类们保持在一个标准的内核联系列表中。Kobjects指向包含他们的kset通过他们的kset域。在大部分情况下,kobjects属于的那个kset就是他的parent.

因为kset包含一个kobject,那么他将被动态的创建,不会静态的声明,而且不会在stack上。创建一个kset:

struct kset *kset_create_and_add(const char *name,                                   struct kset_uevent_ops *u,                                   struct kobject *parent);

当你不使用一个kset的时候,call:
void kset_unregister(struct kset *kset);

来消除他

如果kset想kobjects的uevent,他可以使用struct kset_uevent_ops

struct kset_uevent_ops {        int (*filter)(struct kset *kset, struct kobject *kobj);        const char *(*name)(struct kset *kset, struct kobject *kobj);        int (*uevent)(struct kset *kset, struct kobject *kobj,                      struct kobj_uevent_env *env);};


filter函数,让kset阻止一个kobject的uevent,如果,return 0,那么uevent将不会发射到usespace

the uevent函数将被调用,当使更多的环境变量加入到uevent


可能有人要问,一个kobject怎样add到kset中,其实没有函数来做这项功能,这个是kobject_add()的任务,当一个kobject传到kobject_add(_),那么
他的kset域将会指到他属于的那个kset中

如果一个kobject属于一个kset没有设置parent,他将会被默认add到kset的目录。如果一个具体的parent设置到kobject中,这个kobject将注册在kset中,但是

在parent下

原创粉丝点击