论文部分内容阅读
随着微软新一代操作系统Windows Vista的发布,以及市场上大容量内存的普及,机箱里面也变得分外热闹起来。原来大家多会选择2×512MB或者4×512MB的内存,现在4×1GB甚至2×2G8的内存成为很多发烧友用户的选择。但问题也随之而来,尽管我们给系统装上了4GB的内存,但是为什么在BIOS里面不能识别出完整的4G8?我们在Windows里面看到的内存容量也会出现缩水现象,是谁动了我们的内存呢?
尽管众多主板都宣称自己支持4GB以上的内存容量,但情况远没有想像中那么简单,现在的问题是哪些主板和操作系统可以支持4GB以上的内存?这其中有会涉及到哪些技术原理,BIOS又将做怎样的改变呢?本文将——回答这些问题。
随着大容量内存的普及,拥有4GB乃至4GB以上内存的用户越来越多,大家在使用中可能很多人都遇到了内存容量莫名其妙“缩水”的问题。这就好像我们在市场上买了四斤猪肉,但是回家一称发现只有3斤多一点,剩下的哪里去了呢?喜欢刨根寻底的朋友们一定会问一个为什么。
4GB地址空间的局限
用户安装了4GB内存,自然希望这4GB内存全部被操作系统所使用,但为什么还会出现无缘无故“缩水”的情况呢?其实,我们将内存装在主板上之后,只是在电路上连通了,而这些物理内存空间还需要编址才能够被识别和使用。
为了搞清楚其中的过程,我们必须先了解两个概念:
其一是“物理内存”。大家常说的物理内存就是指安装在主板上的内存条,其实不然,在计算机的系统中,物理内存不仅包括装在主板上的内存条(RAM),还应该包括主板B10S芯片的ROM,显卡上的显存(RAM)和BIOS(ROM),以及各种PCI、PCI.E设备上的RAM和ROM。
其二是“地址空间”。地址空间就是对物理内存编码(地址编码)的范围。
从中我们可以看出,安装3GB内存时1~7项并没有占用内存条的地址空间,只有8、9项占用了部分内存空间,但因为占用容量较小,所以平时我们并没有在意。安装4GB内存之后,1~7项的地址空间就会与内存发生冲突,导致内存条的部分存储空间因得不到编址而不能被使用,这样可使用的空间就小于4GB。
我们用列表的形式列出了各部分RAM及ROM所占用的物理空间,为了给大家一个更形象的概念,我们用柱状图来说明一下各物理内存之间的寻址关系。
从图中我们可以看到4GB的地址空间可以分为两大部分,0MB~物理内存顶端的地址分配给主板上安装的物理内存(A部分),4GB到物理内存顶端的地址分配给BIOS(ROM)和PCI/PCI-E设备的存储器(B部分)。由于这些存储器基本上是用于系统的输入和输出,所以Intel又把这段地址空间称为“MMIO”(Memory-Mapped I/O-I/O存储器映射)。当系统安装3GB以下的内存时,MMIO区域不会与物理内存条的地址空间相重叠,操作系统可以访问几乎全部的物理内存,而操作系统属性里显示的物理内存基本接近实际内存的容量。
而当系统安装上4GB内存时,问题出现了。由于位于4GB下面的部分地址空间要优先分配给MMIO,内存条上对应的这段区间就得不到编址,所以操作系统就不能使用。
严格意义上来说,即使安装更低容量的内存时操作系统也不可能使用到全部的内存容量,诸如传统DOS的UMA区就有部分被占用的地址空间,但因为被占用的容量相比之下实在太少,所以就被很多读者忽略了。MMIO占用的地址空间在256MB~1GB之间,这么大的“浪费”大家肯定不能“熟视无睹”。
既然已经知道了原因所在,那有没有办法来解决这个问题呢?答案可能会令部分用户失望了,因为受4GB芯片组地址空间的限制(32条地址线的限制),Intel 945系列及以前的芯片组、NVIDIA nForce 550R以前的芯片组都没有办法绕过这个限制。具体原因有三面:其一是芯片组没有剩余空间(配额)来供操作系统调配;其二是物理内存的编址必须是连续的,不能被割断;其三是系统开机时必需先从4GB的顶端地址(FFFF_FFFFh)读取BIOS数据,这是IA32架构和4GB地址空间的局限。
所以我们建议使用这些芯片组主板的用户不要安装4GB的内存,这样会有部分内存容量不能被操作系统所使用。而解决4GB内存限制的唯一办法就是扩展地址空间。
支持大于4GB内存的芯片组
面对原有芯片组4GB内存的局限,Intel和NVIDIA早就开始未雨绸缪,他们对传统的32位地址总线进行了调整,将其升级到36位,并推出了一系列可以突破4GB内存限制的芯片组,这就是Intel的965系列以及975系列、NVIDIA的nForce 570/590以及680系列。
从上面的芯片组参数来看,地址总线从32位提升到36位,地址空间达到64GB,支持安装8GB的物理内存。但由于IA32架构的规则是开机时必须从4GB的FFFF_FFFFh地址读取BIOS信息,尽管芯片组支持的地址空间变大了,且最大支持的物理内存容量也达到了8GBf或以上),但从本质上来说仍然不能解决MM10地址占用4GB内存编址的问题。这要怎么办呢?
36位地址总线最大可以支持64GB的地址空间,这就为移动MMIO地址区提供了条件。现在我们解决这个问题的办法就是“内存重映射”技术一一就是在IA32架构的基础上,把BIOS(ROM)和PCI/PCI-E设备占用的MMIO地址区段重新映射到内存条顶端地址以上(例如4GB以上)的地址空间,从而把IA32架构规定的这一段 操作系统不可使用的、位于4GB下面的MMIO地址空间回收给物理内存使用,保证物理内存编址的连续性。
MMIO地址空间回收的第一步是在系统地址空间建立一个回收区,在图中回收区的下边界是“回收区基地址”,回收区基地址=物理内存的顶端地址,在本例中就是4GB;回收区的上边界是“回收区上限地址”,回收区上限地址=回收区基地址 X,X就是MMIO占用的地址空间量,在本例中是800MB。由此我们可以计算得到上边界的地址是4GB 800MB=4.8GB,重映射就是把MMIO占用的4GB~3.2GB的地址空间移到4.8GB~4GB的位置,然后把4GB~3.2GB的地址空间回收给物理内存。
第二步则是在“可用内存顶端地址”和“物理内存顶端地址”之间界定了一个侦测窗口。本例中的可用内存顶端地址=3.2GB,物理内存顶端地址=4GB,构成800MB大小的侦测窗口。当系统I/O寻址的地址落在这个侦测窗口内,系统就自动加Z4GB的偏移地址转到回收区;如果地址落在侦测窗口内但不是系统I/O寻址,就不会把这个寻址转到回收区,而是直接访问物理内存。
在安装8GB内存时也存在类似的MMIO地址占用问题,同样需要内存重映射来解决。
上面我们所说的回收区和侦测窗口的边界地址是BIOS依据用户的硬件配置和设置经过计算得到的,并存放在芯片组(MCH)相关的地址寄存器中。从这个意义上说,BIOS必须具有支持内存重映射的功能模块,以便根据用户安装的内存容量来确定是否需要启用内存重映射功能。同时,在BIOS的设置选单中也要有“MemoryRe-Mapping”的设置选项,使用4GB或者4GB以上内存的用户一定要将此项设置设为“Enable”。
解决4GB内存问题还需要操作系统支持
在硬件方面我们已经可以解决4GB的限制问题,但事情还没有结束,因为要支持更大容量的内存还需要操作系统的支持。例如我们使用的桌面操作系统多是32位的,如Windows XP(32bit)虽然理论上可以支持4GB的内存,但是依然没有办法完美解决4GB内存的限制。因此我们应该使用支持大于4GB地址空间的32位操作系统或64位的操作系统。
小结
在文章的最后,让我们对内存4GB限制问题所涉及到的技术点做一下总结,以期对遇到这个问题的读者朋友们有所帮助。
1.由于IA32架构的要求,BIOS(ROM)芯片的地址、PCI/PCI-E存储器地址以及APCI中断路由地址等必须占用从4GB开始以下的256M~1GB空间。这段MMIO地址区不能分配给内存条,这就导致4GB内存中会有256MB~1GB的容量因不能编址而浪费。
2.如果要使用4GB以上的内存,必须使用地址(编址)空间64GB的芯片组主板。
3.内存重映射就是把被MMIO占用的地址移到内存条容量以上的地址空间,BIOS中应有开启对应的“Memory Remap Feature”选项。
4.必须安装寻址空间大于4GB的操作系统,如Windows 2000高级服务器版本或者64bit的操作系统才能支持4GB以上的内存。
5.只有32bit地址总线的芯片组(Intel 945和NVIDIA nForce 550以前的芯片组)不能通过“内存重映射”技术来解决4GB内存限制的问题。
尽管众多主板都宣称自己支持4GB以上的内存容量,但情况远没有想像中那么简单,现在的问题是哪些主板和操作系统可以支持4GB以上的内存?这其中有会涉及到哪些技术原理,BIOS又将做怎样的改变呢?本文将——回答这些问题。
随着大容量内存的普及,拥有4GB乃至4GB以上内存的用户越来越多,大家在使用中可能很多人都遇到了内存容量莫名其妙“缩水”的问题。这就好像我们在市场上买了四斤猪肉,但是回家一称发现只有3斤多一点,剩下的哪里去了呢?喜欢刨根寻底的朋友们一定会问一个为什么。
4GB地址空间的局限
用户安装了4GB内存,自然希望这4GB内存全部被操作系统所使用,但为什么还会出现无缘无故“缩水”的情况呢?其实,我们将内存装在主板上之后,只是在电路上连通了,而这些物理内存空间还需要编址才能够被识别和使用。
为了搞清楚其中的过程,我们必须先了解两个概念:
其一是“物理内存”。大家常说的物理内存就是指安装在主板上的内存条,其实不然,在计算机的系统中,物理内存不仅包括装在主板上的内存条(RAM),还应该包括主板B10S芯片的ROM,显卡上的显存(RAM)和BIOS(ROM),以及各种PCI、PCI.E设备上的RAM和ROM。
其二是“地址空间”。地址空间就是对物理内存编码(地址编码)的范围。
从中我们可以看出,安装3GB内存时1~7项并没有占用内存条的地址空间,只有8、9项占用了部分内存空间,但因为占用容量较小,所以平时我们并没有在意。安装4GB内存之后,1~7项的地址空间就会与内存发生冲突,导致内存条的部分存储空间因得不到编址而不能被使用,这样可使用的空间就小于4GB。
我们用列表的形式列出了各部分RAM及ROM所占用的物理空间,为了给大家一个更形象的概念,我们用柱状图来说明一下各物理内存之间的寻址关系。
从图中我们可以看到4GB的地址空间可以分为两大部分,0MB~物理内存顶端的地址分配给主板上安装的物理内存(A部分),4GB到物理内存顶端的地址分配给BIOS(ROM)和PCI/PCI-E设备的存储器(B部分)。由于这些存储器基本上是用于系统的输入和输出,所以Intel又把这段地址空间称为“MMIO”(Memory-Mapped I/O-I/O存储器映射)。当系统安装3GB以下的内存时,MMIO区域不会与物理内存条的地址空间相重叠,操作系统可以访问几乎全部的物理内存,而操作系统属性里显示的物理内存基本接近实际内存的容量。
而当系统安装上4GB内存时,问题出现了。由于位于4GB下面的部分地址空间要优先分配给MMIO,内存条上对应的这段区间就得不到编址,所以操作系统就不能使用。
严格意义上来说,即使安装更低容量的内存时操作系统也不可能使用到全部的内存容量,诸如传统DOS的UMA区就有部分被占用的地址空间,但因为被占用的容量相比之下实在太少,所以就被很多读者忽略了。MMIO占用的地址空间在256MB~1GB之间,这么大的“浪费”大家肯定不能“熟视无睹”。
既然已经知道了原因所在,那有没有办法来解决这个问题呢?答案可能会令部分用户失望了,因为受4GB芯片组地址空间的限制(32条地址线的限制),Intel 945系列及以前的芯片组、NVIDIA nForce 550R以前的芯片组都没有办法绕过这个限制。具体原因有三面:其一是芯片组没有剩余空间(配额)来供操作系统调配;其二是物理内存的编址必须是连续的,不能被割断;其三是系统开机时必需先从4GB的顶端地址(FFFF_FFFFh)读取BIOS数据,这是IA32架构和4GB地址空间的局限。
所以我们建议使用这些芯片组主板的用户不要安装4GB的内存,这样会有部分内存容量不能被操作系统所使用。而解决4GB内存限制的唯一办法就是扩展地址空间。
支持大于4GB内存的芯片组
面对原有芯片组4GB内存的局限,Intel和NVIDIA早就开始未雨绸缪,他们对传统的32位地址总线进行了调整,将其升级到36位,并推出了一系列可以突破4GB内存限制的芯片组,这就是Intel的965系列以及975系列、NVIDIA的nForce 570/590以及680系列。
从上面的芯片组参数来看,地址总线从32位提升到36位,地址空间达到64GB,支持安装8GB的物理内存。但由于IA32架构的规则是开机时必须从4GB的FFFF_FFFFh地址读取BIOS信息,尽管芯片组支持的地址空间变大了,且最大支持的物理内存容量也达到了8GBf或以上),但从本质上来说仍然不能解决MM10地址占用4GB内存编址的问题。这要怎么办呢?
36位地址总线最大可以支持64GB的地址空间,这就为移动MMIO地址区提供了条件。现在我们解决这个问题的办法就是“内存重映射”技术一一就是在IA32架构的基础上,把BIOS(ROM)和PCI/PCI-E设备占用的MMIO地址区段重新映射到内存条顶端地址以上(例如4GB以上)的地址空间,从而把IA32架构规定的这一段 操作系统不可使用的、位于4GB下面的MMIO地址空间回收给物理内存使用,保证物理内存编址的连续性。
MMIO地址空间回收的第一步是在系统地址空间建立一个回收区,在图中回收区的下边界是“回收区基地址”,回收区基地址=物理内存的顶端地址,在本例中就是4GB;回收区的上边界是“回收区上限地址”,回收区上限地址=回收区基地址 X,X就是MMIO占用的地址空间量,在本例中是800MB。由此我们可以计算得到上边界的地址是4GB 800MB=4.8GB,重映射就是把MMIO占用的4GB~3.2GB的地址空间移到4.8GB~4GB的位置,然后把4GB~3.2GB的地址空间回收给物理内存。
第二步则是在“可用内存顶端地址”和“物理内存顶端地址”之间界定了一个侦测窗口。本例中的可用内存顶端地址=3.2GB,物理内存顶端地址=4GB,构成800MB大小的侦测窗口。当系统I/O寻址的地址落在这个侦测窗口内,系统就自动加Z4GB的偏移地址转到回收区;如果地址落在侦测窗口内但不是系统I/O寻址,就不会把这个寻址转到回收区,而是直接访问物理内存。
在安装8GB内存时也存在类似的MMIO地址占用问题,同样需要内存重映射来解决。
上面我们所说的回收区和侦测窗口的边界地址是BIOS依据用户的硬件配置和设置经过计算得到的,并存放在芯片组(MCH)相关的地址寄存器中。从这个意义上说,BIOS必须具有支持内存重映射的功能模块,以便根据用户安装的内存容量来确定是否需要启用内存重映射功能。同时,在BIOS的设置选单中也要有“MemoryRe-Mapping”的设置选项,使用4GB或者4GB以上内存的用户一定要将此项设置设为“Enable”。
解决4GB内存问题还需要操作系统支持
在硬件方面我们已经可以解决4GB的限制问题,但事情还没有结束,因为要支持更大容量的内存还需要操作系统的支持。例如我们使用的桌面操作系统多是32位的,如Windows XP(32bit)虽然理论上可以支持4GB的内存,但是依然没有办法完美解决4GB内存的限制。因此我们应该使用支持大于4GB地址空间的32位操作系统或64位的操作系统。
小结
在文章的最后,让我们对内存4GB限制问题所涉及到的技术点做一下总结,以期对遇到这个问题的读者朋友们有所帮助。
1.由于IA32架构的要求,BIOS(ROM)芯片的地址、PCI/PCI-E存储器地址以及APCI中断路由地址等必须占用从4GB开始以下的256M~1GB空间。这段MMIO地址区不能分配给内存条,这就导致4GB内存中会有256MB~1GB的容量因不能编址而浪费。
2.如果要使用4GB以上的内存,必须使用地址(编址)空间64GB的芯片组主板。
3.内存重映射就是把被MMIO占用的地址移到内存条容量以上的地址空间,BIOS中应有开启对应的“Memory Remap Feature”选项。
4.必须安装寻址空间大于4GB的操作系统,如Windows 2000高级服务器版本或者64bit的操作系统才能支持4GB以上的内存。
5.只有32bit地址总线的芯片组(Intel 945和NVIDIA nForce 550以前的芯片组)不能通过“内存重映射”技术来解决4GB内存限制的问题。