MmAllocateNodePagesForMdlEx 函式 (wdm.h)
MmAllocateNodePagesForMdlEx 例程會從理想的節點配置非分頁的實體記憶體,並配置 MDL 結構來描述此記憶體。
語法
PMDL MmAllocateNodePagesForMdlEx(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes,
[in] MEMORY_CACHING_TYPE CacheType,
[in] ULONG IdealNode,
[in] ULONG Flags
);
參數
[in] LowAddress
第一個位址範圍的開頭實體位址,其中配置的頁面可以來自該範圍。 如果 MmAllocateNodePagesForMdlEx 無法配置第一個位址範圍中要求的位元元組數目,則例程會逐一查看其他位址範圍以取得更多頁面。 在每個反覆專案中,MmAllocateNodePagesForMdlEx 會將 skipBytes 的值新增至上一個起始位址,以計算下一個位址範圍的開頭。
[in] HighAddress
配置頁面可以來自之第一個位址範圍結尾的實體位址。
[in] SkipBytes
要略過上一個位址範圍開頭的位元組數目,配置的頁面可能來自該範圍。 SkipBytes 必須是虛擬記憶體頁面大小的整數倍數,以位元組為單位。
[in] TotalBytes
要配置給 MDL 的位元組總數。
[in] CacheType
MEMORY_CACHING_TYPE 值,指出所要求記憶體允許的快取類型。
[in] IdealNode
理想的節點編號。 如果多處理器系統包含 N 個節點,則有效的節點編號範圍介於 0 到 N-1 之間。 您的驅動程式可以呼叫 KeQueryHighestNodeNumber 例程,以取得最高的節點號碼。 單一處理器或非 NUMA 多處理器系統只有一個節點,節點 0,用來配置記憶體。 針對 NUMA 多處理器系統,如果可能的話,會從理想的節點進行配置。 如果理想節點中沒有足夠的記憶體來滿足配置要求,而且呼叫端未設定MM_ALLOCATE_FROM_LOCAL_NODE_ONLY旗標,MmAllocateNodePagesForMdlEx 會嘗試配置來自其他節點的記憶體。
[in] Flags
此作業的旗標。 將此參數設定為零或設定為下列一或多個旗標位的位 OR:
MM_DONT_ZERO_ALLOCATION
MM_ALLOCATE_FROM_LOCAL_NODE_ONLY
MM_ALLOCATE_FULLY_REQUIRED
MM_ALLOCATE_NO_WAIT
MM_ALLOCATE_PREFER_CONTIGUOUS
MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS
MM_ALLOCATE_AND_HOT_REMOVE
如需這些旗標的詳細資訊,請參閱 MM_ALLOCATE_XXX。
傳回值
MmAllocateNodePagesForMdlEx 如果成功,則會傳回 MDL 結構的指標。 否則,如果例程無法設定任何記憶體,則例程會傳回 NULL。
NULL 的傳回值 表示指定的位址範圍中沒有可用的實體記憶體頁面,或沒有足夠的記憶體集區可用來配置 MDL 結構。
如果例程成功配置要求記憶體的一些但並非全部,則 MDL 會描述與例程能夠配置的物理記憶體一樣多。
言論
在非統一記憶體存取 (NUMA) 多處理器系統中,呼叫端可以指定要從中配置記憶體的理想節點。 節點是處理器集合,可共用記憶體區域的快速存取權。 在非 NUMA 多處理器或單處理器系統中,MmAllocateNodePagesForMdlEx 會將所有記憶體視為屬於單一節點,並從這個節點配置記憶體。
根據預設,MmAllocateNodePagesForMdlEx 傳回的實體記憶體頁面不是連續的頁面。 呼叫端可以在 Flags 參數中設定MM_ALLOCATE_PREFER_CONTIGUOUS或MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS旗標位,以覆寫此例程的預設行為。
MmAllocateNodePagesForMdlEx 不會將配置的實體記憶體對應至虛擬記憶體。 如有必要,呼叫端可以呼叫例程,例如 MmMapLockedPagesSpecifyCache 來對應 MDL 所描述的實體記憶體頁面。
MmAllocateNodePagesForMdlEx 是針對不需要對應虛擬位址的核心模式驅動程式所設計(也就是說,它們需要實體頁面,不需要實體頁面,不需要實體連續),而對於核心模式驅動程式,如果裝置的實體記憶體配置在特定實體位址範圍中,可以達到大幅效能提升(例如, AGP 圖形適配器)。
根據要求範圍中目前可用的物理內存量而定,MmAllocateNodePagesForMdlEx 可能會傳回描述記憶體低於要求的 MDL。 如果沒有配置記憶體,例程也可能傳回 NULL。 呼叫端應該檢查實際配置的記憶體數量,如 MDL 所述。
呼叫端必須使用 MmFreePagesFromMdl 來釋放由 MmAllocateNodePagesForMdlEx所建立之 MDL 所描述的記憶體頁面。 呼叫 MmFreePagesFromMdl之後,呼叫端也必須呼叫 ExFreePool,以釋放配置給 MDL 結構的記憶體。
根據預設,MmAllocateNodePagesForMdlEx 填滿其配置零的頁面。 呼叫端可以指定MM_DONT_ZERO_ALLOCATION旗標來覆寫此預設值,並可能改善效能。
如果您指定MM_DONT_ZERO_ALLOCATION旗標,mmAllocateNodePagesForMdlEx 配置的記憶體未初始化。 如果驅動程式要讓使用者模式軟體看到記憶體,核心模式驅動程序必須先將這個記憶體零(以避免洩漏潛在的特殊許可權內容)。 如需此旗標的詳細資訊,請參閱 MM_ALLOCATE_XXX。
MmAllocateNodePagesForMdlEx 可以在單一呼叫中配置的記憶體數量上限為 (4 GB - PAGE_SIZE)。 例程只有在有足夠的頁面可用時,才能滿足此數量的配置要求。
MmAllocateNodePagesForMdlEx 會在 IRQL <= APC_LEVEL 執行。 如有必要,驅動程式可以在 DISPATCH_LEVEL 呼叫 MmAllocateNodePagesForMdlEx。 不過,您可以在 APC_LEVEL 或以下呼叫 來改善驅動程式效能。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 8 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (請參閱一節。) |