本节介绍 Solaris 平台上的设备驱动程序及其入口点。
设备驱动程序是一种内核模块,负责管理硬件设备的底层 I/O 操作。设备驱动程序是使用标准接口编写的,内核可通过调用该标准接口与设备进行交互。设备驱动程序也可以是仅针对软件的,即模拟仅存在于软件中的设备,如 RAM 磁盘、总线以及伪终端。
设备驱动程序包含与设备进行通信时所需的所有特定于设备的代码。此代码包括一组用于系统其余部分的标准接口。就像系统调用接口可使应用程序不受平台特定信息影响一样,此接口可保护内核不受设备特定信息的影响。应用程序和内核其余部分需要非常少的特定于设备的代码(如果有)对此设备进行寻址。这样,设备驱动程序使得系统的可移植性更强,并更易于维护。
初始化 Solaris 操作系统 (Solaris operating system, Solaris OS) 后,设备会进行自标识并组织为设备树,即设备分层结构。实际上,设备树是内核的硬件模型。单个设备驱动程序表示为树中的一个节点,并且不包含任何子节点。此类型的节点称为叶驱动程序。为其他驱动程序提供服务的驱动程序称为总线结点驱动程序,并显示为包含子节点的节点。在引导过程中,物理设备会映射到树中的驱动程序,以便可以在需要时找到这些驱动程序。有关 Solaris OS 如何使用设备的更多信息,请参见第 2 章。
设备驱动程序按照处理 I/O 的方式可以分为以下三大类别:
块设备驱动程序-适用于可将 I/O 数据作为异步块进行处理的情况。通常,块驱动程序用于管理可物理寻址的存储介质的设备,如磁盘。
字符设备驱动程序-适用于针对连续的字节流执行 I/O 操作的设备。
如果为文件系统设置了两个不同的接口,则驱动程序可同时为块驱动程序和字符驱动程序。请参见作为特殊文件的设备。
使用 STREAMS 模型(参见下文)、程控 I/O、直接内存访问、SCSI 总线、USB 以及其他网络 I/O 的驱动程序都属于字符类别的驱动程序。
STREAMS 设备驱动程序-字符驱动程序的子集,将 streamio(7I) 例程集用于内核中的字符 I/O。
入口点是设备驱动程序内的一个函数,外部实体可调用此函数以访问某种驱动程序功能或运行某个设备。 每个设备驱动程序都提供一组标准函数作为入口点。有关所有驱动程序类型入口点的完整列表,请参见 Intro(9E) 手册页。Solaris 内核使用入口点执行以下常见任务:
装入和卸载驱动程序
自动配置设备-自动配置是将设备驱动程序的代码和静态数据装入内存以在系统内注册此驱动程序的过程。
为驱动程序提供 I/O 服务
根据设备执行的操作类型,不同类型设备的驱动程序具有不同的入口点集。例如,对于内存映射的面向字符的设备,其驱动程序支持 devmap(9E) 入口点,而块驱动程序不支持此入口点。
使用基于驱动程序名称的前缀可为驱动程序函数指定唯一的名称。通常,此前缀是驱动程序的名称,例如 xx_open() 代表驱动程序 xx 的 open(9E) 例程。有关更多信息,请参见使用唯一前缀来避免内核符号冲突。在本书后面的示例中,xx 用作驱动程序前缀。