MmAllocateContiguousMemorySpecifyCache 函式 (wdm.h)
MmAllocateContiguousMemorySpecifyCache 例程會配置一系列連續、非分頁的實體記憶體,並將其對應至系統地址空間。
語法
PVOID MmAllocateContiguousMemorySpecifyCache(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS LowestAcceptableAddress,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress,
[in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
[in] MEMORY_CACHING_TYPE CacheType
);
參數
[in] NumberOfBytes
要配置的連續記憶體區塊大小,以位元組為單位。 如需詳細資訊,請參閱<備註>。
[in] LowestAcceptableAddress
呼叫端可以使用的最低有效實體位址。 例如,如果裝置只能尋址處理器實體記憶體位址範圍前 8 MB 以上的位置,則此裝置的驅動程式應該將 LowestAcceptableAddress 設定為 0x0000000000800000。
[in] HighestAcceptableAddress
呼叫端可以使用的最高有效實體位址。 例如,如果裝置只能尋址處理器實體記憶體位址範圍的前 16 MB 位置,則此裝置的驅動程式應該將 HighestAcceptableAddress 設定為 0x0000000000FFFFFF。
[in, optional] BoundaryAddressMultiple
配置緩衝區不可跨越的實體位址倍數。 實體位址倍數一律必須是兩個的乘冪。 此參數是選擇性的,可以指定為零,表示裝置沒有特殊的記憶體界限限制。 如需詳細資訊,請參閱<備註>。
[in] CacheType
指定 MEMORY_CACHING_TYPE 值,這個值表示要求記憶體允許的快取類型。
傳回值
MmAllocateContiguousMemorySpecifyCache 會傳回已配置記憶體的基底虛擬位址。 如果系統無法配置要求的緩衝區,例程會傳回 NULL。
備註
MmAllocateContiguousMemorySpecifyCache 會配置實體位址空間中連續的非分頁記憶體區塊。 例程會將此區塊對應至系統位址空間中連續的虛擬記憶體區塊,並傳回此區塊基底的虛擬位址。 例程會將連續記憶體配置的起始位址對齊記憶體分頁界限。
驅動程式不能存取超過要求配置大小的記憶體。 例如,開發人員不應該假設其驅動程式可以在要求的配置結尾與下一個頁面界限之間安全地使用記憶體。
由於連續的實體記憶體通常提供較短,因此應該謹慎使用,而且只有在需要時才使用。 在驅動程式初始化期間,必須使用連續記憶體的驅動程序應該配置此記憶體,因為當操作系統配置並釋放記憶體時,實體記憶體可能會隨著時間分散。 一般而言,驅動程式會從 DriverEntry 例程呼叫 MmAllocateContiguousMemorySpecifyCache 來配置內部緩衝區以供長期使用,並在卸除驅動程式之前釋出緩衝區。
當不再需要記憶體時,必須釋放 MmAllocateContiguousMemorySpecifyCache 所配置的記憶體。 呼叫 MmFreeContiguousMemory 例程來釋放 MmAllocateContiguousMemorySpecifyCache 所配置的記憶體。
如果您為 BoundaryAddressMultiple 參數指定非零值,則配置記憶體區塊的實體地址範圍將不會跨越這個值之整數倍數的位址界限。 除非需要非零值才能解決硬體限制,否則驅動程式應將此參數設定為零。 例如,如果裝置無法跨 16 MB 的實體界限傳輸數據,驅動程式應該指定此參數的 0x1000000 值,以確保裝置看到的位址不會繞著 16 MB 界限。
如果您在具有大量記憶體的計算機上使用 MmAllocateContiguousMemorySpecifyCache 例程,當系統嘗試建立連續記憶體區塊時,操作系統的效能可能會嚴重降低。 從 Windows Vista SP1 和 Windows Server 2008 開始,這項降低大幅降低,但連續記憶體仍可能很昂貴。 因此,驅動程式應該避免重複呼叫 MmAllocateContiguousMemorySpecifyCache。 相反地,驅動程式應該在其 DriverEntry 例程中配置所有必要的連續緩衝區,並重複使用這些緩衝區。
MmAllocateContiguousMemorySpecifyCache 配置的記憶體未初始化。 如果核心模式驅動程式要讓使用者模式軟體看見 (,以避免) 外泄潛在特殊許可權的內容,則核心模式驅動程式必須先將這個記憶體零。
規格需求
需求 | 值 |
---|---|
目標平台 | Universal |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h) |
程式庫 | NtosKrnl.lib |
Dll | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |