【发布时间】:2009-01-29 04:58:32
【问题描述】:
我看到在 64 位 Windows 操作系统上,可用的用户虚拟地址空间是 8 terra 字节。但是如果我们正在执行的程序在 32 位兼容模式下运行,那么还有这么多的用户空间可用吗?还是它的行为与普通的 32 位操作系统一样,只提供 2GB 的用户地址空间?
【问题讨论】:
标签: 64-bit compatibility virtual-address-space
我看到在 64 位 Windows 操作系统上,可用的用户虚拟地址空间是 8 terra 字节。但是如果我们正在执行的程序在 32 位兼容模式下运行,那么还有这么多的用户空间可用吗?还是它的行为与普通的 32 位操作系统一样,只提供 2GB 的用户地址空间?
【问题讨论】:
标签: 64-bit compatibility virtual-address-space
微软有一张图表显示了各种限制:Memory Limits for Windows Releases
总结一下用户模式的虚拟地址空间:
/LARGEADDRESSAWARE:YES 和 4GT/LARGEADDRESSAWARE:YES
/LARGEADDRESSAWARE:NO
4GT 是 4GB 调优:
/3GBboot.ini 开关bcdedit /set increaseuserva 3072
Mark Russinovich 发表了一篇博文,解释了许多这些限制:Pushing the Limits of Windows: Virtual Memory
【讨论】:
64-bit process: 8 TB by default; 2 GB with /LARGEADDRESSAWARE:NO - 即使这是限制 64 位进程地址空间的选项。很有意思!从来不知道使用标志甚至可以缩小内存上限。我想知道什么用例需要如此缩小规模。我们总是想扩大我们进程的内存占用空间。非常好的信息。
当您的进程作为 32 位进程运行时,它只会看到 4GB 的虚拟地址空间。它将无法解决更高的问题。
【讨论】:
我原来的答案很糟糕。这是一个链接,可以很好地解释 JaredPar 所说的内容。
【讨论】:
就硬件而言,当您在兼容模式下运行时(即设置了 IA32_EFER.LMA 并且在 CS 的段描述符中清除了 L 位),段的行为类似于 32 位段。那就是:
这实际上将您限制为 4GB 的虚拟地址。我不熟悉操作系统如何在各种模式下对虚拟内存进行分区,但 this 是硬件限制。 (抱歉……我是硬件专家,不是操作系统专家)
【讨论】:
如果您的程序在 Wow64 子系统上作为 32 位进程运行,它将看到与在实际 32 位操作系统上看到的完全相同的地址空间。如果没有特殊选项,32 位进程将有 2GB 可用内存。
如果使用LargeAddressAware 选项,唯一的区别是可用内存。在正常的 32 位进程中,这允许 3GB 的可寻址内存。在 Wow64 进程中,它最多可以看到 4GB (Source)
【讨论】:
需要注意的是,在带有 64 位机器/操作系统的 IIS 6.0+ 上运行 32 位进程,一个进程最多可以寻址 4GB 内存。
【讨论】: