800MB内存被“吞噬”了
大家也许会发现一个奇怪的现象,在我们平时使用的32位的windows xp和vista中,安装了4GB内存后,显示出来的只有3.2GB,甚至更少,有800MB的内存“无缘无故”地消失了,让人费解,主板和操作系统之所以不能够完全使用4GB内存,问题的根源就在于计算机那32位X86架构。32位X86架构是指个人电脑的地址总线是32位的,CPU,内存控制器,操作系统都是按32位地址总线设计。32位地址总线可以支持的内存地址代码是4096MB,也就是有4GB的地址代码,可以编辑4GB个地址。这4GB个地址代码正好可以分配个4GB内存。但是,这4GB个地址代码不能完全分配个安装在主板上的物理内存。因为个人电脑还有很多设备需要地址代码,以便CPU可以根据地址代码找到它们,同时CPU和这些设备交换数据需要暂时存放的存储器---寄存器,这些寄存器也需要地址代码。比如硬盘控制器,软驱控制器,管理插在PCI槽上的PCI卡的PCI总线控制器,PCI-E总线控制器和PCI-E显卡,它们都有寄存器需要吸引分配给它们地址代码。这些地址由系统分配,电脑用户在使用中感觉不到。这样一来,当我们为电脑插上总容量为4GB的内存时,就有一部分内存分配不到地址代码而不能使用。
CPU,内存控制器,BIOS:能支持4GB内存
CPU能支持4GB内存
从386时代开始,cpu的地址总线就是32位的,可以访问4GB内存的地址代码。奔腾4在理论上已经可以访问64GB的地址编码。后来支持64位架构的奔腾4到现在的酷睿2,地址总线已经升级到64位,64位地址总线可以访问千亿GB的地址编码。实际上用不到这么多的地址总线,一般用42位就足够了,可以编码的地址量有4TB。兼容64位架构的CPU用在32位系统时地址总线就缩小位36位。所以现在的CPU支持4GB的内存是没有问题的。
内存控制器的地址总线
Inter的内存控制器
由于inter的内存控制器放在北桥内,内存控制器的改变就与北桥密切相关,inter从p965开始内存控制器已经时36位地址总线,可以编辑64GB的地址代码,除系统占用的地址码,分配给主板安装的4GB内存绰绰有余。所以,从p965开始inter的北桥支持4GB内存时没有问题的。
AMD的内存控制器
AMD从支持64位架构的CPU(athon64)开始把内存控制器集成到CPU。内存控制器的地址总线时64位架构的,使用到40位,可以支持1000GB的地址编码。所以,AMD从athon64开始,内存控制器支持4GB内存是没有问题的。
BIOS能支持4GB内存
BIOS不是主板厂家自己开发的,BIOS版权控制在AMI等几家公司。它们与inter和amd合作开发bios。所以当inter和amd提出“映射”方式解决4GB内存问题,AMI等厂商就会开发除相应的bios。早期的bios里面会显示出“映射”选项,用户可以开启或者关闭。现在默认开启,不再显示这项设置。所以可以说,对于现在的bios来说,在支持4GB的内存是没有问题的。
4GB内存的“原罪”:X86架构
CPU和内存控制器从硬件上为使用4GB内存提供了保障。但是这还没有解决4GB内存的问题。障碍来自个人电脑的体系标准---32位X86架构。早在8086时代,内存是焊接在主板上的,一般也就几KB的内存,IBM规定640KB的地址是最高端,这个地址分配给BIOS,接下来有一段地址分配给系统的显示设备和I/O设备。电脑的迅速发展很快突破640KB内存容量达到并超过1MB,但是640KB下面的这一段地址分配不能改变,因为CPU,DOS操作系统都是从640KB读取BIOS,通过640KB下面的显示设备寄存地址,I/O设备寄存地址与显示设备,I/O设备通信,交换数据。如果更改,以前的所有电脑都要报废。所有必须一个方法,既不概念640KB地址分配,又可以使用640KB到1MB的内存。那就是这种地址分配规则不变,采用“内存地址映射”技术,把640KB到500多KB的这一段地址映射到640JB到1MB的空间里,映射工作由BIOS负责。操作系统则由两条DOS命令HIMEM.SYS和EMM386.SYS负责。熟悉DOS的用户都知道这两条命令。通过“映射”,就可以让DOS软件使用更多的内存。内存发展到4MB.16MB,都是通过“内存映射技术”解决的。到现在,个人电脑只要兼容DOS,就必须遵守“640KB”这个地址内存分配规则。
奔腾2时代,SDRAM内存容量达到128MB。那时候的地址总线是32位的,最大地址空间是4GB,按时候32位X86架构已经完全形成。除保留以前的内存地址分配规则外,还要把BIOS地址映射到地址空间的顶端---4GB.一直到815时代的DDR内存,915时代的DDR 2内存。真正使用的内存单条容量最大为512MB,系统使用的内存不会超过2GB,所以4GB内存问题没有显示出来。
其实,inter在915时代就提示要解决32位X86架构硬件支持4GB内存的问题。到P965正式解决,解决方案还说“内存地址映射”。这个方案不是最新想出来的,在32位X86架构的服务器系统早已采用,只是被移植到个人电脑上来了。
从64GB的地址空间顶部开始,映射PCI设备的I/O地址,然后映射系统占用的3GB到4GB的地址。把3GB到4GB的这段地址代码留给安装在主板上的物理内存,就可以完全使用安装的全部内存了。
位什么必须要采用“映射”的办法?因为内存的编码地址必须是连续的,不能断开。而系统的地址空间(也叫逻辑地址)是可以不连续的。当然这种映射工作还是有BIOS完成。要支持4GB内存,就必须要BIOS的支持。
通过内存地址重映射把系统占用的4GB地址还给物理内存,是32位X86架构的规则。AMD也要遵守这个规则,虽然它的内存控制器集成在CPU内。也正是由于内存控制器集成在CPU内,北桥不含有内存控制器。主板厂商开发AMD平台主板时,会依据市场定位设计主板支持的内存容量。有材质2GB的,有支持4GB,8GB的或者更多。所以AMD平台的4GB问题还要看主板。
操作系统才是“罪魁祸首”操作系统管理和使用内存,因此在操作系统内也必须有一个逻辑(虚拟)地址系统,与主板上的所有存储地址(包括内存的,I/O设备的,BIOS的)对应,也有类似“地址总线”的结构。32位操作系统是按32位地址总线设计,32位的地址寄存器,因此只能管理4GB的地址,去掉系统占用的,也不能完全使用全部4GB内存。个人电脑的32位操作系统都不能支持4GB内存,即使是32位的vista sp1也不可以。但是vista sp1比windows xp sp3进步的是在系统属性里面可以显示操作系统实际安装的内存容量。
哪么那些操作系统可以支持4GB的内存?第一是64位操作系统,因为64位操作系统是按64位地址总线设计的。比如windows xp64, vista 64.
第二具有物理地址扩展功能,并且地址寄存器大于32位的服务器操作系统,但是有些具有物理地址扩展的服务器操作系统,由于地址寄存器限于32位也不能支持4GB内存。
插入表情