1. 程式人生 > >Question20171231 聊聊為什麽32bit只能支持4GB內存

Question20171231 聊聊為什麽32bit只能支持4GB內存

i/o 擴展 ron 內存映射 實現 就是 打印機 存儲設備 和數

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

  也許大家對這個問題都不陌生,實際裝過系統用過電腦的朋友可能都有這樣的經歷:自己電腦配的是4G的內存條,可是裝完系統之後發現電腦上顯示的只有3.2G左右可用內存,其它的內存跑到哪去了?網上也有很多朋友給出了一些解釋,大部分我覺得都沒有解釋得很清楚,今天我們就來看一下其中的具體緣由。

  在此之前先來了解一些計算機系統結構和PC硬件方面的一些知識。

1.1 總線結構和主板的構成

  說起總線大家肯定不陌生,而且大家平時肯定跟它打過交道,我們在用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位總線在某個時刻可以充當數據總線的作用,在下一時刻可以充當地址總線的作用)。有的總線同時提供了數據總線和地址總線。

  下面來說一下幾個主要總線和南北橋的作用:

  FSB總線:即前端總線(Front Side Bus),CPU和北橋之間的橋梁,CPU和北橋傳遞的所有數據必須經過FSB總線,可以這麽說FSB總線的頻率直接影響到CPU訪問內存的速度。

  北橋:北橋是CPU和內存、顯卡等部件進行數據交換的唯一橋梁,也就是說CPU想和其他任何部分通信必須經過北橋。北橋芯片中通常集成的還有內存控制器等,用來控制與內存的通信。現在的主板上已經看不到北橋了,它的功能已經被集成到CPU當中了。

  PCI總線:PCI總線是一種高性能局部總線,其不受CPU限制,構成了CPU和外設之間的高速通道。比如現在的顯卡一般都是用的PCI插槽,PCI總線傳輸速度快,能夠很好地讓顯卡和CPU進行數據交換。

  南橋:主要負責I/O設備之間的通信,CPU要想訪問外設必須經過南橋芯片。

  在了解了這些基礎東西之後,下面來講解一下為何32位系統最大只支持4GB內存。

1.2 來由

  在使用計算機時,其最大支持的內存是由操作系統和硬件兩方面決定的。

  先說一下硬件方面的因素,在上面已經提到了地址總線,在計算機中 CPU的地址總線數目決定了CPU的尋址範圍,這種由地址總線對應的地址稱作為物理地址。假如CPU32根地址總線(一般情況下32位的CPU的地址總線是32位,也有部分32位的CPU地址總線是36位的,比如用做服務器的CPU),那麽提供的可尋址物理地址範圍 為 2^32=4GB(在這裏要註意一點,我們平常所說的32CPU64CPU指的是CPU一次能夠處理的數據寬度,即位寬,不是地址總線的數目)。自從64CPU出現之後,一次便能夠處理64位的數據了,其地址總線一般采用的是36位或者40位(即CPU能夠尋址的物理地址空間為64GB或者1T)。在CPU訪問其它任何部件的時候,都需要一個地址,就像一個快遞員送快遞,沒有地址他是不知道往哪裏送達的,舉個例子,CPU想從顯存單元讀取數據,必須知道要讀取的顯存單元的實際物理地址才能實現讀取操作,同樣地,從內存條上的內存單元讀取數據也需要知道內存單元的物理地址。換句話說,CPU訪問任何存儲單元必須知道其物理地址。

  用戶在使用計算機時能夠訪問的最大內存不單是由CPU地址總線的位數決定的,還需要考慮操作系統的實現。實際上用戶在使用計算機時,進程所訪問到的地址是邏輯地址,並不是真實的物理地址,這個邏輯地址是操作系統提供的,CPU在執行指令時需要先將指令的邏輯地址變換為物理地址才能對相應的存儲單元進行數據的讀取或者寫入(註意邏輯地址和物理地址是一一對應的)。

  對於32位的windows操作系統,其邏輯地址編碼采用的地址位數是32位的,那麽操作系統所提供的邏輯地址尋址範圍是4GB(可以理解為如果你使用的是64位的CPU,但是OS卻是32位的,那麽對不起,你所支持的尋址範圍就是2^32,反之,如果是64位的OS,但是CPU是32位的,那麽尋址範圍還是2^32),而在intel x86架構下,采用的是內存映射技術(Memory-Mapped I/O, MMIO),也就說將4GB邏輯地址中一部分要劃分出來與BIOS ROMCPU寄存器、I/O設備這些部件的物理地址進行映射,那麽邏輯地址中能夠與內存條的物理地址進行映射的空間肯定沒有4GB了,看下面這幅圖就明白了:技術分享圖片

  所以當我們裝了32位的windows操作系統,即使我們買了4GB的內存條,實際上能被操作系統訪問到的肯定小於4GB,一般情況是3.2GB左右。假如說地址總線位數沒有32位,比如說是20位,那麽CPU能夠尋址到1MB的物理地址空間,此時操作系統即使能支持4GB的邏輯地址空間並且假設內存條是4GB的,能夠被用戶訪問到的空間不會大於1MB(當然此處不考慮虛擬內存技術),所以用戶能夠訪問到的最大內存空間是由硬件和操作系統兩者共同決定的,兩者都有制約關系。

  對於64位的操作系統,其邏輯地址編碼采用的地址位數是40位,能夠最大支持1T的邏輯地址空間。考慮一種情況,假如CPU64位的,地址總線位數是40位,操作系統也是64位的,邏輯地址編碼采用的地址位數也是40位,內存條大小是64GB,那麽是不是內存條的64GB全部都能被利用了呢?答案是不一定,因為這裏面還要考慮一個因素就是內存控制器,內存控制器位於北橋之內(現在基本都是放在CPU裏面了),內存控制器的實際連接內存的地址線決定了可以支持的內存容量,也就是說內存控制器與內存槽實際連接的地址線如果沒有40位的話,是無法完全利用64GB的內存條的存儲空間的。當然對於內存控制器這個問題幾乎可以不用考慮,因為現在大多數的內存控制器至少都采用的是40位地址總線。

本文摘自:https://www.cnblogs.com/dolphin0520/archive/2013/05/31/3110555.html

Question20171231 聊聊為什麽32bit只能支持4GB內存