在使用電腦時,其最大支持的記憶體是由 操作系統 和 硬體 兩方面決定的。 先說一下硬體方面的因素,在電腦中 CPU的地址匯流排數目 決定了CPU 的 定址 範圍,這種由地址匯流排對應的地址稱作為物理地址。假如CPU有32根地址匯流排(一般情況下32位的CPU的地址匯流排是32位,也有部分32位的CPU地址 ...
在使用電腦時,其最大支持的記憶體是由 操作系統 和 硬體 兩方面決定的。
先說一下硬體方面的因素,在電腦中 CPU的地址匯流排數目 決定了CPU 的 定址 範圍,這種由地址匯流排對應的地址稱作為物理地址。假如CPU有32根地址匯流排(一般情況下32位的CPU的地址匯流排是32位,也有部分32位的CPU地址匯流排是36位的,比如用做伺服器的CPU),那麼提供的可定址物理地址範圍 為 232=4GB(在這裡要註意一點,我們平常所說的32位CPU和64位CPU指的是CPU一次能夠處理的數據寬度,即位寬,不是地址匯流排的數目)。自從64位CPU出現之後,一次便能夠處理64位的數據了,其地址匯流排一般採用的是36位或者40位(即CPU能夠定址的物理地址空間為64GB或者1T)。在CPU訪問其它任何部件的時候,都需要一個地址,就像一個快遞員送快遞,沒有地址他是不知道往哪裡送達的,舉個例子,CPU想從顯存單元讀取數據,必須知道要讀取的顯存單元的實際物理地址才能實現讀取操作,同樣地,從記憶體條上的記憶體單元讀取數據也需要知道記憶體單元的物理地址。換句話說,CPU訪問任何存儲單元必須知道其物理地址。
用戶在使用電腦時能夠訪問的最大記憶體不單是由CPU地址匯流排的位數決定的,還需要考慮操作系統的實現。實際上用戶在使用電腦時,進程所訪問到的地址是邏輯地址,並不是真實的物理地址,這個邏輯地址是操作系統提供的,CPU在執行指令時需要先將指令的邏輯地址變換為物理地址才能對相應的存儲單元進行數據的讀取或者寫入(註意邏輯地址和物理地址是一一對應的)。
對於32位的windows操作系統,其邏輯地址編碼採用的地址位數是32位的,那麼操作系統所提供的邏輯地址定址範圍是4GB,而在intel x86架構下,採用的是記憶體映射技術(Memory-Mapped I/O, MMIO),也就說將4GB邏輯地址中一部分要劃分出來與BIOS ROM、CPU寄存器、I/O設備這些部件的物理地址進行映射,那麼邏輯地址中能夠與記憶體條的物理地址進行映射的空間肯定沒有4GB了,看下麵這幅圖就明白了:
所以當我們裝了32位的windows操作系統,即使我們買了4GB的記憶體條,實際上能被操作系統訪問到的肯定小於4GB,一般情況是3.2GB左右。假如說地址匯流排位數沒有32位,比如說是20位,那麼CPU能夠定址到1MB的物理地址空間,此時操作系統即使能支持4GB的邏輯地址空間並且假設記憶體條是4GB的,能夠被用戶訪問到的空間不會大於1MB(當然此處不考慮虛擬記憶體技術),所以用戶能夠訪問到的最大記憶體空間是由硬體和操作系統兩者共同決定的,兩者都有制約關係。
對於64位的操作系統,其邏輯地址編碼採用的地址位數是40位,能夠最大支持1T的邏輯地址空間。考慮一種情況,假如CPU是64位的,地址匯流排位數是40位,操作系統也是64位的,邏輯地址編碼採用的地址位數也是40位,記憶體條大小是64GB,那麼是不是記憶體條的64GB全部都能被利用了呢?答案是不一定,因為這裡面還要考慮一個因素就是記憶體控制器,記憶體控制器位於北橋之內(現在基本都是放在CPU裡面了),記憶體控制器的實際連接記憶體的地址線決定了可以支持的記憶體容量,也就是說記憶體控制器與記憶體槽實際連接的地址線如果沒有40位的話,是無法完全利用64GB的記憶體條的存儲空間的。當然對於記憶體控制器這個問題幾乎可以不用考慮,因為現在大多數的記憶體控制器至少都採用的是40位地址匯流排。