扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共6页)
寻找失落的内存
让我们再来温习一下这张图,并再次明确一件事情:我们至今为止仍然还是在讲地址,并未谈及任何与内存存储空间相关的东东。PCI Memory Address Range占去的仅仅是物理地址,并不会去占据内存空间。每个内存颗粒中的NAND gates本身并不会拥有地址,所有的地址都是由系统进行分配的。这一切的地址排布与操作系统是多少位并无太多关联,而操作系统方面对PCI Memory Address Range大小的影响主要来自于系统自身驱动以及设备驱动程序等方面的要求。因此我们可以发现在一些默认功能开启较少的系统中(如Win Sever),任务管理器显示的物理内存会大一些。因为此时的PCI Memory Address Range相对较小。从根本上来说,这是芯片组来自于兼容性方面的考量,必须让PCI Memory Address Range位于4GB以内。
由于兼容性的考量,即使使用了64bit操作系统和64bit处理器,PCI Memory Address Range仍然会被芯片组安置于4GB地址以内。所以当安装了大容量物理内存时,PCI Memory Address Range必然会在整个物理内存地址中形成一个Memory Hole。
小贴士:Memory Hole其实很好理解,就像上面的图中那样,Main Memory被分成了两段,而那段被占用的地址空间就像一个“洞”(Hole),所以称之为Hole。。。。。。上面图中PCI Memory Address Range就充当了这个Hole的角色,它并不占用内存存储空间,只是一个物理地址上的横亘,而系统会用其他手段将两段分开的内存地址连接起来。
既然PCI Memory Address Range必须占用这段地址空间,芯片组设计师们自然有其他的考量去解决物理内存地址的分配问题,毕竟会白白浪费内存的芯片组是不讨人喜欢的。既然4GB以下地址如此紧张,我们为何不将物理内存分配到更高的地址空间去呢?于是,TOM、 TOUUD寄存器以及RECLAIMBASE、RECLAIMLIMIT寄存器诞生了。
TOM即“Top of Memory”,其描述的是系统上所安装的物理内存的总量。TOM寄存器值并不见得代表最高内存地址,因为MMIO的地址分配要优先于TOM寄存器,所以内存地址中基本都会存在一些hole(PCI Memory Address Range),这显然会使得TOM寄存器的地址会更高一些。TOM寄存器之下将会有1-64MB内存被Manageability Engine占用(图中的EP-UMA),这是确确实实被占有的内存。
TOUUD即“Top of Upper Usable DRAM”,其描述的是可设定地址的物理内存总量。TOLUD寄存器会始终在4GB内存地址以下工作,但我们知道现在的主流芯片组都能安装高达16GB的内存,TOUUD就可以解决这个问题。TOUUD会在4GB以上地址定义物理内存范围,这个范围会从4GB到可用物理内存顶端(TOM)。经过鉴别的物理内存就可以直接被使用了。
OK,现在我们要回收那块被“占用”的内存地址了。MMIO占据了TOLUD到4GB的地址空间,所以芯片组需要去回收这段被叠加的物理内存。芯片组会开启一个remap window(Main Memory Reclaim Address Range),其底端地址由RECLAIMBASE寄存器定义,顶端地址由RECLAIMLIMIT寄存器定义。然后会将所有落在TOLUD至4GB之间的物理内存回收(映射MMIO),之后安置于4GB至EP Stolen Base的地址空间中,这样我们的内存完完整整的就回来了。
注:由于笔者目前不确定芯片组的Memory Reclaim功能是否可以通过主板BIOS开关,所以某些品牌主板BIOS中的Memory (Hole) Remapping选项可能控制了Memory Reclaim功能的开关。
现在让我们由TOM向下,统计一下物理内存的最终占用情况:Manageability Engine占用1-64MB内存;板载显卡可占用0-256MB内存;板载显卡的GTT(graphics translation table)占用0-2MB内存;TSEG占用0-8MB内存;Legacy Address Range占用1MB内存。除此之外,剩下的内存空间将完全归用户所有。如果是采用非整合芯片组的话,4GB内存用户通常能够拥有4094MB内存空间(见小贴士),我们的内存谁也没动。当然,我们的任务管理器中并不能显示出它们,因为我们的物理地址只有4GB,MMIO会占据一部分地址。不过在实际使用中我们其实能够完整利用那些看不到的内存,那些位于4GB地址以上的内存。想知道究竟?请翻开下一页。
小贴士:相信不少非4GB用户会发现自己的内存同样被偷吃了几MB,比如2GB内存用户通常在设备管理器中只能看到2047MB或者2046MB内存等等。这是因为还有两块地址范围被占据,这两个区域分别是Legacy Address Range和TSEG,他们会使用一部分内存(比如加载系统BIOS)。由于这两个区域都处于TOLUD以下的地址范围内,包含了BIOS的Legacy Address Range更是固定占据00000000h至000FFFFFh的1MB最底层地址空间,所以无论系统安装了多少内存,都会受到影响。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者