計算機組成原理--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 的優勢一樣。


總線結構與主板構成

注:以下兩部分內容摘抄自:32位系統最大隻能支持4GB內存之由來~

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

說起總線大家肯定不陌生,而且大家平時肯定跟它打過交道,我們在用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位

32位系統最大隻能支持4GB內存之由來

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章