MmAllocateContiguousMemory 函数 (wdm.h)
MmAllocateContiguousMemory 例程分配一系列连续的非分页物理内存,并将其映射到系统地址空间。
语法
PVOID MmAllocateContiguousMemory(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress
);
参数
[in] NumberOfBytes
要分配的连续内存块的大小(以字节为单位)。 有关详细信息,请参阅“备注”。
[in] HighestAcceptableAddress
调用方可以使用的最高有效物理地址。 例如,如果设备只能处理处理器物理内存地址范围前 16 兆字节的位置,则此设备的驱动程序应将 HighestAcceptableAddress 设置为0x0000000000FFFFFF。 如果没有内存分配的特定要求,请设置为MAXULONG64。
返回值
mmAllocateContiguousMemory 返回已分配内存的基虚拟地址。 如果无法满足请求,则例程返回 NULL。
言论
mmAllocateContiguousMemory 分配物理地址空间中连续的非分页内存块。 例程将此块映射到系统地址空间中的连续虚拟内存块,并返回此块基的虚拟地址。 例程将连续内存分配的起始地址与内存页边界对齐。
驱动程序不能访问超出所请求分配大小的内存。 例如,开发人员不应假定其驱动程序可以在请求分配的末尾和下一页边界之间安全地使用内存。
由于连续的物理内存通常供不应求,因此应谨慎使用,并且仅在必要时使用。 在使用连续内存的驱动程序应在驱动程序初始化期间分配此内存,因为随着作系统分配和释放内存,物理内存可能会随着时间而碎片化。 通常,驱动程序从其 DriverEntry 例程调用 MmAllocateContiguousMemory,以便为长期使用分配内部缓冲区,并在卸载驱动程序之前释放缓冲区。
不再需要内存时,必须释放由 MmAllocateContiguousMemory 分配的内存。 调用 MmFreeContiguousMemory 例程以释放由 mmAllocateContiguousMemory分配的内存。
当物理内存碎片化在具有大量 RAM 的计算机上时,调用 MmAllocateContiguousMemory(要求作系统搜索连续内存块)可能会严重降低性能。 从 Windows Vista SP1 和 Windows Server 2008 开始,这种降级会大大减少,但连续内存仍可能很昂贵。 因此,驱动程序应避免重复调用 MmAllocateContiguousMemory。 相反,驱动程序应在其 DriverEntry 例程中分配所有必需的连续缓冲区,并重复使用这些缓冲区。
mmAllocateContiguousMemory 分配的内存未初始化。 如果内核模式驱动程序要使用户模式软件可见(以避免泄露潜在的特权内容),内核模式驱动程序必须首先将此内存设置为零。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= DISPATCH_LEVEL |