PALLOCATE_COMMON_BUFFER回呼函式 (wdm.h)
AllocateCommonBuffer 例程會配置記憶體並加以對應,以便從處理器和裝置同時存取 DMA 作業。
語法
PALLOCATE_COMMON_BUFFER PallocateCommonBuffer;
PVOID PallocateCommonBuffer(
[in] PDMA_ADAPTER DmaAdapter,
[in] ULONG Length,
[out] PPHYSICAL_ADDRESS LogicalAddress,
[in] BOOLEAN CacheEnabled
)
{...}
參數
[in] DmaAdapter
IoGetDmaAdapter 所傳回之 DMA_ADAPTER 結構的指標, 代表總線主要適配卡或 DMA 控制器。
[in] Length
指定要配置的記憶體位元組數目。
[out] LogicalAddress
接收裝置可用來存取配置緩衝區之邏輯位址的變數指標。 使用此位址,而不是呼叫 MmGetPhysicalAddress,因為系統可以考慮任何平臺特定的記憶體限制。
[in] CacheEnabled
指定是否可以快取配置的記憶體。
這個參數會被忽略。 作系統會決定是否要在要配置的通用緩衝區中啟用快取記憶體。 該決策是以處理器架構和裝置總線為基礎。
在 x86 型、x64 型和 Itanium 型處理器的電腦上,會啟用快取的記憶體。 假設裝置執行的所有 DMA 作業都與相關的 CPU 快取一致,這可能會快取該記憶體。 如果您的驅動程式需要停用快取,請改為呼叫 AllocateCommonBufferEx。
在具有ARM或ARM 64處理器的電腦上,作系統不會自動啟用所有裝置的快取記憶體。 系統依賴每個裝置的 ACPI_CCA 方法來判斷裝置是否快取一致。
傳回值
AllocateCommonBuffer 會傳回配置範圍的基底虛擬位址。 如果無法設定緩衝區,它會 NULL傳回 。
言論
AllocateCommonBuffer 不是可以直接依名稱呼叫的系統例程。 這個例程只能由 DMA_OPERATIONS 結構中傳回之位址的指標呼叫。 驅動程式藉由呼叫ioGetDmaAdapter 來取得此例程的位址。
AllocateCommonBuffer 支援 DMA,其中裝置和處理器會持續透過系統記憶體進行通訊,就像總線主機 DMA 裝置的控制結構一樣。
AllocateCommonBuffer 也支援使用系統 DMA 控制器自動初始化模式的附屬裝置。
AllocateCommonBuffer 會執行下列動作:
- 配置可從處理器和裝置連線到的記憶體。 此記憶體會與裝置連續顯示。
- 如果系統需要,配置對應緩存器來對應緩衝區。
- 設定裝置的翻譯,包括視需要載入地圖快取器。
如果驅動程式需要數頁的通用緩衝區空間,但頁面不需要連續,驅動程式應該對 AllocateCommonBuffer 進行數個單頁要求,而不是一個大型要求。 此方法會節省連續記憶體。
驅動程式通常會在回應 PnP IRP_MN_START_DEVICE 要求期間,呼叫 AllocateCommonBuffer 作為裝置啟動的一部分。 啟動之後,如果有任何要求,就可能只有一頁要求成功。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 桌面 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
IRQL | PASSIVE_LEVEL |
DDI 合規性規則 | IrqlDispatch(wdm) |