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 端口。 但是,在从微型端口驱动程序收到微型端口驱动程序已准备好接收下一个 I/O 请求的通知之前,SCSI 端口不会向目标设备发送下一个 I/O 请求。 微型端口驱动程序通过调用 ScsiPortNotification 库例程来通知 SCSI 端口。
Storport 驱动程序提供更灵活的 I/O 模型,特别是在屏蔽中断方面。 有关 Storport I/O 模型与 SCSI 端口 I/O 模型之间的差异的信息,请参阅 Storport I/O 模型。