MmAllocatePagesForMdl 函式 (wdm.h)
MmAllocatePagesForMdl 例程會將零填滿、非分頁的實體記憶體頁面配置給 MDL。
語法
PMDL MmAllocatePagesForMdl(
[in] PHYSICAL_ADDRESS LowAddress,
[in] PHYSICAL_ADDRESS HighAddress,
[in] PHYSICAL_ADDRESS SkipBytes,
[in] SIZE_T TotalBytes
);
參數
[in] LowAddress
指定第一個位址範圍的開頭實體位址,而配置的頁面可以從該範圍開始。 如果 MmAllocatePagesForMdl 無法配置第一個位址範圍中要求的位元元數目,則會逐一查看其他位址範圍以取得更多頁面。 在每個反覆專案中,mmAllocatePagesForMdl 會將 skipBytes 的值新增至先前的起始位址,以取得下一個位址範圍的開頭。
[in] HighAddress
指定第一個位址範圍結尾的實體位址,而配置的頁面可以來自該範圍。
[in] SkipBytes
指定要從上一個位址範圍的開頭略過位元組數目,而配置的頁面可以從該範圍開始。 SkipBytes 必須是虛擬記憶體頁面大小的整數倍數,以位元組為單位。
[in] TotalBytes
指定要配置給 MDL 的位元組總數。
傳回值
MmAllocatePagesForMdl 會傳回下列其中一項:
傳回碼 | 描述 |
---|---|
MDL 指標 | MDL 指標描述指定位址範圍中的一組實體頁面。 如果要求的位元組數目無法使用,MDL 會描述可用的物理記憶體數量。 |
NULL | 指定的位址範圍中沒有實體記憶體頁面,或 MDL 本身沒有足夠的記憶體集區。 |
言論
在 Windows Server 2003 Service Pack 1 (SP1) 和更新版本中執行的驅動程式應該使用 MmAllocatePagesForMdlEx 例程,而不是 MmAllocatePagesForMdl。 MmAllocatePagesForMdlEx 藉由避免不必要排清轉譯外觀緩衝區 (TLB) 和快取記憶體,提供比 mmAllocatePagesForMdl 更好的效能。
MmAllocatePagesForMdl 所傳回的實體記憶體頁面通常不是連續的頁面。 MmAllocatePagesForMdl 一律會在傳回的 MDL 中以零填滿已配置的頁面。
MmAllocatePagesForMdl 是設計成由不需要對應虛擬位址的核心模式驅動程式使用(也就是說,它們需要實體頁面,而且不需要實際連續的頁面),或內核模式驅動程式,如果裝置的實體記憶體配置在特定實體地址範圍中,可以達到大幅效能提升。 AGP 圖形卡的驅動程式是這類驅動程式的範例。
根據要求範圍中目前可用的物理記憶體數目而定,MmAllocatePagesForMdl 可能會傳回描述記憶體小於要求的 MDL。 如果沒有配置記憶體,例程會傳回 null 。 呼叫端應該檢查實際配置給 MDL 的記憶體數量。
呼叫端必須使用 MmFreePagesFromMdl 來釋放由 MmAllocatePagesForMdl所建立之 MDL 所描述的記憶體頁面。 呼叫 MmFreePagesFromMdl之後,呼叫端也必須呼叫 ExFreePool,以釋放配置給 MDL 結構本身的記憶體。
在 Windows 2000 和更新版本的 Windows 中,MmAllocatePagesForMdl 可以在單一呼叫中配置的最大記憶體數量是 (4 GB - PAGE_SIZE)。 例程只有在有足夠的頁面可用時,才能滿足此數量的配置要求。
mmAllocatePagesForMdl 會在 IRQL <= APC_LEVEL執行。 Windows Server 2008 和更新版本的 Windows作系統會啟用 mmAllocatePagesForMdl 來電者在DISPATCH_LEVEL呼叫。 不過,您可以在 APC_LEVEL 或以下呼叫 來改善驅動程式效能。
從特殊核心異步過程調用 (APC) 呼叫 MmAllocatePagesForMdl 可能會導致對獨佔鎖定的遞歸擷取,這隻會在重要區域(使用者或一般核心 APC 已停用),但在受防護區域(停用所有 APC)。
要求
要求 | 價值 |
---|---|
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 請參閱一節。 |
DDI 合規性規則 | HwStorPortProhibitedDIs(storport)、IrqlMmApcLte(wdm)、SpNoWait(storport)、StorPortStartIo(storport) |