Linux设备模型是从内核2.6开始引入的,初衷是为了描述设备的拓扑结构及支持电源管理等新特性。从高次层来看设备模型主要由总线、设备、驱动构成,设备模型通过总线将系统中的设备和驱动关联起来。在设备模型中,所有的设备都通过总线相连,模型中的总线可以是实际物理总线或虚拟“平台”总线。
Linux设备模型通过数据结构kobject和kset来实现设备的拓扑结构和层次关系。
1、kobject数据结构
struct kobject {
const char *name;
struct list_head entry;
struct kobject *parent;
struct 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通常是嵌入到其它结构中,比如字符设备
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
2、kobject相关的操作函数
int kobject_set_name(struct kobject *kobj, const char *fmt, ...)
该函数是设定kobject中的name成员。
void kobject_init(struct kobject *kobj, struct kobj_type *ktype)
该函数是初始化内核对象的kobject结构。
int kobject_add(struct kobject *kobj, struct kobject *parent, const char *fmt, ...)
该函数用来建立kobject层次关系和在sysfs下生成一个目录。
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...)
该函数是将kobject_init和kobject_add的功能合在一起。
struct kobject *kobject_create(void)
该函数是分配一个kobject对象并初始化
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent)
该函数是kobject_create和kobject_add功能的合并。
void kobject_del(struct kobject *kobj)
该函数是从sysfs中删除koject对应的目录。