在32bit操作系统下用好4GB物理内存

最近内存价格一路下滑
直接导致很多朋友或打算增加内存或新装机采购4GB内存
CPU都支持64bit了
然而很多人并不愿意直接使用64bit操作系统
甚至有不少人装了64bit的Vista后又卸掉重新回到32bit时代
重装完后问题来了
仔细查看系统内存怎么不是4GB
少了很多嘛
有些是3GB有些是3.25GB甚至有的少于3GB
究竟是XP不支持4GB内存还是买到的内存有问题
其实这个现象是由软件伙同硬件一并作案造成的极其恶劣的后果

首先说软件方面
主要是操作系统的责任
其实像XP 32bit这样的操作系统设计上是支持4GB内存的(32bit版本XP最高支持4GB内存)
但是在整个IA32系统上位于4GB以下的内存地址在系统中被分为很多块(4GB到64GB同样被划成多块但不是这里需要讨论的)
其中主要包括了系统可用内存及PCI设备内存地址范围
操作系统中显示内存不足4GB的主要原因来源于系统地址中PCI设备的内存地址范围
这个范围是以256为基础成倍设定的
该PCI设备地址范围包括了系统BIOS/芯片组/IO/PCI区域/VGA等等等等
这些设备都是通过实际内存地址来通信的
该类地址被定义为内存映射IO空间(MMIO)
由于MMIO地址所占用的就是4GB系统地址中部分物理内存所对应的地址
此时被其占用的对应地址的原物理内存部分就完全无效了
这就是软件方面大多32bit Windows操作系统为什么在使用4GB内存时只能看见3到3.25GB的罪魁祸首

然后是硬件方面
在物理内存槽中镶着4GB内存的时候正好包含到系统地址中第一个PCI设备地址范围(MMIO)
正如上面操作系统所要求的
对MMIO的寻址部分被内存控制路由到对应的设备上
而这些设备使用的地址正是4GB系统地址中对应物理内存地址的一部分
此时它所对应的应该是实际物理内存的那部分地址就没有了(被MMIO取代)
附和操作系统来完成这一罪恶行径的正是内存控制器

那么失踪的内存还有没有办法捞回来呢
答案是肯定的
需要说明的是捞回这部分内存有前提条件
同样要从软硬件两方面下手

软件方面
NT核心的操作系统所要完成的是对PAE的支持和4GB内存调整优化
而后支持PAE的操作系统会通过AWE使每个程序的虚地址范围可以突破2GB的限制最高到64GB(64bit操作系统暂无此类问题)
那么操作系统方面解决问题的关键在于支持PAE
Win2000开始微软的操作系统基本都支持PAE
4GB内存调整优化通过/3G启动参数来启用(本质上还是对PAE的支持)

硬件方面
要捞回这部分内存就是要将这些被MMIO占用的系统地址重新被路由到对应的内存上
为了解决这个问题引入了一种叫内存重映射(Memory Remapping)的技术
Memory Remapping技术最早是在服务器上使用的
在内存重映射启动后CPU要使用这部分被MMIO占用的物理内存时会通过PAE向高于4GB的空间寻址
此时CPU自身并不具备鉴别哪些是MMIO哪些是重映射的部分的能力
需要内存控制器将其重新转换到实际物理内存上
由此才能捞回那部分失踪的内存
这个累活完全是属于内存控制器独享的(自作自受)

那么只要你使用的是Win2000之后的操作系统
能否捞回它们的关键就在于是否支持内存重映射技术(Memory Remapping)
换句话来说
如果你用的是Intel系统那就需要确定你主板北的桥芯片是否支持Memory Remapping(Intel目前将内存控制器集成在北桥芯片中)
如果你用的是AMD的系统的话那么就需要先确定你的CPU是否支持Memory Remapping(AMD目前设计的内存控制器集成在CPU中)
从掌握的资料来看Intel支持该技术的桌面芯片组是i955X之后的所有支持8GB内存的型号
AMD支持该技术的桌面CPU为Athlon 64(不含闪龙)以上支持8GB内存的型号
同时我们必须在BIOS内打开Memory Remapping的选项才能正式开始捞回失踪的内存
至此
内存打捞工作告一段落

值得留意的是目前一些主板并不独立提供提供Memory Remapping开关但在其出厂时都已经被设置为打开了
还需要注意的是一些中低端主板产品为了尽可能降低成本而没有设置该功能
第三方芯片组中nVidia/ATI的高端双卡系统具备该功能
ULI和VIA芯片组不详
在支持和打开Memory Remapping技术的32bit操作系统上通常能使用到3.5GB以上的物理内存(仍然不会完全显示出4GB的)

虽然说Memory Remapping就是专门用来解决那些系统地址被设计在4GB内的操作系统中的内存丢失现象
但究其原因还是因为大多32bit操作系统无法完全利用4GB物理内存和其支持的系统内存最高只有4GB有关
同样的设计也出现在XP各个32bit版本/Windows 2000各版本(高级服务器版本除外)/windows 2003标准版/Vista各个32bit版本中
XP 64bit和Vista各个64bit版本/Windows 2003除了标准版外/Windows 2000只有高级服务器版无此问题