JavaScript is required to for searching.
跳过导航链接
退出打印视图
编写设备驱动程序     Oracle Solaris 10 1/13 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 目标驱动程序

目标驱动程序介绍

Sun 公用 SCSI 体系结构概述

常规控制流程

SCSA 函数

硬件配置文件

声明和数据结构

scsi_device 结构

scsi_pkt 结构(目标驱动程序)

SCSI 目标驱动程序的自动配置

probe() 入口点(SCSI 目标驱动程序)

attach() 入口点(SCSI 目标驱动程序)

detach() 入口点(SCSI 目标驱动程序)

getinfo() 入口点(SCSI 目标驱动程序)

资源分配

scsi_init_pkt() 函数

scsi_sync_pkt() 函数

scsi_destroy_pkt() 函数

scsi_alloc_consistent_buf() 函数

scsi_free_consistent_buf() 函数

生成和传输命令

生成命令

设置目标功能

传输命令

同步 scsi_transport() 函数

命令完成

重新使用包

自动请求检测模式

转储处理

SCSI 选项

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

19.  网络设备驱动程序

20.  USB 驱动程序

21.  SR-IOV 驱动程序

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

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

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

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Solaris DDI/DKI 服务汇总

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

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

E.  pci.conf 文件

索引

Sun 公用 SCSI 体系结构概述

Sun 公用 SCSI 体系结构 (Sun Common SCSI Architecture, SCSA) 是用于将 SCSI 命令从目标驱动程序传输到主机总线适配器驱动程序的 Oracle Solaris DDI/DKI 编程接口。该接口与主机总线适配器硬件的类型、平台、处理器体系结构以及通过该接口传输的 SCSI 命令无关。

只要符合 SCSA,目标驱动程序便可以将 SCSI 命令传送给目标设备,而无需了解主机总线适配器的硬件实现。

SCSA 在概念上将生成 SCSI 命令与通过 SCSI 总线传输命令和数据这两个过程分离开来。该体系结构定义了高级别软件组件与低级别软件组件之间的软件接口。较高级别的软件组件由一个或多个 SCSI 目标驱动程序组成,这些驱动程序可将 I/O 请求转换为适用于外围设备的 SCSI 命令。以下示例说明了 SCSI 体系结构。

图 17-1 SCSA 块图

image:图中显示了 Sun 公用 SCSI 体系结构相对于操作系统中的 SCSI 驱动程序的角色。

较低级别的软件组件由 SCSA 接口层和一个或多个主机总线适配器驱动程序组成。目标驱动程序负责生成执行所需功能需要的正确 SCSI 命令,并负责处理结果。

常规控制流程

以下步骤介绍读取或写入请求的常规控制流程(假定没有发生传输错误)。

  1. 调用目标驱动程序的 read(9E)write(9E) 入口点。使用 physio(9F) 锁定内存,准备 buf 结构并调用策略例程。

  2. 目标驱动程序的 strategy(9E) 例程将检查请求。然后,strategy() 通过使用 scsi_init_pkt(9F) 来分配 scsi_pkt(9S)。目标驱动程序初始化包,并使用 scsi_setup_cdb(9F) 函数设置 SCSI 命令描述符块 (command descriptor block, CDB)。目标驱动程序还指定超时。然后,该驱动程序提供一个指向回调函数的指针。完成命令后,主机总线适配器驱动程序将调用该回调函数。buf(9S) 指针应保存在 SCSI 包的目标专用空间中。

  3. 目标驱动程序使用 scsi_transport(9F) 将包提交给主机总线适配器驱动程序。然后,目标驱动程序可以自由接受其他请求。目标驱动程序不应在包的传输过程中对其进行访问。如果主机总线适配器驱动程序或目标支持排队,则可以在传输包时提交新请求。

  4. 一旦 SCSI 总线空闲而且目标不繁忙,主机总线适配器驱动程序便会选择该目标并传递 CDB。目标驱动程序将执行命令。然后,目标执行所请求的数据传输。

  5. 目标发送完成状态并且命令完成后,主机总线适配器驱动程序会通知目标驱动程序。要执行通知,主机应调用 SCSI 包中指定的完成函数。此时,主机总线适配器驱动程序不再负责处理该包,同时目标驱动程序重新获得了对该包的拥有权。

  6. SCSI 包的完成例程将分析返回的信息。然后,完成例程会确定 SCSI 操作是否成功。如果出现故障,目标驱动程序将再次调用 scsi_transport(9F) 以重试命令。如果主机总线适配器驱动程序不支持自动请求检测,则目标驱动程序必须在出现检查条件时,提交请求检测包才能检索检测数据。

  7. 成功完成上述操作后或者如果无法重试命令,目标驱动程序将调用 scsi_destroy_pkt(9F)scsi_destroy_pkt () 将同步数据。然后,scsi_destroy_pkt() 释放包。如果在释放包之前目标驱动程序需要访问数据,则调用 scsi_sync_pkt(9F)

  8. 最后,目标驱动程序将通知请求应用程序读取或写入事务已完成。该通知是在执行了字符设备的驱动程序中的 read(9E) 入口点并返回后进行的。否则,会通过 biodone(9F) 间接发出通知。

SCSA 允许以重叠方式和排队方式在进程的各个点执行多个此类操作。在该模型中,系统资源由主机总线适配器驱动程序负责管理。借助软件接口并使用不同复杂程度的 SCSI 总线适配器,可以在主机总线适配器驱动程序中执行目标驱动程序函数。

SCSA 函数

SCSA 定义了多种函数,用于管理资源的分配和释放、控制状态的检测和设置以及 SCSI 命令的传输。下表中列出了这些函数。

表 17-1 标准 SCSA 函数

函数名
类别
错误处理
传输信息和控制
资源管理
轮询 I/O
探测器函数
CDB 初始化函数
命令传输

注 - 如果驱动程序需要使用 SCSI-1 设备,请使用 makecom(9F)