資料複製和快取原則

WaveCyclic 迷你埠驅動程式會在 HD 音訊控制器硬體存取的 DMA 緩衝區與使用者模式音訊應用程式存取的用戶端緩衝區之間複製音訊資料:

  • 針對播放資料流程,驅動程式會將資料從用戶端緩衝區複製到 DMA 緩衝區。

  • 針對擷取資料流程,驅動程式會將資料從 DMA 緩衝區複製到用戶端緩衝區。

針對播放和擷取資料流程,驅動程式可以藉由啟用快取 DMA 緩衝區記憶體 (快取類型 MmCached) ,並依賴 PCI 控制器的匯流排探查機制來確保快取一致性,以達到最佳效能。 不過,某些 PCI Express 控制器實作不會探查 HD 音訊控制器的同步資料傳輸 (,例如 Intel 的初始 PCI Express 晶片組) 。

函式驅動程式無法偵測 PCI 控制器硬體是否支援對 DMA 緩衝區傳輸進行探查,或執行連續資料傳輸。 為避免潛在的快取共通問題,驅動程式會將該記憶體的快取類型指定為 MmWriteCombined,以停用 DMA 緩衝區記憶體的快取。 (MmNonCached 也可運作,但可能無法執行。) 如果您撰寫以範例函式驅動程式為基礎的自訂配接器驅動程式,則 WaveCyclic 迷你埠驅動程式的行為應該類似,除非您可以確認 PCI 控制器確實支援 DMA 緩衝區傳輸的探查。

若要支援未執行匯流排探查的裝置和系統,自訂函式驅動程式必須遵循下列規則:

  • 針對播放資料流程,請將 DMA 緩衝區的快取類型指定為 MmWriteCombined。 將資料區塊從用戶端緩衝區複製到 DMA 緩衝區之後,請呼叫 KeMemoryBarrier 函式,讓 DMA 引擎可以看到資料。 KeMemoryBarrier 會以有效率的方式將複製的資料排清記憶體,讓處理器的資料快取大幅取消干擾。

  • 針對擷取資料流程,請將 DMA 緩衝區的快取類型指定為 MmWriteCombinedMmNonCached。 此外,函式驅動程式應該避免寫入 DMA 緩衝區。 如果它必須執行音訊樣本的就地處理,它應該先複製其他位置的資料。

函式驅動程式複製到 DMA 緩衝區或從 DMA 緩衝區複製的資料區塊不需要在寫入合併緩衝區界限上開始或結束,而且其大小不需要是寫入合併緩衝區大小的倍數 (通常為 32 或 64 個位元組) 。

對於使用 DDI HDAUDIO_BUS_INTERFACE_BDL 版本的編解碼器函式驅動程式, AllocateContiguousDmaBuffer 常式會同時執行 DMA 緩衝區記憶體的配置和對應。 常式一律會將緩衝區的快取類型設定為 MmWriteCombined

如需寫入合併的詳細資訊,請參閱 Intel 網站上的 IA-32 Intel Architecture Software Developer's Manual。