Linux 2.6内核的一个重要特色是提供了统一的内核设备模型。Linux 2.6内核引入的新的设备管理机制的最高层抽象为kobject,通过这个数据结构使所有设备在底层都具有统一的接口。kobject结构主要提供三方面的功能:引用计数、sysfs表示以及热插拔等事件支持。kobject与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。kobject结构定义如下:
- struct kobject {
- const char *name; //名称
- struct list_head entry; //同类kobjects的链表
- struct kobject *parent; // 父对象
- struct kset *kset; // 所属的集合
- struct kobj_type *ktype; // 对象的类型
- struct sysfs_dirent *sd; // 在sysfs 中的目录项
- 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;
- };
kobj_type表示对象的类型:
- struct attribute {
- const char *name;
- struct module *owner;
- mode_t mode;
- };
- struct kobj_type {
- void (*release)(struct kobject *kobj);
- struct sysfs_ops *sysfs_ops;//sysfs操作接口
- struct attribute **default_attrs;//属性
- };
kobject对象的接口函数如下:
- void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
- int kobject_add(struct kobject *kobj,struct kobject *parent,const char *fmt, ...);
- void kobject_del(struct kobject *);
- struct kobject * kobject_create(void);
- struct kobject *kobject_get(struct kobject *kobj);
- void kobject_put(struct kobject * kobj);//减少使用计数
kobject通常通过kset组织成层次化的结构,kset是具有相同类型的kobject的集合。所有属于同一个ksets的对象(kobject)的parent都指向该ksets的kobj成员。
- struct kset {
- struct list_head list; //同一kset的链表
- spinlock_t list_lock;//锁
- struct kobject kobj; //自身的kobject
- struct kset_uevent_ops *uevent_ops;// uevent操作,如热插拔事件
- };
ksets对象的接口函数如下:
- void kset_init(struct kset * k);
- struct kset * kset_create_and_add(const char *name,struct kset_uevent_ops *u,
- struct kobject *parent_kobj);
- int kset_register(struct kset *kset);
- void kset_unregister(struct kset *kset);