共用方式為


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 配置至少一頁記憶體,不論要求的長度 長度為何。 在成功要求少於PAGE_SIZE個字節的配置之後,呼叫端只能存取所要求的 Length。 在成功要求超過整數倍數的PAGE_SIZE個字節之後,呼叫端無法存取最後一個配置頁面上的任何剩餘位元組。

如果驅動程式需要數頁的通用緩衝區空間,但頁面不需要連續,驅動程式應該對 AllocateCommonBuffer 進行數個單頁要求,而不是一個大型要求。 此方法會節省連續記憶體。

驅動程式通常會在回應 PnP IRP_MN_START_DEVICE 要求期間,呼叫 AllocateCommonBuffer 作為裝置啟動的一部分。 啟動之後,如果有任何要求,就可能只有一頁要求成功。

要求

要求 價值
最低支援的用戶端 從 Windows 2000 開始提供。
目標平臺 桌面
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
IRQL PASSIVE_LEVEL
DDI 合規性規則 IrqlDispatch(wdm)

另請參閱

DMA_ADAPTER

DMA_OPERATIONS

FreeCommonBuffer

IoGetDmaAdapter