【问题标题】:Virtual address space in 64 bit systems running in compatibility mode以兼容模式运行的 64 位系统中的虚拟地址空间
【发布时间】:2009-01-29 04:58:32
【问题描述】:

我看到在 64 位 Windows 操作系统上,可用的用户虚拟地址空间是 8 terra 字节。但是如果我们正在执行的程序在 32 位兼容模式下运行,那么还有这么多的用户空间可用吗?还是它的行为与普通的 32 位操作系统一样,只提供 2GB 的用户地址空间?

【问题讨论】:

    标签: 64-bit compatibility virtual-address-space


    【解决方案1】:

    微软有一张图表显示了各种限制:Memory Limits for Windows Releases

    总结一下用户模式的虚拟地址空间:

    • 32 位 Windows:
      • 32位进程:默认2GB; 3 GB,/LARGEADDRESSAWARE:YES 和 4GT
    • 64 位 Windows(x64 架构):
      • 32位进程:默认2GB; 4 GB,/LARGEADDRESSAWARE:YES
      • 64位进程:默认8TB; 2 GB,/LARGEADDRESSAWARE:NO

    4GT 是 4GB 调优:

    • XP:/3GBboot.ini 开关
    • 远景:bcdedit /set increaseuserva 3072

    Mark Russinovich 发表了一篇博文,解释了许多这些限制:Pushing the Limits of Windows: Virtual Memory

    【讨论】:

    • 重要的是要注意,根据正在创建的可执行文件,您可能必须使用 editbin 在 PE 可执行文件本身上设置 LARGEADDRESSAWARE 标志,以利用额外的地址空间。
    • 64-bit process: 8 TB by default; 2 GB with /LARGEADDRESSAWARE:NO - 即使这是限制 64 位进程地址空间的选项。很有意思!从来不知道使用标志甚至可以缩小内存上限。我想知道什么用例需要如此缩小规模。我们总是想扩大我们进程的内存占用空间。非常好的信息。
    【解决方案2】:

    当您的进程作为 32 位进程运行时,它只会看到 4GB 的虚拟地址空间。它将无法解决更高的问题。

    【讨论】:

    • 在windows上,32位进程只能访问2GB内存。
    • 我猜“看到”可能是错误的词。我的理解是,2GB 以上是为内核保留的,但仍然是进程虚拟地址空间的一部分,还有 2GB 可供用户分配。
    【解决方案3】:

    我原来的答案很糟糕。这是一个链接,可以很好地解释 JaredPar 所说的内容。

    http://msdn.microsoft.com/en-us/library/ms189334.aspx

    【讨论】:

      【解决方案4】:

      就硬件而言,当您在兼容模式下运行时(即设置了 IA32_EFER.LMA 并且在 CS 的段描述符中清除了 L 位),段的行为类似于 32 位段。那就是:

      • 段基数限制为 32 位。
      • 段限制也被限制为 32 位(使用 G 位)。

      这实际上将您限制为 4GB 的虚拟地址。我不熟悉操作系统如何在各种模式下对虚拟内存进行分区,但 this 是硬件限制。 (抱歉……我是硬件专家,不是操作系统专家)

      【讨论】:

        【解决方案5】:

        如果您的程序在 Wow64 子系统上作为 32 位进程运行,它将看到与在实际 32 位操作系统上看到的完全相同的地址空间。如果没有特殊选项,32 位进程将有 2GB 可用内存。

        如果使用LargeAddressAware 选项,唯一的区别是可用内存。在正常的 32 位进程中,这允许 3GB 的可寻址内存。在 Wow64 进程中,它最多可以看到 4GB (Source)

        【讨论】:

        • /LARGEADDRESSAWARE:YES 在 WoW64 下为您提供 4 GB 的虚拟地址空间,而不是 3 GB。
        • @bk1e,我不知道。我花了一些时间在谷歌上搜索,但我能够确认并更新了我的帖子。我发现这是一个非常奇怪但有趣的变化。
        【解决方案6】:

        需要注意的是,在带有 64 位机器/操作系统的 IIS 6.0+ 上运行 32 位进程,一个进程最多可以寻址 4GB 内存。

        【讨论】:

          猜你喜欢
          • 2011-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多