JavaScript is required to for searching.
跳过导航链接
退出打印视图
编写设备驱动程序     Oracle Solaris 11.1 Information Library (简体中文)
为本文档评分
search filter icon
search icon

文档信息

前言

第 1 部分针对 Oracle Solaris 平台设计设备驱动程序

1.  Oracle Solaris 设备驱动程序概述

2.  Oracle Solaris 内核和设备树

3.  多线程

4.  属性

5.  管理事件和排队任务

6.  驱动程序自动配置

7.  设备访问:程控 I/O

8.  中断处理程序

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

10.  映射设备和内核内存

11.  设备上下文管理

12.  电源管理

13.  强化 Oracle Solaris 驱动程序

14.  分层驱动程序接口 (Layered Driver Interface, LDI)

第 2 部分设计特定种类的设备驱动程序

15.  字符设备驱动程序

16.  块设备驱动程序

17.  SCSI 目标驱动程序

18.  SCSI 主机总线适配器驱动程序

19.  网络设备驱动程序

20.  USB 驱动程序

21.  SR-IOV 驱动程序

第 3 部分生成设备驱动程序

22.  编译、装入、打包和测试驱动程序

驱动程序开发摘要

驱动程序代码布局

头文件

源文件

配置文件

准备安装驱动程序

编译和链接驱动程序

模块相关性

编写硬件配置文件

安装、更新和删除驱动程序

将驱动程序复制到模块目录

使用 add_drv 安装驱动程序

更新驱动程序信息

删除驱动程序

装入和卸载驱动程序

驱动程序打包

驱动程序测试条件

配置测试

功能测试

错误处理

测试装入和卸载

压力、性能和互操作性测试

DDI/DKI 兼容性测试

安装和打包测试

测试特定类型驱动程序

测试磁带机

测试磁盘驱动程序

异步通信驱动程序

测试网络驱动程序

测试 SR-IOV 驱动程序

23.  调试、测试和调优设备驱动程序

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Oracle Solaris DDI/DKI 服务汇总

C.  使设备驱动程序支持 64 位

D.  控制台帧缓存器驱动程序

E.  pci.conf 文件

索引

请告诉我们如何提高我们的文档:
过于简略
不易阅读或难以理解
重要信息缺失
错误的内容
需要翻译的版本
其他
Your rating has been updated
感谢您的反馈!

您的反馈将非常有助于我们提供更好的文档。 您是否愿意参与我们的内容改进并提供进一步的意见?

准备安装驱动程序

安装驱动程序之前,需要执行以下步骤:

  1. 编译驱动程序。

  2. 创建配置文件(如有必要)。

  3. 通过以下任一备选方法,在系统中标识驱动程序模块:

    • 将驱动程序的名称与设备节点的名称匹配。

    • 使用 add_drv(1M)update_drv(1M) 将模块名称通知给系统。

系统维护驱动程序模块名称与 dev_info 节点名称之间的一对一关联。例如,假设名为 mydevice 的设备包含一个 dev_info 节点。处理设备 mydevice 的驱动程序模块也命名为 mydevicemydevice 模块驻留在名为 drv 的子目录中,该子目录位于模块路径下。如果使用 32 位内核,则该模块位于 drv/mydevice 中。如果使用 64 位 SPARC 内核,则该模块位于 drv/sparcv9/mydevice 中。如果使用 64 位 x86 内核,则该模块位于 drv/amd64/mydevice 中。

如果驱动程序是一个 STREAMS 网络驱动程序,则驱动程序名称必须满足以下约束:

如果驱动程序必须使用不同的名称管理 dev_info 节点,则 add_drv(1M) 实用程序可以创建别名。-i 标志指定驱动程序处理的其他 dev_info 节点的名称。update_drv 命令也可以修改已安装的设备驱动程序的别名。

编译和链接驱动程序

