服务器 频道

谁限制了4GB内存 32位Vista大内存实战

  大概很多人都知道,Windows Vista和Windows Server 2008都基于相同的代码树,也就是说,它们的核心是很相似的(这一点和Windows XP以及Windows Server 2003不同;不过,Windows XP 64bit和Windows Server 2003 64bit是相同的代码树)。据说,这样是为了维护方便:只需要研发一个补丁,就能同时应用于Vista和2008。例如,Service Pack 2就能同时应用于Vista和2008(现在已经有了5种语言的正式版SP2)。


Vista SP1的幻象:插有多少内存,Vista SP1就会显示多少,不过任务管理器里面只会有3.25GB左右

  实际上,Windows Vista SP1和Windows Server 2008的很多核心文件都是一致的(2008推出的时候SP1已经发布了,因此直接就集成了SP1,或许准确地,所有的2008都应该叫做Windows Server 2008 SP1),也许我们能通过简单的方法让32位Vista能像32位2008一样,可以使用超过4GB的内存。

  很幸运,和XP不同,32位Vista的4GB限制确实不是核心代码上的限制,而是一些其他的限制:在系统启动的时候,将会读取一个值,这个值最终确定了用户可以使用的内存。这个值叫做Kernel-WindowsMaxMemAllowedx86,通过一个未公开的函数ZwQueryLicenseValue来读取,这个值代表着可用的最大内存,如32位Windows上总是0x1000,单位是MB,也就是代表着4GB。

  更多的核心内容,可以看这里(英文):Licensed Memory in Windows Vista,国外的先贤对其进行了系列的研究。

附概念澄清:32位操作系统并不意味着只能使用4GB内存

  从硬件上讲,所谓的计算机位数是指处理器指令的长度,对硬件来说就是通用寄存器(GPR,General Purpose Registers)的宽度,它并不意味着地址总线的宽度,虽然有些情况下它们碰巧也会相等。对于当前的从80386开始算起的大多数x86处理器来说,通用寄存器的长度就是32位,支持x86-64(或者按照更常见的说法:x64)的处理器则可以支持64位的通用寄存器。32位的PowerPC(G5之前)使用32位的通用寄存器,指令长度固定为32位,DEC Alpha64则基于64位通用寄存器,指令为64位。


Intel Pentium PRO运行16/32位混合操作系统Windows 95很慢,性能甚至低于运行纯32位操作系统Windows NT

  32位操作系统指的它的指令们只使用32位宽度的GPR,并不意味着它只能的内存寻址就是32位。实际上,早在Pentium Pro(Pentium Pro是一个纯正的32位处理器)上就采用了36位的地址总线(基于这个原因,PAE有时也被称为PAE-36bit),寻址能力就达到了64GB,这个简单有效的扩展就被称为PAE(Phsical Address Extension,物理地址扩展),可见10多年前,x86处理器就能支持这么多的内存了。一再认为32位系统只能支持4GB内存在硬件上就错了。

 
32位XP/2003操作系统通过PAE来支持4GB以上的内存,因此具有“物理地址扩展”的字样


但是32位Vista/2008内部直接使用64位PTE,因此就没有了PAE相关字样

  在现代操作系统上,如32位的Windows Vista/7,为了实现与64位的兼容(如,为了驱动程序编写的方便),系统使用了64位的PTE(Page Table Entry,分页表)来管理内存,因此它们就和64位版本一样,也能管理和使用更大的内存。

0
相关文章