为什么不能在32位系统中寻址4GB内存?

有谁知道在32位Windows系统进程无法解决4GB的内存,但只有2GB的原因?

这只是Windows系统的限制吗?

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

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

但他们当然可以。 您的代码通常不具有访问地址空间上部所需的访问权限。 用户模式代码在环3运行,到达上方需要ring 0访问权限。 内核模式。

好的,这有点儿尴尬,操作系统内核和具有ring 0访问权限的驱动程序通常不被认为是进程的一部分。 即使它们在逻辑上是,它们也被映射到每个进程中的相同地址。 从技术上讲,动态地映射页面是可能的,因为进程从环3切换到环0模式,但是这会使内核模式转换太昂贵和麻烦。

直观地说:由ReadFile()填充的文件缓冲区可以具有与操作系统代码或数据块重叠的地址。 最坏的情况是,它可能会覆盖文件系统驱动程序代码。 或者更有可能的是文件系统缓存。 所需翻页和双面复印会使读数变得难以预料。 最简单的架构选择是在1992年,当没有人有足够的内存来提供RAM时,简单地将地址空间分成两部分,这样就不会有任何重叠。

否则,这是一个解决的问题,32位版本的Windows正变得越来越少,32位进程可以在64位版本的Windows上解决4千兆字节的问题。 它只需要EXE头中的一个选项位,由链接器中的/ LARGEADDRESSAWARE选项和editbin.exe

简单的回答是,一些虚拟地址空间被保留给操作系统来映射内容,比如它自己的内存空间,虚拟机页面表,硬件设备等等。

理论上它可以提供更多的可用性(事实上,你可以告诉Windows让你有〜3GB,虽然它没有默认启用,以防一些软件/驱动程序等有问题),但你不会得到全部4GB,而不会影响操作系统有效运行系统的能力。

即使您在Windows上将用户占用空间扩大到3GB,应用程序也不会默认获得额外的范围。 Windows需要应用程序有一个标志集(在MSVC下使用/ LARGEADDRESSAWARE构建,不知道其他构建环境),还是限制为2GB,以避免软件对地址做出假设导致的任何问题。

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

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