1. 程式人生 > >計算機組成原理--64位CPU裝載32位作業系統,它的定址能力還是4GB嗎?

計算機組成原理--64位CPU裝載32位作業系統,它的定址能力還是4GB嗎?

藉由這個問題,今天我們就把 32 位 CPU、64 位 CPU、32 位作業系統、64 位作業系統之間的區別與聯絡徹底搞清楚。對於這個問題,博主也是一知半解了好長時間啊~

基本概念

32位的CPU與64位CPU

以下內容摘自維基百科:

64 位 CPU 是指 CPU 內部的通用暫存器的寬度為 64 位元,支援整數的 64 位元寬度的算術與邏輯運算。那麼 32 位 CPU 同理。

一個 CPU,聯絡外部的資料匯流排與地址匯流排,可能有不同的寬度;術語“64位”也常用於描述這些匯流排的大小。不過這一術語也可能指電腦指令集的指令長度,或其它的資料項。去掉進一步的條件,“64位”電腦架構一般具有 64 位寬的整數型暫存器,它可支援 64 位“區塊”的整數型資料。

64 位架構無疑可應用在需要處理大量資料的應用程式,如數字視訊、科學運算、和早期的大型資料庫。

那麼 32 位 CPU 與 64 位 CPU 到底有什麼區別

  1. 資料處理能力增強:64 位 CPU 通用暫存器的位寬增加一倍,這也就意味著 64 位 CPU 可以一次性處理 64bit 的整形資料;
  2. 記憶體定址能力增強:如果是 32 位 CPU 的話,它的地址匯流排最多不會超過 32,那麼它所能達到的定址範圍也就不會超過 2 的 32 次方位元組(儲存單元以位元組為單位),也就是 4GB,而如果是 64 位處理器的話,它所能達到的定址範圍理論上就會是 2 的 64 次方位元組(上億 GB)。

補充:一般處理器多少位是指通用暫存器的長度,當然資料線需要與之相同;地址線則不需要與之相等,好比 intel 64 位處理器則是 40 位地址匯流排,最大支援 1TB 的記憶體定址。

32位作業系統與64位作業系統

平時我們所說的 32 位作業系統也被稱為 X86 系統,x64 代表 64 位作業系統,關於它的簡略解釋:為什麼32位的計算機系統不叫x32而叫x86呢?

關於 32 位作業系統與 64 位作業系統的區別如下:

  1. 32 位作業系統既可以執行在 32 位的 CPU 上,也可以執行在 64 位的 CPU 上,只不過,執行在 64 位 CPU 上的話,就有點“大馬拉小車”的感覺了——無法發揮出 CPU 的全部能力。

  2. 64 位作業系統只能執行在 64 位的 CPU 上,因此如果一個作業系統是 64 位,那麼它的 CPU 架構也必定是 64 位。

  3. 64 位作業系統相比於 32 位作業系統的優勢正如上述 64 位 CPU 與 32 位 CPU 的優勢一樣。

匯流排結構與主機板構成

在解決本文標題所述的問題之前,我們再來了解一些關於匯流排結構與主機板構成的相關知識。

說起匯流排大家肯定不陌生,而且大家平時肯定跟它打過交道,我們在用U盤拷貝資料的時候先要把U盤通過USB介面與電腦相連才能拷貝。USB介面實際上就是一種匯流排,一般稱這種匯流排為USB匯流排(也叫做通用序列匯流排)。在很久之前是沒有USB匯流排的,那個時候每個外設各自採用自己的介面標準,舉個最簡單的例子:滑鼠生產廠商採用滑鼠特有的介面,鍵盤生產廠商用鍵盤特有的介面,這樣一來的話,PC機上就必須提供很多介面,這樣一來增加了硬體設計難度和成本,直到後來USB介面的出現,它統一了很多外設介面的標準,不僅使得使用者可以很方便地連線一些外設,更增強了PC的可擴充套件性。所以現在大家看到的滑鼠、鍵盤、U盤、印表機等等這些外設都可以直接通過USB介面直接插到電腦上的。

在計算機系統中匯流排是非常重要的一個概念,正是因為有了匯流排,所有的組成部件才能一起正常協同分工合作。在很久以前的PC機中,採用的是三匯流排結構,即:資料匯流排、地址匯流排、控制匯流排。它們分別用來傳輸不同型別的資料,資料匯流排用來傳輸資料,地址匯流排用來傳輸地址,控制匯流排用來傳輸一些控制訊號。