您需要编译每个驱动程序源文件,并将生成的对象文件链接到驱动程序模块中。Oracle Solaris OS 既与 Oracle Solaris Studio C 编译器兼容,又与 Free Software Foundation, Inc. 提供的 GNU C 编译器兼容。除非另有说明,否则本节中的示例均使用 Oracle Solaris Studio C 编译器。有关 Oracle Solaris Studio C 编译器的信息,请参见《Oracle Solaris Studio 12.3:C 用户指南》Oracle Solaris Studio Documentation(Oracle Solaris Studio 文档)。有关编译和链接选项的更多信息,请参见 Oracle Solaris Studio 12.3 Command-Line Reference(Oracle Solaris Studio 12.3 命令行参考信息)文档。/usr/sfw 目录中提供了GNU C 编译器。有关 GNU C 编译器的信息,请参见 http://gcc.gnu.org/,或者查看 /usr/sfw/man 中的手册页。

以下示例显示一个名为 xx 的驱动程序,该驱动程序包含两个 C 源文件。生成的驱动程序模块名为 xx。本示例中创建的驱动程序适用于 32 位内核。您必须使用 ld -r,即使您的驱动程序只有一个对象模块也是如此。

% cc -D_KERNEL -c xx1.c
% cc -D_KERNEL -c xx2.c
% ld -r -o xx xx1.o xx2.o

必须定义 _KERNEL 符号以指示此代码定义了一个内核模块。除了驱动程序专用符号以外,不应定义任何其他符号。可以定义 DEBUG 符号,以启用任何对 ASSERT(9F) 的调用。

表 22-1 SPARC 和 x86 64 位体系结构的编译器选项

编译器
SPARC 64
x86 64
Studio 9
cc -D_KERNEL -xarch=v9 -c xx.c
不支持
Studio 10
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Studio 11
cc -D_KERNEL -xarch=v9 -c xx.c
cc -D_KERNEL -xarch=amd64 -xmodel=kernel -c xx.c
Oracle Solaris Studio 12
cc -D_KERNEL -m64 -c xx.c
cc -D_KERNEL -m64 -xmodel=kernel -c xx.c

注 - 如果您使用 Oracle Solaris Studio 12.2 或更旧的编译器针对 32 位或 64 位 x86 体系结构进行编译,请勿添加 -xarch=sse2a,因为缺省值是 SSE2。



注意

注意 - MMX 指令在 x86 内核中不受支持。使用 MMX 指令会引起内核故障,因此不应使用它。


驱动程序稳定后,您可能需要添加优化标志来生成符合生产质量要求的驱动程序。有关 Oracle Solaris Studio C 编译器中的优化的特定信息,请参见 Oracle Solaris Studio 12.3 Command-Line Reference(Oracle Solaris Studio 12.3 命令行参考信息)中的 cc(1) 手册页。

在设备驱动程序中,应该将全局变量视为 volatilevolatile 标记将在将变量声明为可变变量中详细介绍。标志的使用取决于平台。请参见手册页。

模块相关性

如果驱动程序模块依赖于其他内核模块导出的符号,则可以通过装载器 ld(1)-dy-N 选项指定相关性。如果驱动程序依赖于 misc/mySymbol 导出的符号,则应使用以下示例创建驱动程序二进制文件。

% ld -dy -r -o xx xx1.o xx2.o -N misc/mySymbol

编写硬件配置文件

如果设备是非自标识设备,则内核需要该设备的硬件配置文件。如果驱动程序名为 xx,则该驱动程序的硬件配置文件应该命名为 xx.conf

在 x86 平台上,设备信息现在由引导系统提供。不再需要硬件配置文件,即使非自我识别设备也不再需要它们。

有关硬件配置文件的更多信息,请参见 driver.conf(4)pseudo(4)sbus(4)scsi_free_consistent_buf(9F)update_drv(1M) 手册页。

在硬件配置文件中可以定义任意属性。配置文件中项的形式为 property= value,其中 property 是属性名称,value 是其初始值。借助配置文件方法,可以通过更改属性值来配置设备。