Kobject 是Linux 2.6 引入的新的设备管理机制,在内核中由struct kobject数据结构 进行描述通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管 理,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注 册的kobject对象都对应于sysfs文件系统中的一个目录。Kobject是组成设备模型的基本结 构。但是,它比较低调,从不单独使用,都是嵌套在别的数据结构中。类似于C++中的基 类,它嵌入于更大的对象的对象中–所谓的容器–用来描述设备模型的组件。如bus, devices, drivers 都是典型的容器。这些容器就是通过kobject连接起来了,形成了 一个树状结构。这个树状结构就与/sys相对应。
kobject 结构为一些大的数据结构和子系统提供了基本的对象管理,避免了类似机能的重 复实现。这些机能包括
Kobject结构定义为:
struct kobject {
const char *name; /* 指向设备名称的指针 */
struct list_head entry; /* 挂接到所在kset中去的单元 */
struct kobject *parent; /* 指向父对象(kobject)的指针 */
struct kset *kset; /* 所属kset的指针 */
struct kobj_type *ktype; /* 指向其对象类型描述符的指针 */
struct sysfs_dirent *sd;
struct kref kref; /* 对象引用计数 */
unsigned int state_initialized:1;
unsigned int state_in_sysfs:1;
unsigned int state_add_uevent_sent:1;
unsigned int state_remove_uevent_sent:1;
unsigned int uevent_suppress:1;
};
其中,重要的变量已经加了注释,这里再简要介绍一下:
kobject对象被关联到一种特殊的类型,即ktype。ktype由kobj_type结构体表示,定义于 <linux/kobject.h>中:
struct kobj_type {
void (*release)(struct kobject *kobj);
struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};
是为了描述一族kobject所具有的普遍特性。因此,不再需要每个kobject都分别定 义自己的特性,而是将这些普遍的特性在ktype结构体中一次定义,然后所有“同类”的 kobject都能共享一样的特性。
指向sysfs操作表和一个sysfs文件系统缺省属性列表。Sysfs操作表包括两 个函数store()和show()。当用户态读取属性时,show()函数被调用,该函数编码指定属 性值存入buffer中返回给用户态;而store()函数用于存储用户态传入的属性值。
指向一个attribute结构体数组。这些结构体定义了该kobject相关的默认 属性。属性给定了对象的特征,如果该kobject被导出到sysfs中,那么这些属性都将相应 的作为文件而导出。其定义如下:
struct attribute {
const char *name;
struct module *owner;
mode_t mode;
};
它以文件的形式输出到sysfs的目录当中。在kobject对应的目录下面。文件 名就是name。文件读写的方法对应于kobj_type中的sysfs_ops。
kset 最重要的是建立上层(sub-system)和下层的(kobject)的关联性。kobject 也会利用 它了分辨自已是属于那一個类型,然後在/sys 下建立正确的目录位置。而kset 的优先权 比较高,kobject会利用自已的*kset 找到自已所属的kset,並把*ktype 指定成該kset下 的ktype,除非沒有定义kset,才会用ktype來建立关系。Kobject通过kset组织成层次化 的结构,kset是具有相同类型的kobject的集合,在内核中用kset数据结构表示。
/** |