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

退出打印视图

更新时间: 2014 年 9 月
 
 

常规控制流程

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

  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 总线适配器,可以在主机总线适配器驱动程序中执行目标驱动程序函数。