2的32次方确实是4GB,但这并不能说32位操作系统只能支持4GB内存
网上各大论坛“32位系统只能支持4GB”的言论漫天飞,实际上并不是这样,切勿人云亦云
本文仅讨论32位操作系统支持4GB以上内存,不涉及Win7 x86与Win7 x64的比较
首先概念澄清:32位操作系统并不意味着只能使用4GB内存
从硬件上讲,所谓的计算机位数是指处理器指令的长度,对硬件来说就是通用寄存器(GPR)的宽度,它并不意味着地址总线的宽度,虽然有些情况下它们碰巧也会相等。对于当前的从80386开始算起的大多数x86处理器来说,通用寄存器的长度就是32位,支持x86-64(或者按照更常见的说法:x64)的处理器则可以支持64位的通用寄存器。32位的PowerPC(G5之前)使用32位的通用寄存器,指令长度固定为32位,DEC Alpha64则基于64位通用寄存器,指令为64位。
32位操作系统指的它的指令们只使用32位宽度的GPR,并不意味着它只能的内存寻址就是32位。实际上,早在Pentium Pro(Pentium Pro是一个纯正的32位处理器)上就采用了36位的地址总线(基于这个原因,PAE有时也被称为PAE-36bit),寻址能力就达到了64GB,这个简单有效的扩展就被称为PAE(Phsical Address Extension,物理地址扩展),可见10多年前,x86处理器就能支持这么多的内存了。一再认为32位系统只能支持4GB内存就错了。

为什么Windows 7和Vista的x86版本不支持4GB以上的内存:
32位Vista的4GB限制确实不是核心代码上的限制,而是一些其他的限制:在系统启动的时候,将会读取一个值,这个值最终确定了用户可以使用的内存。这个值叫做Kernel-WindowsMaxMemAllowedx86,通过一个未公开的函数ZwQueryLicenseValue来读取,这个值代表着可用的最大内存,如32位Windows上总是0x1000,单位是MB,也就是代表着4GB。执行中,eax寄存器中保存了ZwQueryLicenseValue的状态值,在通常情况下,系统跳转到default代码段,不允许使用超过4GB容量内存。
Windows XP SP2和其他新的版本,默认在有no-execute (NX)和execute-disable (XD)特性的处理器上以PAE模式运行以允许NX。NX(或XD)在页表项的第63位。如果没有PAE,页表项只就32位;所以要利用NX这个特性的话,就必须运行在PAE模式下。但是,基于为保证驱动兼容等原因,微软通过许可证,在内核中把桌面版Windows(包括Windows XP、Windows Vista和Windows 7)和部分低端Windows Server的物理地址空间限制为4GB。

如何让Windows 7和Vista允许使用超过4GB的内存:
通过简单的修改就可以让系统认为ZwQueryLicenseValue返回128GB的可用容量
Opcode Bytes Instruction B8 00 00 02 00 mov eax,00020000h 90 nop 90 nop

ReadyFor4GB的可行性:
虽然知道原理之后还有很多操作,如,数字签名等操作,不过这些都是为人熟知,因此已经有不少的补丁实现了该大内存支持修改理论。文中的ReadyFor4GB这个程序就是把以上叙述自动化了。

扩展阅读:实际上是AWE(地址窗口化扩展)和PAE(物理地址扩展)
硬件支持:PAE(物理地址扩展)
x86和x86-64处理器的一个特色,即如果操作系统提供适当支持,则可以在32位的系统中使用超过4GB字节的实体内存。PAE为IntelPentium Pro及以上级别的CPU所支持。
x86的处理器增加了额外的地址线以选择那些增加了的内存,所以实体内存的大小从32位增加到了36位。最大的实体内存由4GB增加到了64GB。
对于需要超过4GB内存的应用软件来说,除了一般的PAE支持,还需要操作系统提供另外的特殊的技术。在Windows上,这种技术叫做Address Windowing Extensions(AWE)。
Windows XP SP2和其他新的版本,默认在有no-execute (NX)和execute-disable (XD)特性的处理器上以PAE模式运行以允许NX。NX(或XD)在页表项的第63位。如果没有PAE,页表项只就32位;所以要利用NX这个特性的话,就必须运行在PAE模式下。但是,基于为保证驱动兼容等原因,微软通过许可证,在内核中把桌面版Windows(包括Windows XP、Windows Vista和Windows 7)和部分低端Windows Server的物理地址空间限制为4GB。
软件支持:AWE(地址窗口化扩展)
允许在 32 位版本的 Windows 操作系统上使用 4 GB 以上的物理内存。最多可支持 64 GB 的物理内存。
AWE 是 Windows 的内存管理功能的一组扩展,它使应用程序能够使用的内存量超过通过标准 32 位寻址可使用的4GB内存(2的32次方)。AWE 允许应用程序获取物理内存,然后将非分页内存的视图动态映射到 32 位地址空间。虽然 32 位地址空间限制为 4 GB,但是非分页内存却可以远远大于 4 GB。这使需要大量内存的应用程序(如大型数据库系统)能使用的内存量远远大于 32 位地址空间所支持的内存量。

最后:
本文仅仅讨论32位操作系统支持4GB以上内存的可行性,不涉及Win7 x86与Win7 x64的比较。
由于部分驱动程序(往往是Intel的显卡驱动)不能兼容AWE模式,导致很多ReadyFor4GB发生蓝屏现象,可见AWE模式被微软限制也不是没有道理,但不能因为驱动程序设计问题导致的蓝屏认为32位操作系统不能突破4GB内存的使用,更不能理解为ReadyFor4GB是简单的障眼法。

标签: Windows, 32Bit over 4GB

评论已关闭