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 提供了比 MmAllocatePagesForMdl 更好的性能,方法是避免不必要的刷新转换 lookaside 缓冲区 (TLB) 和缓存内存。
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 或以下位置调用 来提高驱动程序性能。
从特殊的内核异步过程调用调用 mmAllocatePagesForMdl (APC) 可能会导致以递归方式获取独占锁,该锁仅在 (用户或正常内核 APC 禁用) ) 但不在受保护的区域中 (禁用的所有 APC) 。
要求
要求 | 值 |
---|---|
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | 请参见“备注”部分。 |
DDI 符合性规则 | HwStorPortProhibitedDDI (storport) 、 IrqlMmApcLte (wdm) 、 SpNoWait (storport) 、 StorPortStartIo (storport) |