第2章
Linux驱动模型
2.1 概述
Linux核心开发团队在2.5内核的开发过程中,引入了Linux驱动模型(Linux Driver Model),有时也被称作Linux设备模型(Linux Device Model),主要目的是解决之前版本存在的以下问题。
• 没有一种统一的机制表达驱动和设备之间的关系。
• 没有通用的热插拔机制。
• 没有通用的电源管理机制。
• procfs文件系统过度混乱,包含了许多不是进程的信息。
Linux驱动模型的示意如图2-1所示。
图2-1 Linux驱动模型
Linux内核基于kobject内核对象机制将系统中的总线类型、设备和驱动分别用bus_type、device和device_driver等对象描述,并将其组织成一个层次结构的系统,统一管理各种类别(class)的设备及其接口(class_interface),同时借助sysfs文件系统将内核所见设备系统展示给用户空间,提供了一个完全层次结构的用户视图。
Linux驱动模型的核心内容可以综合如下。
• 以内核对象为基础。内核对象用kobject结构表示,相当于其他对象的基类,是建构Linux驱动模型的关键。具有相同类型的内核对象构成内核对象集,用kset结构表示,内核对象集也包含自己的内核对象,从而组织成层次化的结构。
• 用sysfs文件系统导出到用户空间。内核中的所有内核对象组织成树状,以对象属性为叶子。通过sysfs文件系统,将用户空间对文件的读/写操作转化为对内核对象属性的显示和保存方法。从而导出内核对象信息,并提供配置接口。
• 将Linux子系统表达为总线类型/驱动/设备/类/接口的关系,分别用bus_type、device、device_driver、class和class_interface结构表示。每个子系统有自己的总线类型,它有一条驱动链表和一条设备链表,用来链接已加载的驱动和已发现的设备,驱动加载和设备发现的顺序可以是任意的。每个设备可以被绑定到最多一个驱动,被绑定了驱动的设备可以正常工作。除此以外,每个设备可以属于某个唯一的类,在类上包含多个接口,接口的方法被作用于设备,不管是先添加接口,还是先发现设备。