共用方式為


MmAllocateContiguousMemorySpecifyCacheNode 函式 (wdm.h)

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

語法

PVOID MmAllocateContiguousMemorySpecifyCacheNode(
  [in]           SIZE_T              NumberOfBytes,
  [in]           PHYSICAL_ADDRESS    LowestAcceptableAddress,
  [in]           PHYSICAL_ADDRESS    HighestAcceptableAddress,
  [in, optional] PHYSICAL_ADDRESS    BoundaryAddressMultiple,
  [in]           MEMORY_CACHING_TYPE CacheType,
  [in]           NODE_REQUIREMENT    PreferredNode
);

參數

[in] NumberOfBytes

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

[in] LowestAcceptableAddress

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

[in] HighestAcceptableAddress

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

[in, optional] BoundaryAddressMultiple

配置之緩衝區不可交叉的實體位址倍數。 實體位址倍數一定是兩個電源。 這個參數是選擇性的,可以指定為零,表示裝置沒有特殊的記憶體界限限制。 如需詳細資訊,請參閱。

[in] CacheType

指定 MEMORY_CACHING_TYPE 值,指出連續物理記憶體所要求的快取類型。

[in] PreferredNode

慣用的節點編號。 如果多處理器系統包含 N 個節點,則節點編號為 0 到 N-1。 如果指定MM_ANY_NODE_OK,或計算機只有一個節點,則會滿足來自任何節點的配置。 否則,會從慣用節點進行配置,或者如果從慣用節點找不到滿意的範圍,則會傳回 NULL

傳回值

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

言論

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

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

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

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

MmAllocateContiguousMemorySpecifyCacheNode 所配置的記憶體,必須在不再需要記憶體時釋出。 呼叫 MmFreeContiguousMemory 例程,以釋放 MmAllocateContiguousMemorySpecifyCacheNode所配置的記憶體。

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

如果您在具有大量記憶體的計算機上使用 MmAllocateContiguousMemorySpecifyCacheNode 例程,當系統嘗試建立連續的記憶體區塊時,作系統的效能可能會嚴重降低。 從 Windows Vista SP1 和 Windows Server 2008 開始,這種降低會大幅降低,但連續記憶體仍會耗費大量資源來配置。 因此,驅動程式應避免重複呼叫 mmAllocateContiguousMemorySpecifyCacheNode。 相反地,驅動程式應該在其 DriverEntry 例程中配置所有必要的連續緩衝區,並重複使用這些緩衝區。

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

要求

要求 價值
目標平臺 普遍
標頭 wdm.h (包括 Wdm.h、 Ntddk.h)
連結庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL

另請參閱

DriverEntry

MEMORY_CACHING_TYPE

mmFreeContiguousMemory