自接触Linux设备驱动程序以来,一直在思考设备、设备驱动和设备驱动开发者三者之间的关系,也曾经写下一些粗略的思考碎片(看这里);随着对硬件和内核的认识的增加,三者的关系也便更清晰。
设备
设备是系统的一种,有接口、用户、设计者和维护者等系统属性。特别注意的是设备可以是物理的,也可以是逻辑的;因而,设备的实现形式不同,其接口、用户、设计者和维护者的实现形式也各有不同。例如在设备接口上,[显示终端设备]的接口显示器(上的字符)和键盘,串口设备的接口是12个寄存器,一支软件虚拟的TTY设备的接口是某种C函数等。
一些直观概念扰乱了我们认清设备、驱动和开发者三者的关系,例如,“驱动程序是为某设备编写的一集C函数”和“设备就是主板上芯片、扩展板和通过USB线链接的移动盘”。下文开始讲解设备、驱动和开发者三者的关系,可能有点费解,解理的关键是何为“逻辑设备”。
设备驱动
我们说设备有接口,设备可以是逻辑的,那么设备驱动就是实现[逻辑设备的接口]的软性代码。另外,设备作为一种系统,必然有内部的工作状态,包括静态属性,例如设备名,还有动态属性,例如内部临时记忆(缓冲区),所以设备驱动还必需包含用于构建设备的其它材料,常见的做法是定义一个表征设备状态的C结构。
值得注意的是,除了[设备使用接口],由于现在计算机系统动态性和多道性,设备的[安装接口]和[使用前接口]也是设备驱动的内容。拿标准常用设备接口file_operations举例,open/release是使用前接口,read/write/ioctl等为使用接口。安装接口没有标准,一般为reg_xxx/unreg_xxx,或者xxx_init/xxx_cleanup。
[安装接口]的“安装”语义是让逻辑设备的功能[注]可用,过程大略为初始化一些设备状态记忆,将软性的[设备驱动二进制]拷进主存,并作相应的配置。安装过程是设备相关的,一般内容有:
- 逻辑设备初始化,如为设备的内部状态分配记忆空间;
- 申请系统资源,如IO端口、IRQ号和设备号;
- 把设备添加进系统的设备管理系统,如往设备驱动模型添加新设备类,创建设备文件等。
注:集成了设备驱动的设备均为逻辑设备,Linux设备驱动开发者都是为逻辑设备开发驱动,但是我们的直观印象都是为物理设备开发驱动,这在理解上出现冲突。
[使用前接口]主要协调多个用户同时使用设备。
构建设备(驱动)的一些重要C结构有inode、cdev(字符设备)、file和file_operations等,为了更好区分设备的[安装]与[使用]——两个过程,我们分析一下在这些过程中内核的空间这些对象的创建及对象间链接关系。
第一,安装前,内核没有上图任何对象,设备驱动的二进制代码一般存在外存;
第二,安装后打开前,cdev和一个或多个(取决于次设备号)file_operations出现在内核空间,代码从外存拷入,对象由内核的设备管理系统管理;接着,inode也随设备文件一并创建好;cdev与file_operations有关联,cdev与inode还没有关联;
第三,设备打开后,cdev与inode关联上,VFS通过inode的主设备号查询内核的设备管理系统找到cdev;file被创建,并且通过inode->cdev->file_operatins,关联上设备驱动代码。至此,由用户空间到设备驱动的调用路径被接通,用户进程可以通过file对象使用设备了。
设备驱动开发者
我们说,如果设备可以逻辑构建的,那么有没有多重抽象实现的逻辑设备呢?事实上,Linux好一些子系统就这么干的,一个例子是它的TTY设备驱动子系统。我们假设整个计算机系统分为多层设备,高层设备依赖低层设备,对低层设备进行逻辑抽象,提供更“友好”的接口,那么第N层的[设备驱动开发者]利用N-1层设备的接口实现N层设备的接口——N层设备的驱动程序。举例如,一个使用少量几个IO端口的字符设备(《LDD3》的字符驱动一章有实例代码),N-1层设备的接口就是IO端口,N层设备的接口就是file_operations。
设备用户
设备驱动开发者并不是设备的用户,开发者是作为一个位创造者的身份,分析设计,并创造设备。设备可构建为逻辑类型后,设备的用户变得复杂和让人困惑。我们假设提供硬件接口的设备为硬件层设备,提供文件接口(file_operation)的设备为文件层设备,文件层设备实现了设备驱动程序(如下图中的file device driver),那么,硬件层设备的[用户]是实现文件层设备的[设备驱动],文件层设备的[用户]是用户空间的[程序]。低层设备的用户不是人,而是更抽象的程序代码,人是位于抽象最顶层的用户。
human usr
-kb-mouse-window————
usr space process
-fop————————-
file device(build file device driver in)
-reg————————-
hw device

