编写设备驱动程序

设备驱动程序基础知识

本节介绍 Solaris 平台上的设备驱动程序及其入口点。

什么是设备驱动程序?

设备驱动程序是一种内核模块,负责管理硬件设备的底层 I/O 操作。设备驱动程序是使用标准接口编写的,内核可通过调用该标准接口与设备进行交互。设备驱动程序也可以是仅针对软件的,即模拟仅存在于软件中的设备,如 RAM 磁盘、总线以及伪终端。

设备驱动程序包含与设备进行通信时所需的所有特定于设备的代码。此代码包括一组用于系统其余部分的标准接口。就像系统调用接口可使应用程序不受平台特定信息影响一样,此接口可保护内核不受设备特定信息的影响。应用程序和内核其余部分需要非常少的特定于设备的代码(如果有)对此设备进行寻址。这样,设备驱动程序使得系统的可移植性更强,并更易于维护。

初始化 Solaris 操作系统 (Solaris operating system, Solaris OS) 后,设备会进行自标识并组织为设备树,即设备分层结构。实际上,设备树是内核的硬件模型。单个设备驱动程序表示为树中的一个节点,并且不包含任何子节点。此类型的节点称为叶驱动程序。为其他驱动程序提供服务的驱动程序称为总线结点驱动程序,并显示为包含子节点的节点。在引导过程中,物理设备会映射到树中的驱动程序,以便可以在需要时找到这些驱动程序。有关 Solaris OS 如何使用设备的更多信息,请参见第 2 章

设备驱动程序按照处理 I/O 的方式可以分为以下三大类别:

什么是设备驱动程序入口点?

入口点是设备驱动程序内的一个函数,外部实体可调用此函数以访问某种驱动程序功能或运行某个设备。 每个设备驱动程序都提供一组标准函数作为入口点。有关所有驱动程序类型入口点的完整列表,请参见 Intro(9E) 手册页。Solaris 内核使用入口点执行以下常见任务:

根据设备执行的操作类型,不同类型设备的驱动程序具有不同的入口点集。例如,对于内存映射的面向字符的设备,其驱动程序支持 devmap(9E) 入口点,而块驱动程序不支持此入口点。

使用基于驱动程序名称的前缀可为驱动程序函数指定唯一的名称。通常,此前缀是驱动程序的名称,例如 xx_open() 代表驱动程序 xx 的 open(9E) 例程。有关更多信息,请参见使用唯一前缀来避免内核符号冲突。在本书后面的示例中,xx 用作驱动程序前缀。