2009年4月9日 星期四

●有關32位元作業系統記憶體4G位址空間的局限

這篇文章網路有很多,但是對玩記憶體的我來說,卻不可不知。
有關32位元作業系統記憶體4G位址空間的局限:
4GB位址空間的局限:
首先我們還必須要先瞭解兩個概念
其一是“實體記憶體”。大家常說的實體記憶體就是指安裝在主板上的記憶體條,其實不然,在電腦的系統中,實體記憶體不僅包括裝在主板上的記憶體條(RAM),還應該包括主板BIOS晶片的ROM,顯卡上的顯存(RAM)和BIOS(ROM),以及各種PCI、PCI-E設備上的RAM和ROM。
其二是“位址空間”。位址空間就是對實體記憶體編碼(位址編碼)的範圍。
所謂編碼就是對每一個物理存儲單元(一個位元組)分配一個唯一的位址號 碼,這個過程又叫做“編址”或者“位址映射”。這個過程就好像在日常生活中我們給每家每戶分配一個位址門牌號。與編碼相對應的是“定址”過程——分配一個 位址號碼給一個存儲單元的目的是為了便於找到它,完成資料的讀寫,這就是“定址”,因此位址空間有時候又被稱作“定址空間”。系統不僅要給主板上的記憶體條 編址,還要給上述的其他實體記憶體編址;它們都被編在同一個位址空間內,編址後的實體記憶體就可以被系統資源使用或佔用。
從Pentium Pro處理器開始,CPU的 位址匯流排已經升級到36位元,定址能力達到64GB,按理說CPU支援4GB的記憶體是沒有問題的;因此,晶片組(北橋—MCH)位址匯流排的數量就成了決定物 理記憶體位址空間大小的決定性因素。在Intel 945系列和945以前的晶片組,nForce 550系列和550以前的晶片組都只有32條位址線,為系統提供4GB的位址空間,即最高可以安裝4GB的記憶體條。
雖然可以安裝4GB記憶體條,但這4GB的記憶體空間不能全部紛配給記憶體,因為從4GB空間的頂端位址(FFFF_FFFFh)開始向下要有400MB-1GB的位址空間要分配給主板上的其他實體記憶體。

我們可以看到4GB的位址空間可以分為兩大部分,0MB~實體記憶體頂端 的地址分配給主板上安裝的實體記憶體,4GB到實體記憶體頂端的位址分配給BIOS(ROM)和PCI/PCI-E設備的記憶體。由於這些記憶體基本上是用於 系統的輸入和輸出,所以Intel又把這段位址空間稱之為“MMIO”(Memory-Mapped I/O—I/O記憶體映射)。當系統安裝3GB以下的記憶體時,MMIO區域不會與實體記憶體條的位址空間相重疊,作業系統可以訪問幾乎全部的實體記憶體,而操 作系統屬性裏顯示的實體記憶體基本接近實際記憶體的容量。
而當系統安裝上4GB記憶體時,問題出現了。由於位於4GB下面的部分位址空間要優先分配給MMIO,記憶體條上對應的這段區間就得不到編址,所以作業系統就不能使用。
嚴格意義上來說,即使安裝2GB記憶體時作業系統也不可能使用到全部的內 存容量,諸如傳統DOS的UMA區就有部分被佔用的位址空間,但因為被佔用的容量相比之下實在太少,所以就被很多讀者忽略了。MMIO佔用的位址空間在 256MB~1GB之間,這麼大的“浪費”大家肯定不能“熟視無睹”。
因為受4GB晶片組位址空間的限制(32條位址線的限制),Intel 945系列及以前的晶片組、NVIDIA nForce 550及以前的晶片組都沒有辦法繞過這個限制。具體原因有三方面:其一是晶片組沒有剩餘空間分配來供作業系統來調配;其二是實體記憶體的編址必須是連續的, 不能被割斷;其三是系統開機時必需先從4GB的頂端位址(FFFF_FFFFh)讀取BIOS資料, 這是IA32架構和4GB位址空間的局限.
所以建議使用這些晶片組主板的用戶不要安裝4GB的記憶體,這樣會有部分記憶體容量不能被作業系統所使用。而解決4GB記憶體限制的唯一辦法就是擴展位址空間。

