DMA 操作接口版本 3
DMA 操作接口的版本 3 从 Windows 8 开始可用。 此接口 的DMA_OPERATIONS 结构包含许多在此接口的早期版本中未定义的新例程。 有关版本 3 中例程的列表,请参阅 DMA_OPERATIONS。
尽管 DMA 操作接口版本 3 适用于所有 Windows 硬件平台,但此接口具有许多功能,使内核模式驱动程序能够使用芯片上的系统 (SoC) 集成电路中的系统 DMA 控制器的高级功能。 这些功能通常包括执行散点/收集 DMA 传输的功能。 相比之下,以前版本的 DMA 操作接口限制到总线主设备的散点/收集 DMA 传输。 版本 3 接口简化了散点/收集列表的管理,并减少了在复杂 DMA 传输期间对驱动程序干预的需求。
若要使用版本 3 的 DMA 操作接口执行 DMA 传输,驱动程序通常调用以下例程:
IoGetDmaAdapter
分配 DMA 适配器对象并返回指向包含 DMA 操作接口 的 DMA_ADAPTER 结构的指针。
GetDmaTransferInfo
提供执行调用方描述的 DMA 传输所需的资源的说明。
AllocateAdapterChannelEx
分配 DMA 传输所需的资源,并将这些资源分配给 DMA 适配器对象。
MapTransferEx
初始化映射寄存器和 DMA 传输的散点/收集缓冲区,并启动传输。
FlushAdapterBuffersEx
执行 DMA 传输结束时可能需要的任何缓存操作。
FreeAdapterChannel
释放 DMA 通道和映射寄存器。
PutDmaAdapter
释放适配器对象。
这些例程既用于使用专用 DMA 控制器的总线主设备,也用于共享系统 DMA 控制器的从属设备。 有关驱动程序在典型 DMA 传输期间发出的调用的分步说明,请参阅 版本 3 DMA 例程的基本调用模式。
注意 在 DMA 操作接口版本 3 中,在 DMA 传输之前或之后都不需要调用 KeFlushIoBuffers 例程。 原因是以下例程涵盖了在未在硬件中强制实施缓存一致性的平台上刷新数据缓存的需要:
- MapTransferEx 确保在写入 (内存到设备) 传输之前刷新处理器数据缓存。
- FlushAdapterBuffersEx 确保在读取 (设备到内存) 传输后,缓存失效。
在 x86 或 x64 处理器上, KeFlushIoBuffers 调用不执行任何操作,此调用虽然不必要,但不会干扰硬件平台的操作。 在 Arm 处理器上,在 DMA 传输期间调用 KeFlushIoBuffers 会执行不必要的缓存操作,并且可能会降低性能。