隨著時代的發展,這種簡單的匯流排結構逐漸被淘汰。下面這幅圖是現代計算機採用的結構:

此處輸入圖片的描述

事實上這也是現代主機板所採用的結構,當然可能部分地方有略微不同(大體結構是差不多的),仔細觀察過主機板構成的朋友可能對上面一幅圖很熟悉。在主機板上主要有兩大主要部分:北橋(North Bridge也稱Host Bridge)和南橋(South Bridge)。北橋主要負責CPU和記憶體、顯示卡這些部件的資料傳送,而南橋主要負責I/O裝置、外部儲存裝置以及BIOS之間的通訊。現在有些主機板已經沒有北橋了,因為晶片廠商已經把北橋所負責的功能直接整合到CPU中了(不過暫且我們以上副圖的模型來討論)。

在上副圖中,我沒有畫出資料匯流排和地址匯流排等,因為在某些匯流排標準中它們被整合到一起了,比如在PCI匯流排中,地址匯流排和資料匯流排總是分時複用的(也就是說假如PCI匯流排有32位資料匯流排,這32位匯流排在某個時刻可以充當資料匯流排的作用,在下一時刻可以充當地址匯流排的作用)。有的匯流排同時提供了資料匯流排和地址匯流排。

下面來說一下幾個主要匯流排和南北橋的作用:

  1. FSB匯流排:即前端匯流排(Front Side Bus),CPU和北橋之間的橋樑,CPU和北橋傳遞的所有資料必須經過FSB匯流排,可以這麼說,FSB匯流排的頻率直接影響到CPU訪問記憶體的速度。

  2. 北橋:北橋是CPU和記憶體、顯示卡等部件進行資料交換的唯一橋樑,也就是說CPU想和其他任何部分通訊必須經過北橋。北橋晶片中通常整合的還有記憶體控制器等,用來控制與記憶體的通訊。現在的主機板上已經看不到北橋了,它的功能已經被整合到CPU當中了。

  3. PCI匯流排:PCI匯流排是一種高效能區域性匯流排,其不受CPU限制,構成了CPU和外設之間的高速通道。比如現在的顯示卡一般都是用的PCI插槽,PCI匯流排傳輸速度快,能夠很好地讓顯示卡和CPU進行資料交換。

  4. 南橋:主要負責I/O裝置之間的通訊,CPU要想訪問外設必須經過南橋晶片。

在瞭解了這些基礎東西之後,下面來講解一下為何 32 位系統最大隻支援 4GB 記憶體。(是的,就算是 64 位的 CPU,裝載 32 位的作業系統,它的定址能力還是 4GB。)

對於標題的解釋

在使用計算機時,其最大支援的記憶體是由作業系統硬體兩方面決定的。

先說一下硬體方面的因素,在上面已經提到了地址匯流排,在計算機中 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位地址匯流排。

總結

對於以上所述,我進行一下簡單的總結:

一個計算機,它的記憶體訪問能力是由硬體和軟體共同決定的。硬體層面就指 CPU 的定址能力,也就是地址匯流排的個數。軟體層面,指的就是作業系統。實際上我們(程序)在進行記憶體訪問的時候,訪問的都是邏輯地址,而邏輯地址是由作業系統提供的。對於 32 位的作業系統,其邏輯地址編碼採用的地址位數是 32 位,那麼作業系統所提供的邏輯地址定址範圍就是 4GB。從這個方面來說,縱使你的 CPU 實際定址能力為 2 的 64 次方,由於作業系統只提供 4GB 的邏輯地址,那 CPU 透過作業系統所能訪問到的記憶體大小也就只有4GB了。

對與上述總結,我還有一個簡單的補充:

在和我的大神小夥伴討論的時候,他對於“為什麼 64 位 CPU 裝載 32 位作業系統,它的定址能力還是 4GB”這個問題的解答,只說了一句話:“32 位作業系統沒有對應 64 位的定址指令”。在細細品味之後,覺得頗有道理,我對於這句話的淺顯理解是:32 位作業系統沒有對應 64 位的定址指令,所以它不能提供 4GB 以上的邏輯地址,所以 64 位 CPU 透過 32 位作業系統,它的定址能力依舊是 4GB。

參考閱讀

維基百科:64位