1

有人知道为什么在 32 位 Windows 系统中进程无法寻址 4GB 内存而只能寻址 2GB 的原因吗?

它只是Windows系统的限制吗?

注意:我指的不是可寻址的总内存,而是单个进程可以寻址的内存。

4

3 回答 3

2

为什么在 32 位 Windows 系统中进程无法寻址 4GB 内存

但他们肯定可以。您的代码通常不具备寻址地址空间上部所需的访问权限。用户模式代码在 ring 3 运行,要到达上半部分,您需要 ring 0 访问权限。内核模式。

好吧,这有点开玩笑,操作系统内核和具有 ring 0 访问权限的驱动程序通常不被认为是进程的一部分。即使它们在逻辑上是,它们在每个进程中都映射到相同的地址。从技术上讲,当进程从 ring 3 切换到 ring 0 模式时,动态映射页面是可能的,但这会使内核模式转换过于昂贵和繁琐。

直观地说:由 ReadFile() 填充的文件缓冲区可能具有与一大块操作系统代码或数据重叠的地址。最坏的情况是,它可能与文件系统驱动程序代码重叠。或者,更有可能是文件系统缓存。所需的翻页和双份复印会使阅读变得异常缓慢。最简单的架构选择,也是在 1992 年做出的选择,当时没有人有钱买得起 1GB 的 RAM,就是简单地将地址空间一分为二,这样就不可能有重叠。

否则这是一个已解决的问题,32 位版本的 Windows 越来越少,一个 32 位进程可以在 64 位版本的 Windows 上处理 4 GB。它只需要 EXE 标头中的选项位,由链接器和 editbin.exe 中的 /LARGEADDRESSAWARE 选项设置的选项位

于 2013-01-07T13:50:05.700 回答
2

简单的答案是保留一些虚拟地址空间供操作系统将内容映射到其中,例如它自己的内存空间、VM 页表、硬件设备等。

从理论上讲,它可以提供更多可用(实际上,您可以告诉 Windows 让您拥有 ~3GB,尽管默认情况下不会启用它,以防某些软件/驱动程序/等出现问题),但您不会得到完整的 4GB,而不会削弱操作系统有效运行系统的能力。

即使您在 Windows 上将用户空间扩展到 3GB,默认情况下应用程序也不会获得额外的范围。Windows 要求应用程序设置一个标志(在 MSVC 下使用 /LARGEADDRESSAWARE 构建,不知道其他构建环境)或限制为 2GB,以避免软件对地址进行假设而导致的任何问题。

于 2013-01-07T13:16:21.903 回答
0

32 位 Windows 系统在用户和系统之间平均分配 4GB 虚拟内存范围,这样每个系统只有 2GB 的(虚拟)可用空间。

请参阅:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa366912%28v=vs.85%29.aspx

于 2013-01-07T13:22:24.877 回答