共用方式為


DMA 作業介面的第 3 版

DMA 作業介面的第 3 版從 Windows 8 開始可供使用。 這個介面 的DMA_OPERATIONS 結構包含一些未在此介面舊版中定義的新常式。 如需第 3 版中的常式清單,請參閱 DMA_OPERATIONS

雖然 DMA 作業介面第 3 版可在所有 Windows 硬體平臺上使用,但此介面有許多功能,可讓核心模式驅動程式在 Chip (SoC) 整合電路的系統上使用系統 DMA 控制器的進階功能。 這些功能通常包括執行散佈/收集 DMA 傳輸的能力。 相反地,舊版的 DMA 作業介面會限制散佈/收集 DMA 傳輸至匯流排主要裝置。 第 3 版介面可簡化散佈圖/收集清單的管理,並降低複雜 DMA 傳輸期間驅動程式介入的需求。

若要使用 DMA 作業介面第 3 版來執行 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 會執行不必要的快取作業,而且可能會降低效能。