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

另请参阅

地址窗口化扩展

AllocateUserPhysicalPages

FreeUserPhysicalPages

MapUserPhysicalPagesScatter

内存管理函数