MapUserPhysicalPages 函数 (memoryapi.h)
在地址 窗口扩展 (AWE) 区域中的指定地址映射以前分配的物理内存页。
若要对多个区域执行批量映射和取消映射,请使用 MapUserPhysicalPagesScatter 函数。
基于 Itanium 的系统上的 64 位 Windows: 由于页面大小不同,32 位应用程序不支持 MapUserPhysicalPages 。
语法
BOOL MapUserPhysicalPages(
[in] PVOID VirtualAddress,
[in] ULONG_PTR NumberOfPages,
[in] PULONG_PTR PageArray
);
参数
[in] VirtualAddress
指向要重新映射的内存区域的起始地址的指针。
lpAddress 的值必须在分配地址窗口扩展 (AWE) 区域时 VirtualAlloc 函数返回的地址范围内。
[in] NumberOfPages
要为其建立转换的物理内存和虚拟地址空间的大小(以页为单位)。
虚拟地址范围从 lpAddress 开始是连续的。 物理帧由 UserPfnArray 指定。
总页数不能从起始地址扩展到 AllocateUserPhysicalPages 中指定的范围的末尾。
[in] PageArray
指向物理页帧编号数组的指针。
从此函数返回时,这些帧由参数 lpAddress 映射。 分配的内存大小应至少为 numberOfPages 乘以数据类型 ULONG_PTR的大小。
请勿尝试修改此缓冲区。 它包含操作系统数据,损坏可能是灾难性的。 缓冲区中的信息对应用程序没有用。
如果此参数为 NULL,则取消映射指定的地址范围。 此外,不会释放指定的物理页,必须调用 FreeUserPhysicalPages 来释放它们。
返回值
如果函数成功,则返回值为 TRUE。
如果函数失败,则返回值为 FALSE ,并且不执行任何映射-部分或其他。 要获得更多的错误信息,请调用 GetLastError。
注解
物理页面未映射,但不会释放。 必须调用 FreeUserPhysicalPages 才能释放物理页面。
可以指定任意数量的物理内存页,但内存不得扩展到 VirtualAlloc 分配的虚拟地址空间之外。 新翻译会自动覆盖任何现有地址映射,而旧翻译则取消映射。
不能在 AllocateUserPhysicalPages 中指定的范围之外映射物理内存页。 可以同时映射多个区域,但它们不能重叠。
物理页可以位于任何物理地址,但不要假设物理页的连续性。
若要取消映射当前地址范围,请指定 NULL 作为物理内存页数组参数。 当前映射的任何页面均未映射,但不会释放。 必须调用 FreeUserPhysicalPages 才能释放物理页面。
在多处理器环境中,此函数维护硬件转换缓冲区一致性。 从此函数返回时,保证所有处理器上的所有线程都能看到正确的映射。
若要编译使用此函数的应用程序,请将_WIN32_WINNT宏定义为 0x0500 或更高版本。 有关详细信息,请参阅 使用 Windows 标头。
示例
有关示例,请参阅 AWE 示例。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | memoryapi.h (包括 Windows.h、Memoryapi.h) |
Library | onecore.lib |
DLL | Kernel32.dll |