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)及更高版本的 Windows 中运行的驱动程序应使用 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 千兆字节 - 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) |