您的位置:首页 > 运维架构 > Linux

linux设备模型 kobject/kset/kobjset概念

2014-03-05 10:27 429 查看
简单总结下三个设备模型的概念和作用。

设备模型是对设备进行有效管理的统一模型。是为了表示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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: