Linux设备驱动之设备模型

Linux设备模型是对系统设备组织架构进行抽象的一个数据结构,旨在为设备驱动进行分层、分类、组织。降低设备多样性带来的Linux驱动开发的复杂度,以及设备热拔插处理、电源管理等。

Overview 设计目的

电源管理和系统关机(Power management and system shutdown)

设备之间大多情况下有依赖、耦合,因此要实现电源管理就必须对系统的设备结构有清楚的理解,应知道先关哪个然后才能再关哪个。设计设备模型就是为了使系统可以按照正确顺序进行硬件的遍历。

与用户空间的交互(Communications with user space)

实现了sysfs虚拟文件系统。它可以将设备模型中定义的设备属性信息等导出到用户空间,使得在用户空间可以实现对设备属性的访问及参数的更改。详见Documentation/filesystems/sysfs.txt。

可热插拔设备(Hotpluggable devices)

设备模型管理内核所使用的处理用户空间热插拔的机制,支持设备的动态添加与移除。

设备类别(Device classes)

系统的许多部分对设备如何连接没有兴趣, 但是它们需要知道什么类型的设备可用。设备模型也实现了一个给设备分类的机制, 它在一个更高的功能性级别描述了这些设备。

对象生命期(Object lifecycles)

设备模型的实现一套机制来处理对象生命期。

设备模型框图

Linux 设备模型是一个复杂的数据结构。如图所示为和USB鼠标相关联的设备模型的一小部分:

Overview diagram

这个框图展示了设备模型最重要的四个部分的组织关系(在顶层容器中详解):

Devices

描述了设备如何连接到系统。

Drivers

系统中可用的驱动。

Buses

跟踪什么连接到每个总线,负责匹配设备与驱动。

classes

设备底层细节的抽象,描述了设备所提供的功能。

底层实现 kobject 作用与目的

Kobject是将整个设备模型连接在一起的基础。主要用来实现以下功能:

对象的引用计数(Reference counting of objects)

通常, 当一个内核对象被创建, 没有方法知道它会存在多长时间。 一种跟踪这种对象生命周期的方法是通过引用计数。 当没有内核代码持有对给定对象的引用, 那个对象已经完成了它的有用寿命并且可以被删除。

sysfs 表示(Sysfs representation)

在sysfs中显示的每一个项目都是通过一个与内核交互的kobject实现的。

数据结构粘和(Data structure glue)

设备模型整体来看是一个极端复杂的由多级组成的数据结构, kobject实现各级之间的连接粘和。

热插拔事件处理(Hotplug event handling)

kobject处理热插拔事件并通知用户空间。

数据结构 /* include in <linux/kobject.h> */ struct kobject { const char *name; /* 该kobject的名称,同时也是sysfs中的目录名称 */ struct list_head entry; /* kobjetct双向链表 */ struct kobject *parent; /* 指向kset中的kobject,相当于指向父目录 */ struct kset *kset; /*指向所属的kset*/ struct kobj_type *ktype; /*负责对kobject结构跟踪*/ ... }; /* 定义kobject的类型及释放回调 */ struct kobj_type { void (*release)(struct kobject *); /* kobject释放函数指针 */ struct sysfs_ops *sysfs_ops; /* 默认属性操作方法 */ struct attribute **default_attrs; /* 默认属性 */ }; /* kobject上层容器 */ struct kset { struct list_head list; /* 用于连接kset中所有kobject的链表头 */ spinlock_t list_lock; /* 扫描kobject组成的链表时使用的锁 */ struct kobject kobj; /* 嵌入的kobject */ const struct kset_uevent_ops *uevent_ops; /* kset的uevent操作 */ }; /* 包含kset的更高级抽象 */ struct subsystem { struct kset kset; /* 定义一个kset */ struct rw_semaphore rwsem; /* 用于串行访问kset内部链表的读写信号量 */ };

kobject和kset关系:

kobject and kset

如图所示,kset将它的children(kobjects)组成一个标准的内核链表。所以说kset是一个包含嵌入在同种类型结构中的kobject的集合。它自身也内嵌一个kobject,所以也是一个特殊的kobject。设计kset的主要目的是容纳,可以说是kobject的顶层容器。kset总是会在sysfs中以目录的形式呈现。需要注意的是图中所示的kobject其实是嵌入在其他类型中(很少单独使用),也可能是其他kset中。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14652.html