SCSI 端口 I/O 模型

SCSI 端口驱动程序通过其调度表和驱动程序对象中一系列指向微型端口驱动程序回调例程的指针,与微型端口驱动程序通信。 微型端口驱动程序从 DriverEntry 例程调用 ScsiPortInitialize,以便使用这些回调指针初始化 SCSI 端口的调度表和驱动程序对象。 一个这样的回调指针是微型端口驱动程序的启动 I/O 例程的入口点,用于处理 I/O 请求。 端口驱动程序将此指针分配给驱动程序对象的 DriverStartIo 成员。

每当 SCSI 端口从更高级别驱动程序接收 I/O 请求时,它会将请求排入内部队列。 有关 SCSI 端口的内部队列的详细信息,请参阅 SCSI 端口驱动程序的队列管理

目标设备准备好接收下一个 I/O 请求后,SCSI 端口将调用 IoStartPacket,后者又调用存储在 DriverObject-DriverStartIo> 中的微型端口驱动程序启动 I/O 回调例程。 有关微型端口驱动程序启动 I/O 例程的作和必需特征的信息,请参阅 SCSI 微型端口驱动程序的 HwScsiStartIo 例程

SCSI 端口在调用微型端口驱动程序的启动 I/O 例程之前,会提升处理器的中断请求级别 (IRQL),以便屏蔽中断并确保启动 I/O 例程能够同步访问关键操作系统和驱动程序结构。

虽然存储类驱动程序与 SCSI 端口驱动程序之间的 I/O 请求数据包流是异步的,但 SCSI 端口驱动程序与目标设备之间的 I/O 请求数据包流是同步的。 SCSI 端口使用内部队列系统,使类驱动程序可以在以前的 I/O 请求完成之前将新的 I/O 请求发送到 SCSI 端口。 但是,SCSI 端口不会向目标设备发送下一个 I/O 请求,直到它从微型端口驱动程序收到通知,即微型端口驱动程序已准备好接收下一个 I/O 请求。 微型端口驱动程序通过调用 ScsiPortNotification 库例程通知 SCSI 端口。

Storport 驱动程序提供更灵活的 I/O 模型,特别是在中断掩码方面。 有关 Storport I/O 模型与 SCSI 端口 I/O 模型之间的差异的信息,请参阅 Storport I/O 模型