內存映射I/O即MMIO,它是PCI規范的一部分,I/O設備被放置在內存空間而不是I/O空間。從處理器的角度看,內存映射I/O后系統設備訪問起來和內存一樣。這樣訪問AGP/PCI-E顯卡上的幀緩存,BIOS,PCI設備就可以使用讀寫內存一樣的匯編指令完成,簡化了程序設計的難度和接口的復雜性。
一、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位操作系統(表3)。
6、所有地址空間為4GB的芯片組(Intel945和nForce550之前的),和32位操作系統均不能利用“內存重映射”技術解決4GB內存問題。