本人并非电脑专业,以下论述是个人学习研究的总结,纯属兴趣爱好,可作参考。若有错误欢迎指出。
由于前段内存的白菜价,很多人都选择了这种既简单又有效的升级方式。但是不少人兴冲冲地插上4G的内存后却发现系统其实只能用到3g多一点。
开始很多有电脑知识的人纷纷指出在32位的系统上是不可能用到4g的内存。理由是,32位的系统只具有2^32=4294967296也就是4g的寻址能力。但系统有4g的寻址能力并不意味着就可以使用4g的内存。因为这4g的地址是cpu直接读取的地址,所以除了有通常意义上内存的地址外,还有各种硬件地址,其中最大的是I/O设备的地址,也就是PCI Memory Range(PCI存储空间,其中包括了显卡、磁盘控制器等等)。这些硬件的地址占据了本该属于内存的地址。如图:
图一
PCI:计算机与其外围部件互联标准
MMIO:MMIO全称是Memory-mappedI/O,它是PCI规范的一部分,是一种在CPU和外围设备之间执行输入输出功能的途径。MMIO简单说就是将各种外围设备的控制寄存器映射到物理内存地址上,CPU可以像访问内存一样方便的访问I/O设备,而无需重复再三的去调用IO控制函数。CPU会将自己的寻址空间预留一块用于I/O设备,这也意味着内存地址被占用了一块,但并不会真的占用物理内存存储空间。
在图一的左图中可看出,4gb的地址中的末端有很大一部分是被用作硬件地址。只有大概3gb左右空间才真正属于内存。而不能用于内存使用的那块地址则称为MMIO hole。这也就是为什么当内存小于3gb时就没有很明显的问题(其实依然有些影响,后面详细叙述)。
我的笔记本是使用intel PM965的芯片组,我就来看看PM965的主内存地址映像(0 to 4GB)
图二
以下是官方的说明:
This address range extends from 1 MB to the top of physical memory that is permitted to be accessible by the ( G ) MCH ( as programmed in the TOLUD register ) . All accesses to addresses within this range are forwarded by the ( G ) MCH to the DRAM unless they fall into the optional TSEG , optional ISA Hole , or optional IGD stolen VGA memory .
翻译:该地址区域从1MB 扩展到允许MCH / GMCH 访问(程序已在TOLUD 寄存器中设置好)的物理存储器的顶部。所有对该区域中地址的访问,均由MCH / GMCH 正向引导到主存储区,除非这些地址落到了可选的TSEG 、可选的ISA 孔、或者可选的IGD 窃用VGA 存储区。
从官方的说明可以看出不管使用多少内存,总有部分地址是要被占据的。
而当使用了4g的内存时,问题就更加的明显了,除了落在“可选的TSEG 、可选的ISA 孔、或者可选的IGD 窃用VGA 存储区”的那部分地址不可用,真正的地址大户“PCI存储空间”(也称为MMIO)也与主内存的地址发生了重叠。所以这部分的内存地址好像就被占据了,从而无法读取。
我们再来看看PCI存储空间占据的地址到底有多少
粗略的一算,在4GB的空间里大约有900MB的地址都被占据了,所以系统可用的实际空间只有3.1GB左右,这和我现在在系统中看到的3070MB十分的接近了。
综上所述,因为决定32位系统下面4G内存地址空间并不是仅仅是系统内存独占的。4G内存地址空间是系统中所有存储器的编码范围,这里面既包括有内存编码,也包括了主板BIOS、显卡BIOS、显存以及其他PCI设备的存储器编码。这是因为Intel x86平台中使用了名为内存映射I/O(MMIO)的技术。
这么看来,32位的系统不能用满4gb的内存似乎是天经地义了。似乎要使用4g的内存就只能投靠64位的系统了。
但似乎又有两个很明显的反例
1、众所周知,64位的操作系统可以使用4GB甚至更大的内存,可是按照上述芯片组的说明,在4G地址的末端仍然有大约1g的空间被占据(不会因为换了64位系统而改变),如果上诉推理正确的这1GB的空间本因仍然无法使用。
2、更奇怪的是同样是32位的系统,但是windows serve却可以支持4GB及以上的内存(前提:硬件支持)。
这又是为何呢??
权威参考资料:
1、Mobile Intel® 965 Express Chipset Family Datasheet
2、Intel主板的内存映射官方pdf

I’d say so.