让我们再来温习一下这张图,并再次明确一件事情:PCI Memory Address Range中的MMIO占去的仅仅是物理地址,并不会去占据内存空间。每个内存颗粒中每个可以存储1bit的晶体管本身并不会拥有地址,所有的地址都是由系统进行分配的。这一切的地址排布与操作系统是多少位并无太多关联,而操作系统方面对MMIO大小的影响主要来自于系统自身驱动以及设备驱动程序等方面的要求。因此我们可以发现在一些默认功能开启较少,硬件驱动地址开销较少的系统中(如Win Sever),任务管理器显示的物理内存会大一些(例如3.6GB)。因为此时的MMIO相对较小。从根本上来说,这是芯片组来自于兼容性方面的考量,必须让MMIO位于4GB以内。
由于兼容性的考量,即使使用了64bit操作系统和64bit处理器,MMIO仍然会被芯片组安置于4GB地址以内。MMIO必须占用这段地址空间,且MMIO有着比内存更高的优先级,物理内存又会老老实实的自然排布,这使得当安装了接近4GB或更多物理内存时,PCI Memory Address Range必然会与物理内存交叠,在整个物理内存地址中形成一个Memory Hole。
小贴士:Memory Hole其实很好理解,就像上面的图中那样,Main Memory被分成了两段,而那段被占用的地址空间就像一个“洞”(Hole),所以称之为Hole。。。。。。上面图中PCI Memory Address Range就充当了这个Hole的角色,它并不占用内存存储空间,只是一个物理地址上的横亘,使得Hole的地址与内存地址发生了重叠。
芯片组设计师们自然有其他的考量去解决物理内存地址的分配问题,毕竟会白白浪费内存的芯片组是不讨人喜欢的。既然4GB以下地址如此紧张,我们为何不将物理内存分配到更高的地址空间去呢?于是,TOM、 TOUUD寄存器以及RECLAIMBASE、RECLAIMLIMIT寄存器诞生了。