共用方式為


使用 Packet-Based Bus-Master DMA

若要使用以封包為基礎的 DMA,匯流排主機 DMA 裝置的驅動程式會在處理要求 DMA 傳輸的 IRP 時呼叫下列一般支援常式:

  • KeFlushIoBuffers 剛好在嘗試為傳輸要求配置對應暫存器 (以取得詳細資訊,請參閱 維護快取一致性)

  • 當驅動程式準備好為 DMA 設計匯流排主機介面卡時,AllocateAdapterChannel

  • MmGetMdlVirtualAddress 以取得 MDL 的索引,需要做為 MapTransfer的初始參數,以及 MapTransfer 讓系統實體記憶體備份 IRP 的緩衝區裝置可存取

    請注意,任何驅動程式可能需要執行多個傳輸作業,才能滿足目前的 IRP,如 分割傳輸要求中所述。 沒有散佈/收集功能的裝置驅動程式可以針對每個傳輸作業呼叫 MapTransfer 一次。 具有散佈/收集功能的裝置驅動程式可以多次呼叫 MapTransfer 來設定每個傳輸作業。 或者,這些驅動程式可以使用系統的內建散佈圖/收集支援,如 使用散佈圖/收集 DMA中所述。

  • 在目標裝置的每個 DMA 傳輸作業結束時,FlushAdapterBuffers,以判斷是否已完全傳輸所有要求的資料

  • 只要完成目前 IRP 的所有 DMA 作業,FreeMapRegisters,因為所有要求的資料都已完全傳輸,或因為驅動程式必須因為裝置或匯流排 I/O 錯誤而失敗 IRP

IoGetDmaAdapter傳回的配接器物件指標是AllocateAdapterChannelMapTransferFlushAdapterBuffersFreeMapRegisters的必要參數。 請注意,在 Windows 2000 之前的 Windows NT 版本中,匯流排主機裝置可以將Null配接器物件指標傳遞至MapTransferFlushAdapterBuffers。 在 Windows 2000 和更新版本中,驅動程式無法再執行此動作。

KeFlushIoBuffersMmGetMdlVirtualAddress 需要 Irp-MdlAddress >上 MDL 的指標。

個別驅動程式會根據每個驅動程式如何實作服務其裝置,在不同的時間點呼叫此支援常式序列。 例如,某個驅動程式的 StartIo 常式可能會呼叫 AllocateAdapterChannel,而另一個驅動程式可能會從從驅動程式建立的內嵌佇列或裝置佇列中移除 IRP 的常式進行此呼叫。

除了使用本節中所述的常式,任何使用封包型 DMA 的驅動程式都可以使用支援常式來簡化散佈/收集 DMA,不論其裝置是否有內建散佈/收集支援。 如需詳細資訊 ,請參閱使用散佈圖/收集 DMA