您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 关于4g内存在于32bit系统识别与利用
关于4G内存在于32BIT系统识别与利用关于4G内存在于32BIT系统识别与利用的讨论,转载两篇较为有价值的文章对于4GB内存的完全支持始终是我心中的纠结。64bit系统的庞大与兼容性以及运行32位程序时较低的效率,http://nbbbs.zol.com.cn/37/223_360531.html,server系统对于nokiapcsuite糟糕的支持是我都最终不得不割爱。今晚再次对于此问题的研究发现了以下的两篇强文,让我对于X86架构的内存机制和微软内存拓展支持的伎俩有了较为深刻的理解。恐有咎于斑竹之职,不敢藏私,转贴于此。欢迎讨论。下文从硬件设计和软件开发两个角度分别讲述了4GB内存在计算机架构中的分配,以及内存为何在系统中未被完全识别的原因,并且探讨了PAE方式回收内存的原理,在设备管理器中使用内存地址的方式进行验证,最后还给出了32bitvista下通过替换server2008文件识别4GB内存的方式。2楼的文章专门针对PAE方式利用内存的效率进行探讨原文作者:FreeImagine我的内存谁也没动:4GB内存终极解迷(有图有真相,最终版。下载位于6楼)原文地址:http://bbs.ocer.net/thread-260115-1-1.html我的内存谁也没动:4GB内存终极解迷(有图有真相,最终版。下载位于6楼)500元、300元、150元......随着DDR2价格的逐渐崩盘,目前连2GBDDR2-800内存的价格也已经跌至百元,越来越多的朋友为爱机装上了4GB内存。随着4GB电脑的逐渐增加,一个长期存在的问题又再次被人们所关注:为何我只能看到3.25GB物理内存?无论是WinXP-32bit还是Vista-32bit,所有的用户都可以发现自己的任务管理器中最多只显示3.25GB物理内存,更甚者还会有2.8GB甚至更低的数值出现。我们花钱购买的内存就这样白白不见了么?人们当然不会允许这样的事情发生,于是各种论坛上展开了关于4GB内存的大量讨论。重装系统、打开PAE、使用Ramdisk、开启MemoryRemapping等等各种手段层出不穷,所有人都想找回那失去的内存。再逐一尝试之后,人们发现始终能够在32bit系统上找到那0.75GB内存的下落。人们所寄希望的Vista系统也仅仅是能够在系统属性上看到4.00GB的字样,设备管理器的物理内存依然安逸的保持在3.25GB。期间,各大电脑网站和杂志也刊登了一些关于这方面的文章,介绍了大量内容,最终人们将一切归罪于32bit操作系统。这样的审判似乎很正确,毕竟我们可以真实的看到64bit系统下那>3.25GB的物理内存显示,32bit系统显然贪污掉了0.75GB内存。然而事实上,操作系统却在这里成为了不折不扣的替罪羊。因为事实上即使是在64bit系统中,内存同样会被“侵蚀”;而32bit系统也同样可以使用超过4GB的内存。为了让广大网友都能够了解事实究竟,今天笔者就为操作系统客串一次辩护律师,为其平反这个内存贪墨案,找寻那失落的内存。真相永远只有一个!注:文本将以Intel当代芯片组的内存分配机制为例讲述,其他品牌芯片组在细节上或许有与本文所描述不同之处,但结论上不会有太大出入。观念上的错误:32bit寻址32bit操作系统,32bit处理器,有着32bit寻址能力,可以访问2^32=4G物理地址,于是拥有识别4GB内存的能力,这似乎是完全顺理成章的事情。然而其中有一个关键,什么是物理地址?物理地址就是物理内存的地址?非也。物理地址是指处理器和系统内存之间所用到地址,我们可以简单理解成是CPU“极方便访问的地址”。这个地址并非物理内存独享,尽管通常它基本都会与物理地址重叠,但也可以根据需要被其他设备占用,使得物理内存实际上只能够占用这4GB地址中的一部分。认真看看上面这个P45芯片组的系统地址区域图。图中的方块代表的是不同区域的“地址”,这些地址囊括了一台电脑中所有能和操作系统以及芯片组关联的设备地址,而不仅仅是“物理内存地址”。同样的,那个4G的红线代表的是第4G个Byte的地址,并不是4GB物理内存的分界线,尽管内存控制器很多时候确实会让它们重叠在一起。P45芯片组是一款支持36bit寻址的产品,即可以支持64GB地址,但为了去迎合操作系统以及各种软件,因此需要保证系统运转所必须的所有设备地址都可以在4GB范围内找到,否则会给硬件32bit驱动程序的制作带来很多麻烦,对驱动程序兼容性造成极大程度的影响。很显然,让一个系统正常运行并不仅仅包括内存,还要包括各种I/O设备等。在4GB的寻址范围内,物理内存实际上只占据了一块,就是那个被称为MainMemoryAddressRange的区域(图中绿色框)。安装4GB以下内存的话,Windows的任务管理器会确认1MB至TOLUD寄存器数值作为系统可用的物理内存(无板载显卡占用)。TOLUD全称是TopofLowUsableDram,这个16bit寄存器由BIOS赋予一个适当的数值,其含义是4GB地址内的可用物理内存地址顶端。如果安装2GB内存,那么TOLUD的数值就是7FFFFFFFh,也就是16进制的2GB(加上0地址),任务管理器一般会显示2046MB(见小贴士)。既然内存并不能占据整个4GB地址,那么其他地址主要被谁占据了呢?小贴士:相信不少非4GB用户会发现自己的内存同样被偷吃了几MB,比如2GB内存用户通常在设备管理器中只能看到2047MB或者2046MB内存等等。这是因为还有两块地址范围被占据,这两个区域分别是LegacyAddressRange和TSEG,他们会使用一部分内存(比如加载系统BIOS)。由于这两个区域都处于TOLUD以下的地址范围内,包含了BIOS等底层部件的LegacyAddressRange更是固定占据00000000h至000FFFFFh的1MB最底层地址空间,所以无论系统安装了多少内存,Windows任务管理器显示的数值都会受到影响。上面的图中展示了00000000h至FFFFFFFFh共4GB地址的详细分配(上图中方块大小于占用地址多少无关),4GB物理内存本身会自然排布其上,但会有一些优先级更高的分派来争夺物理地址空间,使得真正留下的物理内存只在MainMemory区域,而其他部分通常会占据几MB最多十几MB的地址空间,但其中有一个地址大户:PCIMemoryAddressRange(PCIMemoryRange)。内存地址“侵蚀者”:PCIMemoryAddressRangePCIMemoryAddressRange这一部分包含了各种I/O设备,系统总线等部分所需的地址,上面的图中我们可以看到ICH10的磁盘控制器、PCIE(显卡)等该系统现有设备所占据的地址范围。这些I/O设备地址被通过一种叫做MMIO的技术使得CPU可以高速便捷的访问它们。根据设备状况的不同,PCIMemoryAddressRange的大小也会发生变化,这都一切取决于硬件本身及硬件驱动的需求,例如芯片组、显卡等等。小贴士:MMIO全称是Memory-mappedI/O,是一种在CPU和外围设备之间执行输入输出功能的途径。MMIO简单说就是将各种外围设备的控制寄存器映射到物理内存地址上,CPU可以像访问内存一样方便的访问I/O设备,而无需重复再三的去调用IO控制函数。CPU会将自己的寻址空间预留一块用于I/O设备,这也意味着内存地址被占用了一块,但并不会真的占用物理内存存储空间。没有板载显卡的话,PCIMemoryAddressRange基本可以与MMIO区域划等号。MMIO会占据TOLUD至4GB的地址空间,不过这只是将物理地址分派给各种外围设备,而不会真的占用物理内存。上图中的系统只有2GB内存,那么TOLUD的值就是2GB(7FFFFFFFh),PCIMemoryAddressRange也就自动占据了80000000h至FFFFFFFFh这剩下2GB的地址空间。而且很明显,它不占用内存,因为后面2GB根本没有内存。MMIO区域所占据的地址实际上对应的物理设备是外围设备的寄存器之类,相对于这些设备的寄存器来说,MMIO是一块逻辑地址区间。上图展示了P45芯片组(Intel芯片组)的典型MMIO分配,里面包含了大量系统所必须的内容:HighBIOS、DMI总线、FSB中断、APIC、PCIE等多方面的设备地址。这些都是一款Intel芯片组正常运行所必须的东东,尤其是DMI总线(连接Intel芯片组南北桥)管理着主板上的大多数IO设备,它们自然必须在任何时候都享受着MMIO所分配的地址,而这个地址范围通常就是0.75GB。DFI的X58主板给出了一个很有意思的选项,名叫MemoryLowGap。这个选项可以让用户自定义选择TOLUD的地址,或者说自定义选择MMIO区域的大小。该选项的范围为1024M至3072M,即MMIO区域的大小为1024MB-3072MB。可能是因为需要映射到物理地址的寄存器数量很大,一些顶级显卡的驱动程序会要求比较大的MMIO区域支持,例如NVIDIA的GTX280、GTX295之类。4GB内存用户甚至可以发现,当更换显卡后,设备管理器显示的物理内存大小竟然也会发生变化,甚至会降低到3GB以下的数值,这就是因为某些高阶显卡申请了更大的MMIO,使得内存在4GB以下的地址空间被进一步压缩,我们可以在Windows的设备管理器内看到地址分布的变化。当我们把DFIX58主板BIOS中的MemoryLowGap调至一个巨额的数值之后,上图中的景象就出现了。由于MMIO的进一步扩张,我们发现连2GB的内存竟然也被侵蚀了好大一块,50000000h(1280MB)之后的地址就已经开始被MMIO占据。4GB地址就像是一辆拥挤的公共汽车,空间总共就那么大,PCIMemoryAddressRange挤上去了、满载了,内存自然就上不去了。难道内存就这么白费了?真是万恶的PCIMemoryAddressRange,万恶的MMIO,万恶的美帝国主义。。。。。。先不用着急,继续向下看,我们会把内存找回来的。寻找失落的内存让我们再来温习一下这张图,并再次明确一件事情:PCIMemoryAddressRange中的MMIO占去的仅仅是物理地址,并不会去占据内存空间。每个内存颗粒中每个可以存储1bit的晶体管本身并不会拥有地址,所有的地址都是由系统进行分配的。这一切的地址排布与操作系统是多少位并无太多关联,而操作系统方面对MMIO大小的影响主要来自于系统自身驱动以及设备驱动程序等方面的要求。因此我们可以发现在一些默认功能开启较少,硬件驱动地址开销较少的系统中(如WinSever),任务管理器显示的物理内存会大一些(例如3.6GB)。因为此时的MMIO相对较小。从根本上来说,这是芯片组来自于兼容性方面的考量,必须让MMIO位于4GB以内。由于兼容性的考量,即使使用了64bit操作系统和64bit处理器,MMIO仍然会被芯片组安置于4GB地址以内。MMIO必须占用这段地址空间,且MMIO有着比内存更高的优先级,物理内存又会老老实实的自然排布,这使得当安装了接近4GB或更多物理内存时,PCIMemoryAddressRange必然会与物理内存交叠,在整个物理内存地址中形成一个MemoryHole。小贴士:MemoryHole其实很好理解,就像上面的图中那样,MainMemory被分成了两段,而那段被占用的地址空间就像一个“洞”(Hole),所以称之为Hole。。。。。。上面图中PCIMemoryAddressRange就充当了这个Hole的角色,它并不占用内存存储空间,只是一个物理地址上的横亘,使得Hole的地址与内存地址发生了重叠。芯片组设计师们自然有其他的考量去解决物理内存地址的分配问题,毕竟会白白浪费内存的芯片组是不讨人喜欢的。既然4GB以下地址如此紧张,我们为何不将物理内存分配到更高的地址空间去呢?于是,TOM、TOUUD寄存器以及RECLAIMBASE、RECLAIMLIMIT寄存器诞生了。TOM
本文标题:关于4g内存在于32bit系统识别与利用
链接地址:https://www.777doc.com/doc-434 .html