• 淺談限制內存容量的屏障

    淺談限制內存容量的屏障
    文/Sobereva @北京科音   2009-Feb-2


    PS:有很多人有誤區,甚至包括一些計算機老師,比如認為32bit平臺因為2^32=4G所以認為不能使用超過4G內存,然而接受這樣的觀點后很多人會對為何使用4G內存在系統中只顯示3.25G有所疑問。網上也有很多相關文章專門談這個問題,但是其中有不少錯誤的認識,而且條理不清。故撰此文,以盡可能簡單的解釋來清楚地解釋這些問題。



    程序使用內存到底能用到多大,跟CPU、內存控制器、操作系統、程序、主板都有關,其中支持內存最小的一個就是瓶頸。

    CPU:能用到多大和CPU的位數沒有直接關系。因為CPU的位數,即通用寄存器的寬度并不等于地址總線的寬度。比如8086,16bit通用寄存器但地址總線是20bit(=1MB);P6架構雖然是32bit的,但其外部地址總線為36bit,尋址范圍已經到了2^36=64G了;x86-64的AMD CPU,內存尋址范圍是48bit(256T),沒有達到64bit,雖然理論上能到但實際上沒能實現2^64的尋址范圍。所以一般來說CPU不是瓶頸,注意若在32bit系統下實現36bit尋址需要通過PAE(Physical Address Extension)。

    主板:取決于主板有多少槽和芯片組最大支持容量。

    內存控制器:如果是K8及之后的,因為集成內存控制器,所以是CPU負責,這一般沒有問題,可達48bit。而對于intel CPU由芯片組負責,老的芯片組比如945就只能支持32bit尋址即4G,這就需要新的芯片組,如965系列尋址空間達到36bit,但實際最大支持8G。服務器芯片組一般實際支持得比較大,尋址空間一般為36/38bit。

    操作系統:windows操作系統如果是64bit的,至少支持8G,無需PAE,目前支持容量最高的數據中心版本可支持2T,用的是44bit尋址(16T)但沒有全開放。如果是32bit版本,XP和Vista任何版本皆最多4G,因為都不支持PAE。若用server版本,都支持PAE,可以超過4G,最強Datacenter版可達128G。

    程序:對于32bit windows系統,無論真正可用內存有多大,用戶模式的程序最大只能分配2G虛擬內存,其它部分由系統核心調用。用了4GT即4GB內存調優技術,可分配最大3G,僅server版支持,啟動時加/3GB即可。如果程序設計時使用AWE API集而且系統支持PAE,尋址范圍可以擴至64GB。另外驅動也必須合適,比如一些老驅動程序在大內存下不能正常工作。在64bit windows下,用戶模式的程序直接就可以訪問8T空間。

    總之,若在32bit平臺下使程序能夠調用超過4G內存,需要windows server版系統+合適的芯片組+槽多的主板+合適的程序。如果只有普通的32bit程序,大內存至少可以減少不同程序虛擬內存間的搶占,讓每個程序都獲得盡可能大的虛擬內存,盡管上限仍是2G。


    另一個問題:4G內存時,發現可見內存被吞掉750MB或者更多,是因為一些設備固定占據挨著并且低于4GB位置的一段空間,稱為MMIO(PCI內存占其中很大部分),這是內存控制器將這些設備映射到這個地址實現的,好處是系統可以方便快速地通過內存地址來訪問這些設備,但原來在這個部位的物理內存就訪問不到了,很浪費,也叫memory hole,尤其是GPU越多占得越多。解決方法就是用內存重映射(Memory Remapping),內存控制器把這個部位的內存地址映射到4G位置后面的一段空間,然后將這樣轉化過的地址告訴CPU,這樣CPU用大于FFFFFFFF的地址就可以訪問到原本被MMIO覆蓋的內存空間,就不會浪費了。

    使用內存重映射,若是32bit操作系統的話必須支持PAE,否則高于4G的映射空間還是訪問不了,不同操作系統對重映射支持也不同,server版比較好。芯片組必須支持重映射并且開啟(對于A64及以后的是在CPU內的內存控制器實現),至少680i、955X、965系列及以上或者是服務器芯片組,如果主板BIOS沒有相應選項而且默認是關閉的就不行。

    對于XP,系統屬性-常規下面顯示的就是此時相對于操作系統全部能使用或者說可見的內存空間,不包括MMIO部分。注意對于Vista SP1,插了多少內存就顯示多大,即使實際上根本不能全部利用。
    久久精品国产99久久香蕉