MmAllocateContiguousNodeMemory 函式 (wdm.h)

MmAllocateContiguousNodeMemory 例程會配置一系列連續、非分頁的實體記憶體,並將其對應至系統地址空間。

語法

PVOID MmAllocateContiguousNodeMemory(
  [in]           SIZE_T           NumberOfBytes,
  [in]           PHYSICAL_ADDRESS LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
  [in]           ULONG            Protect,
  [in]           NODE_REQUIREMENT PreferredNode
);

參數

[in] NumberOfBytes

要配置的連續記憶體區塊大小,以位元組為單位。 如需詳細資訊,請參閱<備註>。

[in] LowestAcceptableAddress

呼叫端可以使用的最低有效實體位址。 例如,如果裝置只能尋址處理器實體記憶體位址範圍前 8 MB 以上的位置,則此裝置的驅動程式應該將 LowestAcceptableAddress 設定為 0x0000000000800000。

[in] HighestAcceptableAddress

呼叫端可以使用的最高有效實體位址。 例如,如果裝置只能尋址處理器實體記憶體位址範圍的前 16 MB 位置,則此裝置的驅動程式應該將 HighestAcceptableAddress 設定為 0x0000000000FFFFFF。

[in, optional] BoundaryAddressMultiple

配置緩衝區不可跨越的實體位址倍數。 實體位址倍數一律必須是兩個的乘冪。 此參數是選擇性的,可以指定為零,表示裝置沒有特殊的記憶體界限限制。 如需詳細資訊,請參閱<備註>。

[in] Protect

標幟位,指定要用於配置記憶體的保護。 呼叫端必須在 Protect 參數中設定一個 (,但不能同時設定下列旗標位的) 。

旗標位 意義
PAGE_READWRITE 配置讀取/寫入、無執行 (NX) 記憶體。 大部分的呼叫端都應該設定此旗標位。 如需詳細資訊,請參閱<備註>。
PAGE_EXECUTE_READWRITE 配置可執行的讀取/寫入記憶體。 只有當呼叫端需要能夠在配置的記憶體中執行指令時,才應該設定這個旗標位。

此外,呼叫端可以在 Protect 參數中設定一個 (,但不能同時設定下列選擇性旗標位) 。

旗標位 意義
PAGE_NOCACHE 配置非快取記憶體。 此旗標位實際上類似於呼叫 MmAllocateContiguousMemorySpecifyCache ,且 CacheType 設定為 MmNonCached
PAGE_WRITECOMBINE 配置寫入合併的記憶體。 此旗標位實際上類似於呼叫 MmAllocateContiguousMemorySpecifyCache且 CacheType 設定為 MmWriteCombined

如果未指定PAGE_NOCACHE或PAGE_WRITECOMBINE,則會完全快取配置的記憶體。 在此情況下,效果類似於呼叫 MmAllocateContiguousMemorySpecifyCache ,並將 CacheType 設定為 MmCached

[in] PreferredNode

慣用的節點編號。 如果多處理器系統包含 N 個節點,則節點編號為 0 到 N-1。 如果呼叫端將 PreferredNode 設定為 MM_ANY_NODE_OK,例程會選擇要配置記憶體的來源節點。 否則,如果指定的位址範圍中的記憶體無法從慣用節點配置,則例程會傳回 NULL

傳回值

MmAllocateContiguousNodeMemory 會傳回已配置記憶體的基底虛擬位址。 如果無法滿足要求,例程會傳回 NULL

備註

核心模式設備驅動器會呼叫此例程,以配置連續的實體記憶體區塊。 呼叫驅動程式可以指定是否要使用無執行 (NX) 記憶體進行配置。 在非統一記憶體存取 (NUMA) 多處理器系統中,呼叫端可以指定用來配置記憶體的慣用節點。 節點是處理器的集合,可共用快速存取記憶體區域。 在非 NUMA 多處理器或單一處理器系統中, MmAllocateContiguousNodeMemory 會將所有記憶體視為屬於單一節點,並從這個節點配置記憶體。

MmAllocateContiguousNodeMemory 會配置實體位址空間中連續的非分頁記憶體區塊。 例程會將此區塊對應至系統位址空間中連續的虛擬記憶體區塊,並傳回此區塊基底的虛擬位址。 例程會將連續記憶體配置的起始位址對齊記憶體分頁界限。

驅動程式不能存取超過要求配置大小的記憶體。 例如,開發人員不應該假設其驅動程式可以在要求的配置結尾與下一個頁面界限之間安全地使用記憶體。

由於連續的實體記憶體通常提供較短,因此應該謹慎使用,而且只有在需要時才使用。 在驅動程式初始化期間,必須使用連續記憶體的驅動程序應該配置此記憶體,因為當操作系統配置並釋放記憶體時,實體記憶體可能會隨著時間分散。 一般而言,驅動程式會從 DriverEntry 例程呼叫 MmAllocateContiguousNodeMemory 來配置內部緩衝區以供長期使用,並在卸除驅動程式之前釋放緩衝區。

當不再需要記憶體時,必須釋放 MmAllocateContiguousNodeMemory 所配置的記憶體。 呼叫 MmFreeContiguousMemory 例程來釋放 MmAllocateContiguousNodeMemory 所配置的記憶體。

MmAllocateContiguousNodeMemory 類似於 MmAllocateContiguousMemorySpecifyCacheNode 例程。 不同於 MmAllocateContiguousMemorySpecifyCacheNode,MmAllocateContiguousNodeMemory 可用來配置無執行 (NX) 記憶體。 最佳做法是,除非驅動程序明確要求能夠在配置的記憶體中執行指令,否則驅動程式應該配置 NX 記憶體。 藉由配置 NX 記憶體,驅動程式會防止惡意軟體在此記憶體中執行指示來改善安全性。 MmAllocateContiguousMemoryMmAllocateContiguousMemorySpecifyCacheMmAllocateContiguousMemorySpecifyCacheNode 例程所配置的記憶體一律為可執行檔。

如果您為 BoundaryAddressMultiple 參數指定非零值,則配置記憶體區塊的實體地址範圍將不會跨越這個值之整數倍數的位址界限。 除非需要非零值才能解決硬體限制,否則驅動程式應將此參數設定為零。 例如,如果裝置無法跨 16 MB 的實體界限傳輸數據,驅動程式應該指定此參數的 0x1000000 值,以確保裝置看到的位址不會繞著 16 MB 界限。

MmAllocateContiguousNodeMemory 配置的記憶體未初始化。 如果核心模式驅動程式要讓使用者模式軟體看見 (,以避免) 外泄潛在特殊許可權的內容,則核心模式驅動程式必須先將這個記憶體零。

規格需求

需求
最低支援的用戶端 從 Windows 8 開始提供。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

另請參閱

DriverEntry

MmAllocateContiguousMemory

MmAllocateContiguousMemorySpecifyCache

MmAllocateContiguousMemorySpecifyCacheNode

MmFreeContiguousMemory