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以上的内存,因此具有“物理地址扩展”的字样
启动时系统在NTKRNLPA.EXE内核文件中使用了这样的代码:
7C
xx
jl default
8B 45 FC
mov eax,dword ptr [ebp-4]
85 C0
test eax,eax
74
yy
je default
执行中,eax寄存器中保存了ZwQueryLicenseValue的状态值,在通常情况下,系9 7 3 1 2 3 4 4 8 :
本文来源:IT168评测中心 作者:佚名