现在的位置: 首页 > 技术文章 > 驱动开发 > 正文

设备模型之kobject,kset及其关系

2016年01月08日 驱动开发 ⁄ 共 1638字 ⁄ 字号 暂无评论 ⁄ 阅读 398 次

Linux2.6以后的设备驱动,都是在设备模型的基础上构建的,因此,要编写linux下的设备驱动程序,不论是usb设备,pci设备等,都需要了解设备模型。

设备模型的基础结构体主要是kobject,kset这两个结构体:


struct kobject {

char * k_name;

char name[KOBJ_NAME_LEN];

struct kref kref;

struct list_head entry;

struct kobject * parent;

struct kset * kset;

struct kobj_type * ktype;

struct dentry * dentry;

};


struct kset {

struct subsystem * subsys;

struct kobj_type * ktype;

struct list_head list;

struct kobject kobj;

struct kset_hotplug_ops * hotplug_ops;

};

还有一个subsys结构体,但subsys结构体跟kset差不多,就多了一个互斥访问信号量,因此,就不需要列出了,另外还有一个结构体


struct kobj_type {

void (*release)(struct kobject *);

struct sysfs_ops  * sysfs_ops;

struct attribute  ** default_attrs;

};

用来表示kobject,kset的类型。

一个kobject结构如下图的kobject 类型部分,而一个kset结构如下图的kset 类型部分,一个kobject加入一个kset,主要是kobject结构体中的相关字段记录了对应的kset信息:

①记录了kobject所对应kset,其所指向的是kset所包含的kobject的地址,

②记录了kobject所对应的kset的kset指针,

③记录了kobject的类型,

④记录了kset所有的kobject的链子,这个链子是一个双向链表,每当有一个kobject加入到当前的kset,就会调用list_add_tail()函数,把要加入kset的kobject连入链表的结尾,最终形成一个链表。

kset_kobject关系

kset_kobject关系

当有另外一个kobject要加入当前的kset,其中的①②③步跟第一个加入当前kset的kobject是一样的,即把要加入的kobject的成员设置,使之指向当前的kset对应数据,而④需要把kobject添加到kset的list的尾部,下图表示了kobject b加入到kset A的图示:

增加一个kobject

增加一个kobject

当有一个kset,需要加入到当前的kset,其方法也跟一个kobject要加入到当前kset一样,即把要加入的kset中所包含的kobject的成员设置,使这些成员指向对应的kset的对应数据。而当前kset要加入另一个kset,其方式也是跟一个kset加入到当前kset一样,都是设备kset中的kobject,使kobject的成员指向要加入的kset的对应数据即可,下图显示了一个kset B加入到kset A中的图示。

添加一个KSET

添加一个KSET

一个简单的kset,kobject关系图如下:

一个简单的kset,kobject关系图

一个简单的kset,kobject关系图

给我留言

留言无头像?



×