Kobject 是 Linux 2.6 引入的新的设备管理机制,在内核中由 struct kobject
表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject 提供基
本的对象管理,是构成 Linux2.6 设备模型的核心结构,它与 sysfs 文件系统紧
密关联,每个在内核中注册的 kobject 对象都对应于 sysfs 文件系统中的一个目
录。Kobject 是组成设备模型的基本结构。类似于 C++中的基类,它嵌入于更大
的对象的对象中--所谓的容器--用来描述设备模型的组件。如 bus,devices,
drivers 都是典型的容器。这些容器就是通过 kobject 连接起来了,形成了一个
树状结构。这个树状结构就与/sys 向对应。
kobject 结构为一些大的数据结构和子系统提供了基本的对象管理,避免了类似
机能的重复实现。这些机能包括
- 对象引用计数.
- 维护对象链表(集合).
- 对象上锁.
- 在用户空间的表示.
Kobject 结构定义为:
struct kobject {
char * k name; 指向设备名称的指针
char name[KOBJ NAME LEN]; 设备名称
struct kref kref; 对象引用计数
struct list head entry; 挂接到所在 kset 中去的单元
struct kobject * parent; 指向父对象的指针
struct kset * kset; 所属 kset 的指针
struct kobj type * ktype; 指向其对象类型描述符的指针
struct dentry * dentry; sysfs 文件系统中与该对象对应的文件节点路径指针
};
其中的 kref 域表示该对象引用的计数,内核通过 kref 实现对象引用计数管理,
内核提供两个函数 kobject_get()、kobject_put()分别用于增加和减少引用计
数,当引用计数为 0 时,所有该对象使用的资源释放。Ktype 域是一个指向 kobj
type 结构的指针,表示该对象的类型。
相关函数
void kobject_init(struct kobject * kobj);kobject 初始化函数。
int kobject_set_name(struct kobject *kobj, const char *format, ...);
设置指定 kobject 的名称。
struct kobject *kobject_get(struct kobject *kobj);将 kobj 对象的引用
计数加 1,同时返回该对象的指针。
void kobject_put(struct kobject * kobj); 将 kobj 对象的引用计数减 1,
如果引用计数降为 0,则调用 kobject release()释放该 kobject 对象。 int kobject_add(struct kobject * kobj);将 kobj 对象加入 Linux 设备层次。挂接该 kobject 对象到 kset 的 list 链中,增加父目录各级 kobject 的引用计数,在其 parent 指向的目录下创建文件节点,并启动该类型内核对象的 hotplug 函数。 int kobject_register(struct kobject * kobj);kobject 注册函数。通过调用 kobject init()初始化 kobj,再调用 kobject_add()完成该内核对象的注册。 void kobject_del(struct kobject * kobj);从 Linux 设备层次(hierarchy)中删除 kobj 对象。 void kobject_unregister(struct kobject * kobj);kobject 注销函数。与kobject register()相反,它首先调用 kobject del 从设备层次中删除该对象,再调用 kobject put()减少该对象的引用计数,如果引用计数降为 0,则释放kobject 对象。
|