TOM即“Top of Memory”,其描述的是系统上所安装的物理内存的总量。TOM寄存器值并不见得代表最高内存地址,因为MMIO的地址分配要优先于TOM寄存器,内存地址中基本都会存在一些hole(PCI Memory Address Range),所以TOM寄存器的地址最终还需要加上这些hole的地址,从而会更高一些。TOM寄存器之下将会有1-64MB内存被Manageability Engine占用(图中的EP-UMA),这是确确实实被占有的内存。
TOUUD即“Top of Upper Usable DRAM”,其描述的是可设定地址的物理内存总量。TOLUD寄存器会始终在4GB内存地址以下工作,但我们知道现在的主流芯片组都能安装高达16GB的内存,TOUUD就可以解决这个问题。TOUUD会在4GB以上地址定义物理内存范围,这个范围会从4GB到可用物理内存顶端(TOM),经过鉴定的物理内存可以直接被使用。这并不受操作系统的影响,而是芯片组的工作,也就是至少BIOS肯定是能够接受16GB内存的。
OK,现在我们要回收那块被“占用”的内存地址了。MMIO占据了TOLUD到4GB的地址空间,所以芯片组需要去回收这段地址重叠的物理内存。物理内存并不能直接搬家,芯片组会开启一个remap window(Main Memory Reclaim Address Range),其底端地址由RECLAIMBASE寄存器定义,顶端地址由RECLAIMLIMIT寄存器定义,总大小会与被MMIO占用的内存地址范围完全相等。然后会将原本将落在TOLUD至4GB地址之间的物理内存回收,重映射到4GB以上EP Stolen Base之下的地址空间中,属于remap window中的地址都会去对应由TOLUD至4GB的这段物理内存。
注:由于笔者目前不确定芯片组的Memory Reclaim功能是否可以通过主板BIOS开关,所以某些品牌主板BIOS中的Memory (Hole) Remapping选项可能控制了Memory Reclaim功能的开关。
OK,现在我们要回收那块被“占用”的内存地址了。MMIO占据了TOLUD到4GB的地址空间,所以芯片组需要去回收这段地址重叠的物理内存。物理内存并不能直接搬家,芯片组会开启一个remap window(Main Memory Reclaim Address Range),其底端地址由RECLAIMBASE寄存器定义,顶端地址由RECLAIMLIMIT寄存器定义,总大小会与被MMIO占用的内存地址范围完全相等。然后会将原本将落在TOLUD至4GB地址之间的物理内存回收,重映射到4GB以上EP Stolen Base之下的地址空间中,属于remap window中的地址都会去对应由TOLUD至4GB的这段物理内存。
在主板BIOS中的Memory Remapping(也有的叫Memory Hole Remapping)实际上控制的就是芯片组(内存控制器)的Memory Reclaim,只有当开启这个选项的时候芯片组才会回收与MMIO交叠的内存。某些主板,尤其是采用award bios的主板上可能没有这个选项(例如技嘉主板),但事实上该选项其实都默认开启了,因为此功能任何时候都完全没有关闭的需要。
尽管芯片组的Memory Reclaim功能为我们回收了内存,但我们的任务管理器现在还不能显示它们,因为我们的物理地址只有4GB,MMIO会占据一部分地址。被置于4GB以上地址区间的内存显然早已超出了32bit寻址范围。不过我们有办法去利用那些位于4GB地址以上的内存。想知道究竟?请继续向后看。