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 无法分配第一个地址范围中请求的字节数,它将循环访问其他地址范围以获取更多页面。 每次迭代时,mmAllocatePagesForMdlSkipBytes 的值添加到上一个起始地址以获取下一个地址范围的开始位置。

[in] HighAddress

指定第一个地址范围的末尾的物理地址,分配的页面可以来自该地址范围。

[in] SkipBytes

指定要从上一地址范围的开头跳过的字节数,从中可以传入分配的页面。 SkipBytes 必须是虚拟内存页大小的整数倍,以字节为单位。

[in] TotalBytes

指定要为 MDL 分配的字节总数。

返回值

mmAllocatePagesForMdl 返回以下项之一:

返回代码 描述
MDL 指针 MDL 指针描述指定地址范围内的一组物理页。 如果请求的字节数不可用,MDL 将描述可用的物理内存量。
NULL 指定的地址范围中没有物理内存页,或者 MDL 本身没有足够的内存池。

言论

在 Windows Server 2003 Service Pack 1(SP1)及更高版本的 Windows 中运行的驱动程序应使用 mmAllocatePagesForMdlEx 例程,而不是 mmAllocatePagesForMdlMmAllocatePagesForMdlEx 通过避免翻译外观缓冲区(TLB)和缓存内存的不必要的刷新,mmAllocatePagesForMdl 提供更好的性能。

MmAllocatePagesForMdl 返回的物理内存页通常不是连续页。 mmAllocatePagesForMdl 始终使用零填充返回的 MDL 中的已分配页。

MmAllocatePagesForMdl 设计用于内核模式驱动程序,这些驱动程序不需要相应的虚拟地址(也就是说,它们需要物理页,不需要页面是物理连续的),或者内核模式驱动程序,如果设备的物理内存分配在特定物理地址范围中,这些驱动程序可以实现实质性的性能提升。 AGP 图形卡的驱动程序是此类驱动程序的示例。

根据请求范围中当前可用的物理内存量,MmAllocatePagesForMdl 可能会返回描述内存小于请求的 MDL。 如果未分配内存,则例程返回 NULL。 调用方应检查实际分配给 MDL 的内存量。

调用方必须使用 MmFreePagesFromMdl 释放由 MmAllocatePagesForMdl创建的 MDL 描述的内存页。 调用 MmFreePagesFromMdl后,调用方还必须调用 ExFreePool 以释放为 MDL 结构本身分配的内存。

在 Windows 2000 及更高版本的 Windows 中,MmAllocatePagesForMdl 可以在单个调用中分配的最大内存量为(4 千兆字节 - 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