二、支援大於4GB記憶體的晶片組和“記憶體重映射”技術
面對原有晶片組4GB記憶體的局限,Intel和NVIDIA早就開始未雨綢繆,他們對傳統的32位元位址匯流排進行了 調整,將其升級到36位,並推出了一系列可以突破4GB記憶體限制的晶片組,這就是Intel的965系列以及975系列、NVIDIA的nForce 570/590以及680系列

注:AMD的64位元Socket AM2 CPU把記憶體控制器放到CPU中,提供40bit的物理位址匯流排,位址空間可達到1000GB。具體支援的位址空間和記憶體量取決於晶片組及主板的匯流排設計。
從上面的晶片組參數來看,位址匯流排從32位元提升到36位,位址空間達到 64GB,支持安裝8GB的實體記憶體。但由於IA32架構的規則是開機時必須從4GB的FFFF_FFFFh位址讀取BIOS資訊,儘管晶片組支援的位址 空間變大了,且最大支援的實體記憶體容量也達到了8GB(或以上),但從本質上來說仍然不能解決MMIO位址佔用4GB記憶體編址的問題。這要怎麼辦呢?
36位元位址匯流排最大可以支援64GB的位址空間,這就為移動MMIO地 址區提供了條件。現在解決這個問題的辦法就是“記憶體重映射”技術——就是在IA32架構的基礎上,把BIOS(ROM)和PCI/PCI-E設備佔用的 MMIO位址區段重新映射到記憶體條頂端位址以上 (例如4GB以上)的位址空間,從而把IA32架構規定的這一段作業系統不可使用的、位於4GB下面的MMIO位址空間回收給實體記憶體使用,保證實體記憶體 編址的連續性。

三、BIOS必須支援“記憶體重映射”
“記憶體重映射”技術必須通過BIOS完成。所以BIOS必須具有支援記憶體重映射的功能模組,以便根據用戶安裝的 記憶體容量來確定是否需要啟用記憶體重映射功能。同時,在BIOS的設置選單中也要有“Memory Re-Mapping”的設置選項,使用4GB或者4GB以上記憶體的用戶一定要將此項設置設為“Enable”。

四、解決4GB記憶體問題還需要作業系統支援
我們常使用的桌面作業系統是32位元的,支援4GB的位址空間。前面我們介紹了解決4GB問題的晶片組是支持 64GB位址空間的,在這樣的晶片組主板上安裝32位元的作業系統,就只能使用4GB的位址空間,因此安裝4GB記憶體不能使用僅支援4GB位址空間的32位元 的作業系統。應該使用支援大於4GB位址空間的32位元作業系統或64位元的作業系統。

五、小結.
1、由於iA32架構要求BIOS(ROM)晶片的位址, PCI、PCI-E記憶體位址、APCI中斷路由位址等必須佔用從4GB開始以下的256M-1GB空間。這段MMIO位址區不能分配給記憶體條。4GB的記憶體條有256MB-1GB的容量不能編址而浪費。
2、使用4GB或者以上的記憶體條,必須使用位址(編址)空間64GB的晶片組主板。
3、記憶體重映射就是把被MMIO佔用的位址移到記憶體條容量以上的位址空間。)
4、BIOS應具有支援“記憶體重映射”功能,設置項裏有 Memory Remap Feature 選項,並設置為Enable。
5、必須安裝定址空間大於4GB的作業系統。比如Windows 2000高級伺服器版,以及64位元作業系統。
6、所有位址空間為4GB的晶片組(Intel945和nForce550之前的),和32位元作業系統均不能利用“記憶體重映射”技術解決4GB記憶體問題。

跟這有關ㄉ討論還有這ㄍ連結
--> 閱讀更多...