在 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 不属于读取或写入请求。 |