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 會傳回下列其中一項:

傳回碼 Description
MDL 指標 MDL 指標描述指定位址範圍中的一組實體頁面。 如果要求的位元組數目無法使用,MDL 會描述可用的物理記憶體數量。
NULL 指定的位址範圍中沒有實體記憶體頁面,或 MDL 本身沒有足夠的記憶體集區。

備註

在 Windows Server 2003 Service Pack 1 中執行的驅動程式 (SP1) 和更新版本的 Windows 應該使用 MmAllocatePagesForMdlEx 例程,而不是 MmAllocatePagesForMdlMmAllocatePagesForMdlEx 藉由避免轉譯 lookaside 緩衝區 (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 或以下呼叫 來改善驅動程式效能。

從 A) PC (特殊核心異步過程調用呼叫 MmAllocatePagesForMdl ,可能會導致獨佔鎖定的遞歸取得,這隻會在使用者或一般核心 APC 停用) ,但未在受防護 (區域中 (停用所有 APC) 。

規格需求

需求
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL 請參閱一節。
DDI 合規性規則 HwStorPortProhibitedDIS (storport) IrqlMmApcLte (wdm) SpNoWait (storport) StorPortStartIo (storport)

另請參閱

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages