【问题标题】:Address Windowing Extension地址窗口扩展
【发布时间】:2011-11-09 01:43:31
【问题描述】:

我有一个 32 位应用程序,需要非常大的内存。

我注意到有一个东西叫Address Windowing Extension

但是我没有找到太多关于如何使用它的信息,以及在使用它时可能遇到的缺点和问题?

【问题讨论】:

    标签: c++ winapi memory 32-bit awe


    【解决方案1】:
    • 它不应该在 64 位的 Windows 版本上工作(阅读此处http://msdn.microsoft.com/en-us/library/aa366778.aspx Intel 和 AMD 的 PAE 规范确实支持 x86-64 架构,但 Microsoft 的 PAE(API)的软件层,称为 AWE,不支持支持 64 位版本的 Windows,因此 64 位 Windows Vista 不能为 32 位应用程序分配超过 4 GiB 的 RAM。)。
    • 即使在 32 位 Windows 上,可用内存量也存在“许可”限制(同一页面显示所有限制)。
    • 显然,编程很复杂 :-) 就像在旧的 8086 上使用 EMS。

    【讨论】:

    • 啊,没有 64 位操作系统支持对我来说是个大问题。
    • 如果你真的需要很多内存,你应该尝试将程序转换为 64 位(但它可能很复杂,特别是如果它需要支持“遗留”库)
    • 不幸的是,我依赖于 32 位的第三方组件。
    • 是时候抛弃这些依赖了。您需要迁移到 64 位。
    • “许可限制”完全排除了 Vista 和 Windows 7 上的 AWE。Windows 2008R2 甚至没有 32 位版本,因此最后 3 个 Windows 版本不提供 AWE。
    【解决方案2】:

    事实上,您可以通过在 64 位 Windows 操作系统中运行的 32 位应用程序使用 AWE,并且不需要 PAE。例如 MS SQL Server(2012 之前的版本)可以在这种模式下配置。

    但除非您有非常具体的要求,否则移植到 64 位可能是更好的选择。

    你有几个缺点:

    • 需要与SeLockMemoryPrivilege 的用户一起运行
    • 内存不能与其他进程共享。它分配在物理内存中。留给操作系统和其他应用程序的内存更少(使用AllocateUserPhysicalPages)。
    • 您需要一个虚拟地址才能访问此类内存。所以你可以有一个带有LARGE_ADDRESS_AWARE标志的4GiB内存窗口。
    • 如果您想访问超过 4GiB,您必须映射/取消映射这些物理页面(使用 MapUserPhysicalPages)。

    来自 1999 年的 article 解释了如何使用此类 API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多