linux设备模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux设备模型

Linux 2.6内核的一个重要特色是提供了统一的内核设备模型。随着技术的不断进步,系统的拓扑结构越来越复杂,对智能电源管理、热插拔以及plug and play 的支持要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形势的需要,2.6内核开发了全新的设备模型。

1. Sysfs文件系统

Sysfs文件系统是一个类似于proc文件系统的特殊文件系统,用于将系统中的设备组织成层次结构,并向用户模式程序提供详细的内核数据结构信息。其顶层目录主要有:

Block目录:包含所有的块设备

Devices目录:包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构

Bus目录:包含系统中所有的总线类型

Drivers目录:包括内核中所有已注册的设备驱动程序

Class目录:系统中的设备类型(如网卡设备,声卡设备等)

2.内核对象机制关键数据结构

2.1 kobject内核对象

Kobject 是Linux 2.6引入的新的设备管理机制,在内核中由struct kobject 表示。通过这个数据结构使所有设备在底层都具有统一的接口,kobject提供基本的对象管理,是构成Linux 2.6设备模型的核心结构,它与sysfs文件系统紧密关联,每个在内核中注册的kobject对象都对应于sysfs文件系统中的一个目录。

Kobject结构定义为:

struct kobject {

char * k_name; // 指向设备名称的指针

char name[KOBJ_NAME_LEN]; // 设备名称

struct kref kref; // 对象引用计数

struct list_head entry; // 挂接到所在kset中去的单元

struct kobject * parent; // 指向父对象的指针

struct kset * kset; // 所属kset的指针

struct kobj_type * ktype; // 指向其对象类型描述符的指针

struct dentry * dentry; // sysfs文件系统中与该对象对应的文件节点路径指针

};

其中的kref域表示该对象引用的计数,内核通过kref实现对象引用计数管理,内核提供两个函数kobject_get()、kobject_put()分别用于增加和减少引用计数,当引用计数为0时,所有该对象使用的资源将被释放。

Ktype 域是一个指向kobj_type结构的指针,表示该对象的类型。Kobj_type数据结构包含三个域:一个release方法用于释放kobject占用的资源;一个sysfs_ops指针指向sysfs操作表和一个sysfs文件系统缺省属性列表。Sysfs 操作表包括两个函数store()和 show()。当用户态读取属性时,show()函数被调用,该函数编码指定属性值存入buffer中返回给用户态;而store()函数用

于存储用户态传入的属性值。

2.2 kset内核对象集合

Kobject通常通过kset组织成层次化的结构,kset是具有相同类型的kobject 的集合,在内核中用kset数据结构表示,定义为:

struct kset {

struct subsystem * subsys; // 所在的subsystem的指针

struct kobj_type * ktype; // 指向该kset对象类型描述符的指针

struct list_head list; // 用于连接该kset中所有kobject的链表头

struct kobject kobj; // 嵌入的kobject

struct kset_hotplug_ops * hotplug_ops; // 指向热插拔操作表的指针

};

包含在kset中的所有kobject被组织成一个双向循环链表,list域正是该链表的头。Ktype域指向一个kobj_type结构,被该 kset中的所有kobject共享,表示这些对象的类型。Kset数据结构还内嵌了一个kobject对象(由kobj域表示),所有属于这个kset 的kobject对象的parent域均指向这个内嵌的对象。此外,kset还依赖于kobj维护引用计数:kset的引用计数实际上就是内嵌的kobject对象的引用计数。

2.3 subsystem内核对象子系统

Subsystem是一系列kset的集合,描述系统中某一类设备子系统,如

block_subsys表示所有的块设备,对应于sysfs文件系统中的block目录。类似的,devices_subsys对应于 sysfs中的devices目录,描述系统中所有的设备。Subsystem由struct subsystem数据结构描述,定义为:

struct subsystem {

struct kset kset; // 内嵌的kset对象

struct rw_semaphore rwsem; // 互斥访问信号量

};

每个kset必须属于某个subsystem,通过设置kset结构中的subsys域指向指定的subsystem可以将一个kset加入到该 subsystem。所有挂接到同一subsystem的kset共享同一个rwsem信号量,用于同步访问kset中的链表。

3.内核对象机制主要相关函数

针对内核对象不同层次的数据结构,linux 2.6内核定义了一系列操作函数,定义于lib/kobject.c文件中。

3.1 kobject相关函数

void kobject_init(struct kobject * kobj);// kobject初始化函数。设置kobject引用计数为1,entry域指向自身,其所属kset引用计数加1

int kobject_set_name(struct kobject *kobj, const char *format, );// 设置指定kobject的名称。

void kobject_cleanup(struct kobject * kobj);

void kobject_release(struct kref *kref);// kobject清除函数。当其引用计数为0时,释放对象占用的资源。

相关文档
最新文档