我看到在 64 位 Windows 操作系统上,可用的用户虚拟地址空间是 8 terra 字节。但是,如果我们正在执行的程序在 32 位兼容模式下运行,那么还有这么多的用户空间可用吗?还是它的行为类似于普通的 32 位操作系统并且只提供 2GB 的用户地址空间?
6 回答
Microsoft 有一张图表显示了各种限制:Windows 版本的内存限制
总结一下用户模式的虚拟地址空间:
- 32 位 Windows:
- 32位进程:默认2GB;3 GB
/LARGEADDRESSAWARE:YES
和 4GT
- 32位进程:默认2GB;3 GB
- 64 位 Windows(x64 架构):
- 32位进程:默认2GB;4 GB
/LARGEADDRESSAWARE:YES
- 64位进程:默认8 TB;2 GB
/LARGEADDRESSAWARE:NO
- 32位进程:默认2GB;4 GB
4GT 是 4 GB 调优:
- XP:
/3GB
boot.ini 开关 - 远景:
bcdedit /set increaseuserva 3072
Mark Russinovich 发表了一篇博文,解释了许多这些限制:推动 Windows 的限制:虚拟内存
当您的进程作为 32 位进程运行时,它只会看到 4GB 的虚拟地址空间。它将无法解决更高的问题。
如果您的程序在 Wow64 子系统上作为 32 位进程运行,它将看到与在实际 32 位操作系统上看到的完全相同的地址空间。如果没有特殊选项,32 位进程将有 2GB 可用内存。
如果使用LargeAddressAware选项,唯一的区别是可用内存。在正常的 32 位进程中,这允许 3GB 的可寻址内存。在 Wow64 进程中,它最多可以看到 4GB(来源)
我原来的答案很糟糕。这是一个链接,可以很好地解释 JaredPar 所说的内容。
就硬件而言,当您在兼容模式下运行时(即设置了 IA32_EFER.LMA 并且在 CS 的段描述符中清除了 L 位),这些段的行为类似于 32 位段。那是:
- 段基数限制为 32 位。
- 段限制也限制为 32 位(使用 G 位)。
这有效地将您限制为 4GB 的虚拟地址。我不熟悉操作系统如何在各种模式下对虚拟内存进行分区,但这是硬件限制。(对不起...我是硬件专家,不是操作系统专家)
需要注意的是,在带有 64 位机器/操作系统的 IIS 6.0+ 上运行 32 位进程,一个进程最多可以寻址 4GB 内存。