在 Storport I/O 模型中使用映射缓冲区

在 SCSI 端口 I/O 模型中,微型端口驱动程序可能要求端口驱动程序为 SRB I/O 缓冲区分配和映射系统虚拟内存。 微型端口驱动程序通过将 PORT_CONFIGURATION_INFORMATION (SCSI) 结构的 MapBuffers 成员设置为 TRUE 来配置端口驱动程序以映射 I/O 缓冲区。

如果端口驱动程序配置为 MapBuffers 设置为 TRUE,微型端口驱动程序接收的每个 SRB 的 DataBuffer 成员将包含 I/O 缓冲区的系统虚拟地址。 此地址在系统中所有进程的地址空间中有效。 此外,微型端口驱动程序也可以直接访问 I/O 缓冲区。

另一方面,如果微型端口驱动程序将 MapBuffers 设置为 FALSE则 DataBuffer 将包含属于特定进程的虚拟地址,该地址在运行微型端口驱动程序的上下文中不一定有效。 因此,微型端口驱动程序将无法访问 DataBuffer 指向的内存区域。

在 Storport I/O 模型中,微型端口驱动程序需要支持基于 DMA 的 I/O。 使用 DMA 时,微型端口驱动程序应无需通过系统范围的虚拟地址间接访问 SRB 的 I/O 缓冲区。 鉴于此,Storport I/O 模型为 PORT_CONFIGURATION_INFORMATION (STORPORT 的 MapBuffers 成员定义一组不同的值) 。

含义

STOR_MAP_NO_BUFFERS

Storport 驱动程序不会映射任何类型的 SRB 的数据缓冲区。 因此,其微型端口驱动程序 不得 直接访问 DataBuffer 成员在其接收的任何 SRB 中指向的数据。

STOR_MAP_ALL_BUFFERS

当前尚未实现此功能。 如果 为 MapBuffers 成员分配了此值,则 Storport 驱动程序会将其解释为STOR_MAP_NON_READ_WRITE_BUFFERS。

STOR_MAP_NON_READ_WRITE_BUFFERS

Storport 驱动程序映射请求的数据缓冲区,前提是它不是 (读取和写入) 请求的数据传输。 同样,微型端口驱动程序可以访问 SRB 中的数据,前提是 SRB 不属于读取或写入请求。