简单总结下三个设备模型的概念和作用。
设备模型是对设备进行有效管理的统一模型。是为了表示bus/device/驱动 之间的连接关系。反过来,他们是设备模型的上层建筑。设备模型的目的在于表示关系!kobject相当于总线/设备/驱动对象的基类,公共接口。
kobject是组成设备模型基本元素,相当于一个类,它在C语言中是一个结构体。怎么使用:把它嵌入到bus/device/驱动的结构体中,通过访问kobject就能访问具体的对象。因为C语言没有类,组合的概念,所以只能借助kobject(设备模型)嵌入到“对象结构”的方法,实现面向对象设计。
kset相当于kobject的容器,是管理相同类型kobject集合的,它的目的是创建树状集合,便于快速检索。它本身也包含一个指向自身的kobject。所有属于这个kset的子结构里面的parent域,都指向kset的object。可见,kset的object之所以存在,是为了和子对象的parent域关联。
kobj_type,相对于kset是为了创建集合,它的目标是管理相同类型的kobject,关注的是类型而不是集合。kset包含了kobject后,会在sysfs中创建一个目录,kset的每个object成员都会在里面展示kobject的“属性”,由于不同类型的kobject的“属性”不同,访问sysfs的接口函数也不同,sysfs访问函数表sysfs_ops有show()和store()两个操作函数,因此,需要kobj_type对不同kobject进行分类管理。
struct attribute{
const char *name;
struct module *owner;
mode_t mode;
}
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;
};
注意下面代码,kset本身也是一个kobject,所以有kobj成员变量
struct kset {
struct list_head list;
spinlock_t list_lock;
struct kobject kobj;
const struct kset_uevent_ops *uevent_ops;
};
struct kobj_type {
void (*release)(struct kobject *kobj);
const struct sysfs_ops *sysfs_ops;
struct attribute **default_attrs;
};