共用方式為


使用 Common-Buffer Bus-Master DMA

使用 Bus-Master DMA中所述,匯流排主機 DMA 裝置的某些驅動程式會獨佔使用 common-buffer DMA,而有些則使用 common-buffer DMA 與封包型 DMA 搭配使用。

以經濟方式使用 common-buffer DMA。 設定一般緩衝區可能會系結一些 (或全部,取決於對應暫存器) 與代表匯流排主機介面卡之配接器物件相關聯的對應暫存器大小。

以經濟方式設定通用緩衝區區域,例如使用 PAGE_SIZE 區塊或單一配置,讓封包型 DMA 作業有更多對應暫存器可供使用。 它也會讓更多系統記憶體可供其他用途使用,這會產生更佳的整體驅動程式和系統效能。

若要設定匯流排主機 DMA 的一般緩衝區,匯流排主機 DMA 設備磁碟機必須呼叫 AllocateCommonBuffer ,並使用 IoGetDmaAdapter所傳回的配接器物件指標呼叫 AllocateCommonBuffer。 一般而言,驅動程式會從 其 DispatchPnP 常式針對 IRP_MN_START_DEVICE 要求進行此呼叫。 只有在驅動程式在驅動程式保持載入時,將緩衝區重複用於其 DMA 作業時,驅動程式才應該配置一般緩衝區。 下圖說明對 AllocateCommonBuffer的這類呼叫。

圖表說明匯流排主機 dma 的一般緩衝區配置。

在上圖中顯示為 LengthForBuffer 的緩衝區要求大小,決定必須使用多少對應暫存器來提供一般緩衝區的虛擬對邏輯對應。 使用 BYTES_TO_PAGES 宏來判斷 (BYTES_TO_PAGES (LengthForBuffer) ) 所需的最大頁數。 這個值不能大於IoGetDmaAdapter傳回的NumberOfMapRegisters

此外,呼叫端必須提供下列專案:

  • 布林值,指出是否應該啟用快取

    注意 忽略此值。 作業系統會決定是否要在要配置的一般緩衝區中啟用快取記憶體。 該決策是以處理器架構和裝置匯流排為基礎。

    在 x86 型、x64 型和 Itanium 型處理器的電腦上,會啟用快取的記憶體。

    在具有 Arm 或 Arm 64 處理器的電腦上,作業系統不會自動啟用所有裝置的快取記憶體。 系統會依賴每個裝置的 ACPI_CCA 方法來判斷裝置是否為快取一致。

  • 驅動程式定義變數的指標,其中包含上圖中緩衝區 (BufferLogicalAddress 的裝置可存取基底邏輯位址,) 從AllocateCommonBuffer傳回

如果呼叫成功, AllocateCommonBuffer 會傳回上圖中緩衝區 (BufferVirtualAddress 的驅動程式可存取基底虛擬位址) ,驅動程式必須在其裝置擴充功能、控制器擴充功能或其他驅動程式可存取的存放區中儲存 (驅動程式) 配置的非分頁集區。

AllocateCommonBuffer 如果無法為緩衝區配置記憶體,則會傳回 Null 。 如果傳回的基底虛擬位址為 Null,則驅動程式必須以獨佔方式使用系統的封包型 DMA 支援,否則驅動程式必須失敗 IRP_MN_START_DEVICE 要求,並傳回STATUS_INSUFFICIENT_RESOURCES。

否則,驅動程式可以使用配置的通用緩衝區作為 DMA 傳輸的驅動程式和介面卡可存取儲存區域。

當 PnP 管理員傳送停止或移除裝置的 IRP 時,驅動程式必須呼叫 FreeCommonBuffer 以釋放它配置的每個通用緩衝區。