编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

DDI/DKI 功能

为了使驱动程序具有可移植性,提供了 Oracle Solaris DDI/DKI 接口。利用 DDI/DKI,开发者可采用标准方式编写驱动程序代码,而不必担心硬件或平台差异。本节介绍 DDI/DKI 接口的各个方面。

设备 ID

利用 DDI 接口,驱动程序可以为设备提供永久、唯一的标识符。可以使用设备 ID 标识或查找设备。此 ID 与设备的名称或编号 (dev_t) 无关。应用程序可以使用 libdevid(3LIB) 中定义的函数来读取和处理由驱动程序注册的设备 ID。

设备属性

设备或设备驱动程序的特性 (attribute) 通过属性 (property) 指定。属性是一个名称/值对。名称是标识具有关联值的属性的字符串。属性可以由自标识设备的 FCode、硬件配置文件(请参见 driver.conf(4) 手册页)或驱动程序自身使用 ddi_prop_update(9F) 系列例程进行定义。

中断处理

DDI/DKI 解决了设备中断处理的以下方面的问题:

  • 向系统注册设备中断

  • 删除设备中断

  • 向中断处理程序分发中断

设备中断源包含在称为 interrupt 的属性中,此属性既可由自标识设备的 PROM(位于硬件配置文件中)提供,也可由 x86 平台上的引导系统提供。

回调函数

某些 DDI 机制提供回调机制。DDI 函数提供一种在满足某个条件时调度回调的机制。在以下典型的情况下,可以使用回调函数:

  • 传送已完成

  • 资源已变得可用

  • 超时时间已过期

回调函数在某种程度上与入口点(例如,中断处理程序)类似。允许回调的 DDI 函数期望回调函数执行特定任务。如果使用 DMA 例程,则回调函数必须返回一个值,指示是否需要在出现故障时重新调度此函数。

回调函数作为单独的中断线程执行。回调必须处理所有常见的多线程问题。


注 - 驱动程序在分离设备之前必须先取消所有已调度的回调函数。

软件状态管理

为了帮助设备驱动程序编写人员分配状态结构,DDI/DKI 提供了一组称为软件状态管理例程的内存管理例程,也称为软状态例程。这些例程可动态分配、检索以及销毁指定大小的内存项,并可隐藏列表管理的详细信息。可使用实例编号来标识所需内存项。此编号通常为系统指定的实例编号。

这些例程用于实现以下任务:

  • 初始化驱动程序的软状态列表

  • 为驱动程序的软状态实例分配空间

  • 检索指向驱动程序软状态实例的指针

  • 释放驱动程序软状态实例的内存

  • 结束使用驱动程序的软状态列表

有关如何使用这些例程的示例,请参见Loadable Driver Interfaces

程控 I/O 设备访问

程控 I/O 设备访问是指通过主机 CPU 读/写设备寄存器或设备内存的行为。Oracle Solaris DDI 提供通过内核映射设备寄存器或内存的接口,以及从驱动程序读/写设备内存的接口。使用这些接口,通过自动管理设备和主机字节存储顺序中的任何差异,以及强制执行设备所强加的任何内存存储顺序要求,可以开发与平台和总线无关的驱动程序。

直接内存访问 (Direct Memory Access, DMA)

Oracle Solaris 平台可定义与体系结构无关的高级模型,以支持具备 DMA 功能的设备。Oracle Solaris DDI 可防止驱动程序使用特定于平台的详细信息。使用此概念,通用驱动程序可以在多个平台和体系结构上运行。

分层驱动程序接口

DDI/DKI 提供一组称为分层设备接口 (layered device interface, LDI) 的接口。利用这些接口,可以从 Oracle Solaris 内核中访问设备。该功能使开发者可以编写查看内核设备使用情况的应用程序。例如,prtconf(1M)fuser(1M) 命令都可以使用 LDI,以便使系统管理员可以跟踪设备使用情况的各方面。Chapter 14, Layered Driver Interface (LDI) 对 LDI 进行了更详细的说明。