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.  编译、装入、打包和测试驱动程序

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

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Oracle Solaris DDI/DKI 服务汇总

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

64 位驱动程序设计简介

常规转换步骤

使用硬件寄存器的固定宽度类型

使用固定宽度的公共访问函数

检查并扩展派生类型的用法

检查 DDI 数据结构中更改的字段

buf 结构更改

ddi_dma_attr

ddi_dma_cookie 结构更改

csi_arq_status 结构更改

scsi_pkt 结构更改

检查 DDI 函数中更改的参数

getrbuf() 参数更改

drv_getparm() 参数更改

delay()timeout() 参数更改

rmallocmap()rmallocmap_wait() 参数更改

scsi_alloc_consistent_buf() 参数更改

uiomove() 参数更改

cv_timedwait()cv_timedwait_sig() 参数更改

ddi_device_copy() 参数更改

ddi_device_zero() 参数更改

ddi_dma_mem_alloc() 参数更改

修改处理数据共享的例程

ioctl() 中的数据共享

devmap() 中的数据共享

mmap() 中的数据共享

检查 x86 平台上 64 位 Long 数据类型的结构

已知的 ioctl 接口

设备大小

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

E.  pci.conf 文件

索引

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

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

64 位驱动程序设计简介

对于仅需支持 32 位内核的驱动程序,现有 32 位设备驱动程序将仍然有效,无需重新编译。但是,大多数设备驱动程序需要进行一些更改才能在 64 位内核中正确运行,且所有设备驱动程序都需要重新编译以创建 64 位驱动程序模块。本附录中的信息旨在指导您利用通用源代码来生成 32 位和 64 位环境的驱动程序,从而提高代码可移植性并降低维护工作量。

开始修改设备驱动程序以便使用 64 位环境之前,应了解 32 位环境与 64 位环境之间的区别。特别是必须熟悉 C 语言数据类型模型 ILP32 和 LP64。请参见下表。

表 C-1 ILP32 与 LP64 数据类型对比

C 类型
ILP32
LP64
char
8
8
short
16
16
int
32
32
long
32
64
long long
64
64
float
32
32
double
64
64
long double
96
128
pointer
32
64

因 ILP32 与 LP64 之间的差异而导致的特定于驱动程序的问题是本附录的主题。

除了清理常规代码以支持 LP64 的数据模型更改,驱动程序编写人员还必须提供对 32 位和 64 位应用程序的支持。

ioctl(9E)、devmap(9E) 和 mmap(9E) 入口点使应用程序和设备驱动程序之间可直接共享数据结构。如果这些数据结构在 32 位环境与 64 位环境中的大小不同,则必须修改入口点,以便驱动程序可确定应用程序的数据模型与内核的数据模型是否相同。如果数据模型不同,则可对数据结构进行调整。请参见对有 64 位处理能力的设备驱动程序的 I/O 控制支持32 位和 64 位数据结构宏将内核内存与用户映射相关联

在许多驱动程序中,只有少量 ioctl 需要这种处理。其他 ioctl 无需更改即可应用,只要这些 ioctl 传递的数据结构大小不变。