MmAllocateContiguousMemorySpecifyCache 函数 (ntddk.h)
MmAllocateContiguousMemorySpecifyCache 例程分配一系列连续的非分页物理内存,并将其映射到系统地址空间。
语法
PVOID MmAllocateContiguousMemorySpecifyCache(
[in] SIZE_T NumberOfBytes,
[in] PHYSICAL_ADDRESS LowestAcceptableAddress,
[in] PHYSICAL_ADDRESS HighestAcceptableAddress,
[in, optional] PHYSICAL_ADDRESS BoundaryAddressMultiple,
[in] MEMORY_CACHING_TYPE CacheType
);
参数
[in] NumberOfBytes
要分配的连续内存块的大小(以字节为单位)。 有关详细信息,请参阅“备注”。
[in] LowestAcceptableAddress
调用方可以使用的最低有效物理地址。 例如,如果设备只能寻址处理器物理内存地址范围前 8 MB 以上的位置,则此设备的驱动程序应将 LowestAcceptableAddress 设置为 0x0000000000800000。
[in] HighestAcceptableAddress
调用方可以使用的最高有效物理地址。 例如,如果设备只能寻址处理器物理内存地址范围前 16 MB 中的位置,则此设备的驱动程序应将 HighestAcceptableAddress 设置为 0x0000000000FFFFFF。
[in, optional] BoundaryAddressMultiple
分配的缓冲区不得交叉的物理地址倍数。 物理地址复数必须始终为 2 的幂。 此参数是可选的,可以指定为零,以指示设备没有特殊的内存边界限制。 有关详细信息,请参阅“备注”。
[in] CacheType
指定 MEMORY_CACHING_TYPE 值,该值指示所请求内存允许的缓存类型。
返回值
MmAllocateContiguousMemorySpecifyCache 返回已分配内存的基虚拟地址。 如果系统无法分配请求的缓冲区,则例程返回 NULL。
注解
MmAllocateContiguousMemorySpecifyCache 分配物理地址空间中连续的非分页内存块。 例程将此块映射到系统地址空间中的连续虚拟内存块,并返回此块基的虚拟地址。 例程将连续内存分配的起始地址与内存页边界对齐。
驱动程序不能访问超出请求的分配大小的内存。 例如,开发人员不应假定其驱动程序可以在请求的分配结束和下一页边界之间安全地使用内存。
由于连续物理内存通常供不应求,因此应谨慎使用,并且仅在必要时使用。 必须使用连续内存的驱动程序应在驱动程序初始化期间分配此内存,因为随着操作系统分配和释放内存,物理内存可能会随着时间的推移而碎片化。 通常,驱动程序从其 DriverEntry 例程调用 MmAllocateContiguousMemorySpecifyCache 来分配内部缓冲区以供长期使用,并在卸载驱动程序之前释放缓冲区。
当不再需要内存时,必须释放 由 MmAllocateContiguousMemorySpecifyCache 分配的内存。 调用 MmFreeContiguousMemory 例程以释放由 MmAllocateContiguousMemorySpecifyCache 分配的内存。
如果为 BoundaryAddressMultiple 参数指定一个非零值,则分配的内存块的物理地址范围不会跨越该值的整数倍数的地址边界。 驱动程序应将此参数设置为零,除非需要非零值来绕过硬件限制。 例如,如果设备无法跨 16 兆字节的物理边界传输数据,则驱动程序应为此参数指定0x1000000值,以确保设备看到的地址不会在 16 兆字节边界处环绕。
如果在内存量较大的计算机上使用 MmAllocateContiguousMemorySpecifyCache 例程,当系统尝试创建连续内存块时,操作系统的性能可能会严重下降。 从 Windows Vista SP1 和 Windows Server 2008 开始,这种降级会大大减少,但连续内存的分配成本仍然很高。 因此,驱动程序应避免重复调用 MmAllocateContiguousMemorySpecifyCache。 相反,驱动程序应在其 DriverEntry 例程中分配所有必需的连续缓冲区,并重复使用这些缓冲区。
MmAllocateContiguousMemorySpecifyCache 分配的内存未初始化。 如果内核模式驱动程序要使其对用户模式软件 (可见,则必须先将其归零,以避免泄露) 潜在的特权内容。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | ntddk.h (包括 Wdm.h、Ntddk.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |