Board logo

标题: 4GB内存无法完全识别问题 [打印本页]

作者: dnyh    时间: 2009-4-29 18:52     标题: 4GB内存无法完全识别问题

文章的出处是那里我也记不清了!不过它的确值得我们借鉴一、二、

因为内存价格的持续走低,目前各大内存厂商相继推出了单条2GB的DDR2 800内存,这些内存给人最大的感觉就是价格便宜量又足。很多用户就直接买了两条2GB的内存,想组成双通道使用。可拿回家一看,原本4GB的内存容量被识别出来的只有3.2GB左右。通过检查,发现内存本身并没有问题。那又是什么吞食了你的内存呢?这就是我们本期将要给大家说清楚的一个问题。
  

      800MB内存被吞食了
  大家或许会发现一种很奇怪的现象,在我们的Windows XP和Vista中,安装4GB内存后,显示出来的只有3.2GB左右甚至更少,有800多MB的内存“无缘无故”地消失了,这让人感觉十分费解,主板和操作系统之所以不能使用全部的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的内存时,就有一部分内存分配不到地址代码而不能使用。
  

      要深入了解4GB内存之谜,我们就得弄清楚各部件与4GB内存关系,其中涉及到的部件有CPU、内存控制器(Intel平台集成在北桥,AMD平台集成在CPU)和操作系统。
  CPU、内存控制器、BIOS:能支持4GB
  CPU能支持4GB内存
  从386时代开始,CPU的地址总线就是32位的,可以访问4GB的地址代码。从奔腾Ⅱ到奔腾Ⅳ,理论上已经可以访问64GB的地址编码。后来支持64位架构的奔腾Ⅳ到现在的酷睿2,地址总线已经升级到64位,64位地址总线可以访问千亿GB的地址编码。实际上用不到这么多的地址总线,一般用42位足够了,可以编码的地址量有4TB。兼容64位架构的CPU用在32位系统时地址总线就缩小为36位。所以现在的CPU支持4GB内存是没有问题的。
  

     内存控制器的地址总线
  与主板安装的内存直接关联的是内存控制器。内存控制器一边管理内存,一边通过地址总线与CPU通信。内存控制器的地址总线决定了可以支持的内存地址编码数量,同时内存控制器的实际连接内存的地址线决定了可以支持的内存容量。Intel把内存控制器放在北桥,AMD把内存控制器放在CPU。所以要分开介绍。

  1、Intel的内存控制器
    由于Intel的内存控制器放在北桥内,内存控制器的改变就与北桥密切相关。我们可以看下面的北桥列表:
  从上面的北桥地址总线发展表可以看出,从P965开始内存控制器已经是36位地址总线,可以编64GB的地址代码,除系统占用的地址码,分配给主板安装的4GB内存绰绰有余。所以,从P965开始Intel的北桥支持4GB内存是没有问题的。
  2、AMD的内存控制器
   AMD从支持64位架构的CPU(Athlon64)开始把内存控制器集成到CPU。内存控制器的地址总线是64位架构的,使用40位,可以支持1000GB的地址编码。所以,AMD 从Athlon64开始,内存控制器支持4GB内存也是没有问题的。
  

     BIOS能支持4GB内存
  BIOS不是主板厂家自己开发的,BIOS版权控制在AMI等几个公司。它们与Intel和AMD合作共同开发BIOS。所以当Intel和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的这一段地址映射到640KB-1MB的空间里,映射工作由BIOS负责。操作系统则由两条DOS命令HIMEM.SYS和EMM386.SYS负责,熟悉DOS的用户,都会知道这两条命令。通过映射,就可以让DOS软件使用更多的内存。内存发展到4MB,16MB,都是通过“内存映射”技术解决。到现在,个人电脑只要兼容DOS,就必须遵守640KB这种地址内存分配规则。
  奔腾Ⅱ时代,SDRAM内存容量达到128MB。那时候的地址总线是32位,最大地址空间是4GB,这时32位X86架构已经完全形成。除保留以前的内存地址分配规则外,还要把BIOS地址映射到地址空间的顶端——4GB。一直到815时代的DDR内存,915时代的DDR2内存。真正使用的内存单条最大容量为512MB,系统使用的内存不会超过2GB。所以4GB内存问题没有显现。
  945时代时1GB的DDR2内存出现后,内存控制器的设计者们开始考虑主板安装4GB的内存条。但当时很少有用户使用4GB内存,4GB内存问题依然没有凸现。
  其实,Intel在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内存,即使是VISTA 32 SP1也不能。VISTA 32 SP1比XP 32 SP3进步一点的是在系统属性里面可以显示实际安装多少内。
  32位的Vista SP1已经能顺利识别4GB内存
  在任务管理器可以看到系统真正使用的内存不到4GB。
  那么哪些操作系统可以支持并使用4GB内存?第一是64位操作系统,因为64位操作系统是按64位地址总线设计的。比如Windows XP 64,Vista 64。第二是具有物理地址扩展功能,并且地址寄存器大于32位的服务器操作系统,但有些具备物理地址扩展的服务器操作系统,由于地址寄存器限于32位也不能支持4GB。
  

      写在最后
  可以看出,现在的主板芯片组或内存控制器已经不再是吞食我们内存的主要原因。而罪魁祸首则是出在我们使用的32位操作系统上。虽然现在的Vista SP1已经能识别到完整的4GB内存,但实际使用的内存还是和以前的那3GB左右的没区别。所以现在来谈4GB内存的普及依然为时过早。另一方面,有的内存厂商为了避免出现内存浪费的情况发生,推出了三条1GB内存的组合套装,这也是相当贴心的一个设计。  


作者: 天地遥昭    时间: 2009-4-29 19:05

用个ramdisk就是了。。。把不认的做成虚拟盘。。。
作者: gyuxuan    时间: 2009-4-29 19:09

楼上正解,都这么来用,提高利用率,呵呵
作者: liuxingzixin    时间: 2009-4-29 19:16

虚拟盘挺好用
作者: fjhyr    时间: 2009-4-29 20:08

32位的架构只能支持3.2G,让我们转移到64位的CPU和架构来。。。。
作者: luckyjun    时间: 2009-4-29 20:13

学习了解一下!
作者: fantyzzb    时间: 2009-4-29 20:29

我也是来看看,小弟拜学!
作者: mafa    时间: 2009-4-29 20:50

来看看学习了解一下!
作者: zhulei5    时间: 2009-4-29 20:55

是的,32位的系统没有办法完全使用4G内存。
作者: 乐色    时间: 2009-4-29 20:56

学习了  
期待系统尽快完善吧
作者: notcry    时间: 2009-4-29 21:03

如果是32位的Windows Server 2003呢
作者: woairtt    时间: 2009-4-29 21:27

学习了   谢谢LZ的贴
作者: yjj336    时间: 2009-4-29 21:43

学习了,楼主辛苦
作者: xyfchris    时间: 2009-4-29 22:03

我现在用64位OS,可惜我没4G内存,呵呵。
作者: yannic    时间: 2009-4-30 02:25

原帖由 notcry 于 2009-4-29 21:03 发表
如果是32位的Windows Server 2003呢

32位的server 系统由于微软采用了物理地址扩展, 这个楼主也有说过,其实就是我们常说的“PAE(physical address extension)”,他是通过将物理内存映射到虚拟地址空间,从而可以寻址超过4G的物理内存

[ 本帖最后由 yannic 于 2009-4-30 04:18 编辑 ]
作者: yannic    时间: 2009-4-30 02:47

原帖由 天地遥昭 于 2009-4-29 19:05 发表
用个ramdisk就是了。。。把不认的做成虚拟盘。。。


使用ramdiak要承担很大的风险的。有可能会是你的输入输出设备异常工作,或者数据被莫名其妙的破坏,蓝屏是最常见的了。如果你什么问题都没有遇到,只能说明你运气好。
比如你使用4G的内存,而由于有内存映射技术,CPU是完全可以去寻址到全部4G内存的,BIOS会给全部给全部内存分配地址空间,而这些地址空间可以是不连续的,操作系统使用了3G,那么剩余的1G被BIOS映射到哪里去了?汗一个!只有BIOS知道,操作系统可能会知道(这个我不确定),vista SP1和windows7应该是知道的。
但是ramdisk是绕过操作系统去工作的,ramdisk是通过简简单单的IN / OUT 这两条输入输出指令去写入或者读取数据的,他只能去估计那1G的内存的逻辑地址,对了还好,要是估计错了,同时ramdisk猜为1G剩余内存的逻辑地址实际上是BIOS分配给某个PCI设备的,你想想,当ramdisk去写数据的时候,会发生什么情况?

[ 本帖最后由 yannic 于 2009-4-30 02:52 编辑 ]
作者: 雪叶青灵    时间: 2009-4-30 07:50

ramdisk并不能使你的系统认到4g内存~~它只是讲一部分内存转化为缓存
作者: hitlove    时间: 2009-4-30 08:56

做虚拟内存用
作者: xynulsx    时间: 2009-4-30 21:43

价格确实走低了
作者: 刘易斯    时间: 2009-4-30 22:45

用ramdisk就可以解决了
作者: yjj336    时间: 2009-5-1 17:22

看来4G的就得用64位的
作者: I小B黑M    时间: 2009-5-2 02:48

不错,好文章
作者: 水中龙族    时间: 2009-5-4 16:33

提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 鸿利在线|北京Thinkpad水货|IBM水货|Thinkpad笔记本|Thinkpad全球购|Thinkpad美行|Thinkpad水货笔记本|Thinkpad港行笔记本|Thinkpad T14|X13|P15|P17|P1隐士| X1 Carbon 9代 |T14S|2021款X1 Carbon|X1 隐士|Thinkpad非官方论坛|Thinkpad工作站|Thinkpad笔记本论坛|Thinkpad水货 (http://nb591.com./) Powered by Discuz! 7.2