【IT168评测中心】时至今日,4GB内存平台已经极为常见,8GB内存的系统也在一些玩家手上出现了,导致这个现象的最主要的原因就是内存价格的持续走低,现在2GB x 2 DDR2 SDRAM的套装价格最低可以达到¥499,在这样低价格的诱惑下,8GB(2GB x 4)不到1000元的价格相比起一年前4GB内存1200元就不算什么了。
约17个月之前,笔者写了一篇关于组建4GB内存容量的平台的文章《九阳神功秘籍 4GB内存平台全探秘》,里面详细分析了为什么桌面平台插上4GB内存只能认出约3.25GB容量的原因,并引入了Memory Remap技术以及介绍了问题的解决方法,以及相关的一系列问题,对澄清广为流传的一些误会起到了相当的作用。
期间Windows Vista推出了SP1,同时Windows Server 2008也出现了
时过境迁,在这篇文章之后,市场已经发生了一些变化,原文中也有一些没有解释清楚的地方,联系到现下一些桌面系统在4GB平台下遇到的一些新现象,笔者感到有必要再撰写一篇文章,澄清一些相关的误会,并给出一种可行的解决方法:64位操作系统——当然,这个结果从本文的题目就应该可以猜得到了。
在进入64位之前,我们先看看32位下面会碰到什么问题:
DELL机皇XPS 730上的4GB只被Vista认出约2GB内存
在4GB内存的平台上使用32位的Windows XP和Windows Vista操作系统很容易出现这种情况:可用的内存往往只有3.5GB(Vista上有一个插曲,可以看本页低),或者更低,看了《九阳神功秘籍 4GB内存平台全探秘》后将会知道丢失的空间是由于
MMIO(内存映射I/O)导致的,由于这些空间的存在,可以被操作系统认出并管理的空间往往会少掉接近1GB,或者2GB(XPS 730上的极端例子)。
Vista SP1的奥妙:系统属性的内存容量显示
一些Vista的用户会发现,系统属性里面会正确显示出安装了的容量,如下图所示:
Vista SP1的幻象:插有多少内存,Vista SP1就会显示多少
然而这不过是个美好的幻象而已,微软的文档解释,Vista SP1 的其中一个改进就是根据客户的要求,系统属性里面更改为“报告实际安装的内存大小”,同时指出“能够使用的仍然只有 BIOS 分配的空间”,实际上任务管理器里面看到的容量和没有SP1的时候一样,达不到4GB。据说这是为了达到更好的销售而作出的改动,从效果来看倒是非常成功,不少人因此而认为32位Vista可以管理4GB或者更高内存(例如8GB),实际上这是一个误解,只要再看看任务管理器就可以明白。不管是XP还是Vista,只要是32位,就无法完全使用超过4GB的内存容量,你只能使用Server操作系统。
我们现在知道丢失的区间被叫做MMIO(Memory Mapped IO,映射IO)的物体占据了,在支持Memory Remapping特性的主板上面,我们可以回收这段内存,只是需要使用Server操作系统,假如坚持要使用32位的话:
32bit Windows Server 2003可以完全管理4GB内存
32bit Windows Server 2003可以完全管理4GB内存
Memory Remapping是如下图所示的一个技术:在CPU寻址的物理空间中,MMIO空间仍然存在,不过在实际插入的内存中,这部分MMIO空间对应的却已经不是原来的空间,而是一部分重新映射内存空间,在CPU想使用这部分内存的时候,CPU将寻址高于4GB内存的这部分空间,内存控制器再对其进行转换,再寻址到实际的内存条。
左边为Memory Remapping之后的地址空间分配
由于对MMIO空间部分的地址进行了转换操作,因此这个技术就被称为Memory Remapping技术,实际上就是将32位桌面操作系统缺少的那部分容量“挪动”到4GB以上的空间去了,并且移动之后的地址比实际的内存容量还要高,这样就实际上把被吃掉了的空间完全返还了,因此Server操作系统可以认出并利用4GB。
由于重映射后的新的MMIO空间在4GB以上,因此需要内存控制器支持寻址超过4GB,也就是说,你的处理器要支持PAE(Phiscal Address Extension),物理地址扩展,这是一个基本的前提,那么,这个功能有什么作用呢?
一直以来人们对于计算机存在着各种各样的误理解——欢迎来到又一处大令人误解的地方:)——32位系统并不意味着就只能寻址4GB空间。包括很多计算机理论的教师在内持有的一个常见的观点就是:32位系统只能支持4GB内存,这实际上是不正确的。
2的32次方就是4G,32位系统就是4GB,这么简单的数学还会有什么问题吗?这要先从系统的位数讲起。
根据通用寄存器GPRs区分一些处理器的位数,尚没有加入最新架构的Core 2
从硬件上讲,所谓的计算机位数是指处理器指令的长度,对硬件来说就是通用寄存器(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
了解了这个处理器的位数之后我们再来看看寻址,现在我们知道处理器的位数并不等同于寻址数,实际上,早在Pentium Pro(Pentium Pro是一个纯正的32位处理器)上就采用了36位的地址总线(基于这个原因,PAE有时也被称为PAE-36bit),寻址能力就达到了64GB,这个简单有效的扩展就被称为PAE(Phsical Address Extension,物理地址扩展),可见10多年前,x86处理器就能支持这么多的内存了。一再认为32位系统只能支持4GB内存在硬件上就错了。
除去硬件上的误区之外,还有一个软件上的误区,为什么32位就意味着2的32次方呢?
人们通常会认为32位编译的程序实际上就无法访问超过4GB的空间,由于核心/用户地址空间模型的缘故,实际上还会更低。一些人接受了支持PAE的操作系统可以支持超过4GB内存的事实,不过并不认为32位应用程序可以使用超过4GB的内存。
PAE时将线性地址翻译为物理地址(4KB内存页)
然而Microsoft在自己的操作系统提供了一个比较重要的特性:AWE(Address Windowing Extension,地址窗口扩展) API集,这个API集的原理其实是基于这样的一个事实:所有的支持PAE的操作系统本身都直接寻址64GB物理地址,提供一个API让应用程序利用PAE不过是一个很方便的举动。操作系统本身就是一个程序。
每个支持PAE的操作系统都具有这种API,差别只是在于这些API能否提供如内存共享、进程间通讯、分页等等这些功能,微软在Windows上提供了一个简单明了的API组——也就是AWE地址窗口扩展API组,它仅仅由5个API调用组成,包括了核心级和用户级调用,使用AWE分配得到的内存是非分页、锁定的,其他程序无法访问,也无法交换到页面文件(虚拟内存)上去,对性能具有很大的提升。
通过使用AWE API,核心模式/用户模式的程序可以轻易地突破2GB容量的限制,最高可以达到64GB,如SQL Server就使用了这个AWE API(可设定),从而提高对大容量内存的能力,大大提升了应用软件/系统的性能。我们测试过AWE下SQL Server的性能。
桌面级操作系统并不支持AWE API,要支持AWE的话,你需要使用服务器操作系统,如,使用Windows Server 2003,你可以轻易地在32位环境下使用多于4GB的内存:
32位的Windows Server 2003可以支持超过4GB的内存
32位的Windows Server 2003可以支持超过4GB的内存
(未完待续)