1. 程式人生 > >深度理解“CPU內部定址方式”

深度理解“CPU內部定址方式”

記憶體是由很多個記憶體單元組成的,每個記憶體單元佔8個bit位(1位元組),也就是說記憶體中有多少個記憶體單元就意味著可以儲存多少個位元組,下面是一個只有兩個記憶體單元的記憶體概念圖:


該圖為博主自己畫的概念圖並非PCB板的設計圖!

注意上圖只是根據CPU通過前端匯流排與北橋和記憶體之間進行互動畫的概念圖,並非真正PCB設計圖,這裡只是講解CPU是如何與記憶體單元通訊的。

地址匯流排:

地址匯流排的位寬決定了CPU的定址範圍能力,地址匯流排越多CPU能定址的範圍也就越大,地址匯流排就相當於計數器,告訴我們定址範圍,地址匯流排是連線在記憶體的電路介面處的,地址匯流排的位寬以2的次方來算。

上圖是一個有兩個記憶體單元的RAM,所以一根地址匯流排就可以表示,2的1次方為2,所以CPU的定址最大範圍是2,對應的編號就是00,01,記憶體中的儲存順序是以0開始的,這也是為什麼陣列下標都是以0開始。

資料匯流排:

資料匯流排決定了記憶體中有多少bit位,當通過地址匯流排找對應的記憶體單元時可以通過與指

定記憶體單元連線的資料匯流排將資料傳送回來! 資料匯流排的位寬決定了一次可以傳送多少個

bit 位回來,一般均為8bit!

位寬不能代表有多少根資料匯流排.位寬決定了資料匯流排一次傳輸bit 位的能力,比如上圖有兩

個記憶體單元,CPU 通過地址匯流排找到了第二個記憶體單元的地址,此時的資料匯流排位寬為:

位; 那麼一次可以將第二個記憶體單元裡的bit 全部讀取出來,那麼倘若將第一個記憶體單元和

第二個記憶體單元全部讀取出來,那麼需要分兩次來讀,如果資料匯流排的位寬是16 位,那麼

可以一次讀完,資料匯流排的位寬是和地址匯流排直接掛鉤的,假如說資料匯流排的寬度是32 位,

每一次讀取資料都會動用32 根資料匯流排來讀取,也就是一次可以讀取4 位元組,同時地址匯流排一次定址範圍也必須能夠滿足4位元組,也就是說每一次定址都需要2根地址匯流排!

如果地址匯流排不滿足要求則會出現硬體中斷等,還有就是如果地址匯流排的一次定址範圍是4位元組倘若資料匯流排跟不上的話則會分開讀取!不過一般情況下資料匯流排的位寬是和地址匯流排的位寬成正比例的,這也是為什麼C語言和很多程式設計軟體會有記憶體對齊機制!

控制匯流排:

控制匯流排告訴CPU對這塊記憶體單元做怎樣的操作,讀還是寫,同樣控制匯流排也是接在電路介面處的,控制匯流排的位寬決定了CPU能對電子元件有多少種控制方法,一般情況下記憶體中只有一根控制匯流排,因為一般情況下記憶體就是讀與寫!

上面介紹的是地址匯流排,資料匯流排,控制匯流排都屬於前端匯流排,前端匯流排是將CPU與北橋晶片和記憶體連線起來的通訊線路,因為記憶體不屬於CPU內部結構單元,記憶體是在主機板上的所以CPU是不能直接操作記憶體的,需要通過前端匯流排與北橋互動,北橋晶片通過外部匯流排將記憶體中的資料送到一級快取中去,CPU在通過內部匯流排將其取到暫存器中!

當然除此之外還有其他匯流排:

外部匯流排:

用來連線各種外設控制晶片,如主機板上的I/O控制器,(如硬碟介面控制器、軟盤驅動控制器、 序列/並行介面控制器等),和鍵盤控制器,包括外部地址線(XAB),外部資料線(XMB)和外部控制線(XCB)。

內部匯流排:

