共用方式為


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 例程,而不是 MmAllocatePagesForMdlMmAllocatePagesForMdlEx 藉由避免不必要排清轉譯外觀緩衝區 (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)

另請參閱

ExFreePool

mmAllocatePagesForMdlEx

mmFreePagesFromMdl

MmMapLockedPages