將處理器的所有結構單元內部相連,它的寬度可以是8,16,32,或64位。如在CPU內部,暫存器之間和算術邏輯部件ALU與控制部件之間傳輸資料所用的匯流排稱為內匯流排即晶片內部的匯流排),內部匯流排也分地址匯流排(AB),資料匯流排(MB),控制匯流排(CB)

系統匯流排:

前端匯流排,外部匯流排都屬於系統匯流排,系統匯流排就是連線CPU,儲存器,和一切外部裝置的通路,內部匯流排不屬於系統匯流排,因為內部匯流排是CPU內部用於連線內部結構單元的通訊線路!

這裡要說一下北橋與記憶體連線的前端匯流排是記憶體上的,與CPU連線的前端匯流排是北橋與CPU連線的前端匯流排,北橋與CPU連線的前端匯流排的位寬決定CPU內部的一級快取的定址範圍,北橋先通過資料匯流排取出值,然後通過與CPU連線的前端匯流排將資料送往一級快取中,送入一級快取時會順序的寫入!倘若一級快取爆滿,則會等待CPU處理完畢在寫入!

CPU要往記憶體中寫資料的話也是如此,通過與北橋連線的前端匯流排將要定址的地址通過地址匯流排傳輸過去然後通過資料匯流排將資料傳送過去,在通過控制匯流排告訴北橋晶片往記憶體裡寫資料,最後在由北橋通過與記憶體連線的前端匯流排將資料寫到記憶體中的指定記憶體單元裡!

注意這裡要說一點的是,當CPU向記憶體中寫資料時,與CPU連線的前端匯流排的地址匯流排位寬是一級快取的位寬,那麼怎麼表示記憶體中的定址範圍呢?

答:當CPU向記憶體中寫資料時通過地址匯流排將要選中的地址碼發給北橋晶片(在這裡位寬只表示一次能傳送多少個bit位),而北橋獲取這個地址碼後根據地址碼通過與記憶體連線的地址匯流排選中記憶體中響應的記憶體單元,與記憶體連線的地址匯流排位寬決定記憶體中的定址範圍大小,當你的定址範圍大小超過地址匯流排的位寬時北橋則不會去尋找,直接報硬體中斷錯誤!

重點:

北橋是根據與記憶體連線的地址匯流排的位數來判斷記憶體中有多少個記憶體單元的!

注意在購買CPU時要看好前端匯流排是否被CPU支援,比如8086的CPU一次定址時要求前端匯流排必須是16的倍數,也就是說CPU一次定址範圍必須大於16個bit位(兩個位元組),剛好一個前端匯流排即可表示!

總結:

CPU在讀取記憶體中的資料時先通過前端匯流排與北橋互動,北橋晶片將記憶體中的資料送到一級快取中,在由CPU通過內部匯流排將一級快取中的資料取出放到指令暫存器裡,然後執行,這裡怎麼區分讀或寫?首先記憶體中的指令是組合好的,一條完整的指令是由操作碼地址碼運算元組合完成,CPU根據操作碼決定執行那些操作,在CPU指令集裡讀和寫的指令集是區分開的,通過地址碼選中對應的地址,將立即數寫入,如果是讀的話沒有立即數!

這裡講一個讀的過程:

從記憶體單元00讀出放到記憶體單元01中:

CPU先與北橋互動取出00記憶體單元中的資料放到一級快取中,CPU在通過內部匯流排將其取出放到通用暫存器裡,最後在將其通過前端匯流排與北橋互動放到記憶體單元01處!

在挑選CPU時前端匯流排必須是CPU支援的,否則無法正常執行,比如8086CPU支援的地址匯流排位寬必須是16的倍數,也就是說如果你的前端匯流排位寬不足以16的話將無法正常工作。

最後在給大家看一下記憶體單元究竟是怎樣的:


上圖的儲存器屬於較老版本的,現代的記憶體條都已經將儲存單元封裝起來了,不可見!

這裡拿出來只是為了讓大家知道記憶體單元長什麼樣子,現代的記憶體條記憶體單元非常小容量卻沒有任何變化!