這篇部落格主要將介紹cpu硬體層面上的一些細節,但不會涉及全部的元件,只描述我個人認為重要的幾個點而已,更具體詳盡的描述要看前面那篇文章中介紹的兩本書。
1、位址與定址
這在之前是個非常折磨我的問題,我實在想象不出如何根據乙個數字去尋找記憶體中相應的單元,難不成每個單元上面都貼著標籤?直到我看到下面所謂的選擇電路:
在左邊這張圖中,若sel=0,則輸出f=a;反之,若sel=1,則f=b。sel輸入的訊號不就是位址嗎?在這個體系中,a的位址就是0,b的位址就是1。好吧,也許一根位址線不夠明顯,那麼再看這張圖:
當a=0,b=0時,輸出=輸入0;a=0,b=1時,輸出=輸入2;a=1,b=0時,輸出=輸入1;最後a=b=1時,輸出=輸入3,這樣我門就確定了四個輸入的位址,從上到下依次為:11,01,10,00,且在這個體系中,a代表位址的高位,b代表低位,這是有兩根位址線的情況。
大家可以自行腦補一下,若有3根位址線的話,可以決定8個位址;32根就可以決定2的32次方個位址。這就是位址的硬體實現,跟我想象中貼標籤的情形完全不一樣。。我們同時可以看到,每個與閘電路中既有位址輸入,還有資料輸入,但是資料輸入只有一根線,不過他是可以擴充,比如增加到8根,那麼一次就可以輸入乙個位元組的資料,而輸出也要相應的增加到8根。
2、讀寫操作與儲存
有人發明了這個電路:
當保持位的訊號是1的時候,q與資料端的訊號保持一致,即輸入隨時可以改變輸出;但是當保持位變成0的時候,無論資料端的訊號怎麼變化,q端都將維持剛才的輸出。這就是所謂電平觸發的d型觸發器,他可以儲存電路中的訊號。我想各位已經可以從這個「簡單」的裝置中看到了記憶體的影子,雖然它只能儲存一位訊號。而保持位就是傳說中的「寫」訊號,當這個訊號是1的時候,才可以「寫入」,亦即「儲存訊號」。
我們可以看到,這和想象中的儲存還是不太一樣的。這個裝置的「儲存」動作實際上是維持剛才的輸出訊號,本身並沒有實際的「儲存」電訊號,訊號仍然只「存在」於某一段線路上。比較詩意的說法就是:電訊號不會停留在某處,它永遠在路上。。我有個不太恰當的比喻,計算機中所謂的儲存元件,就像某種城門或者閘門,它的目的或功能只是阻礙經過它的訊號的「正常」流動、傳播,開閘的時候,訊號可以自由通過這裡繼續向前傳播;但是一旦關閘,這個訊號就到此為止了,閘門後面的訊號由閘門接管了,而接管也只是簡單的讓其維持剛才的狀態繼續向前流動。
同樣的道理,我們可以想象,「讀」這個動作又是如何實現的?比如從記憶體某個單元讀入乙個位元組到暫存器中。我猜可能是這樣的:暫存器和記憶體由8跟線相連,經過前面的位址選擇器,記憶體對應單元的訊號已經被放到了連線上,並且馬上到了暫存器的門口,但是城門沒開啊。而所謂的「讀」,就是簡單的把暫存器的門開啟(即,把寫訊號置為1),然後暫存器就「讀」入了新值。暫存器儲存了這個新值,其實就是暫存器電路改變了向外輸出的那條線路的訊號,同時關閉了和記憶體相連的門(以避免受其影響)。新值經過暫存器又流到**,就要看這條線路被連到哪個位址選擇器了,可能是另乙個暫存器,或者是alu,還可能是記憶體。
到此為止,我感覺已經把資料在cpu內以及在cpu和記憶體之間的流**景描述了一邊,即,這種流動的本質或者物理情形是怎麼樣的。
但是這個裝置還有乙個問題,就是太依賴保持位的穩定性。萬一它應該保持在1的時候突然變成了0怎麼辦?要知道電路不一定是永遠穩定的,受到一點兒干擾就可能發生變化。於是就有了下面這個電路:
上面那個電路,在保持位是1的時候,輸入的變化總會改變輸出;而這個電路,只有在保持位從0變成1的瞬間,輸入的變化才會引起輸出的變化,也就是說,當保持位處於某個穩定狀態的時候,輸出是不會隨著輸入變化的,而在保持位從0變成1的瞬間,那麼輸入是幾,輸出就是幾了。這意味著,想要改變輸出的話,輸入必須同時(0->1瞬間)變化。
這裡保持位就是時鐘訊號的原型了,即由時鐘訊號來控制這個保持位。因為時鐘訊號在0和1之間週期性變化,所以用同乙個時鐘訊號來控制多個儲存裝置的讀寫訊號就可以保證資料傳輸的同步性,這個同步性對於控制資料流是相當重要的,後面我也許會分析,不過最好還是看書自己體會。其實剛才的栗子也能看出一點端倪,即記憶體的位址選擇器做出選擇(這個動作的物理含義是:位址訊號達到位址選擇器門前,位址選擇器必須開門)的瞬間,對應的記憶體單元的資料立刻就能到達暫存器的門口,這時就要求暫存器的門和位址選擇器的門同時開啟,怎麼樣才能保證同時呢?唯有靠時鐘訊號了。下面我們就要分析一下時鐘訊號是怎麼來的。
3、時序
首先要知道的乙個器件是振盪器:
這個電路做的事情就是:把輸入取反之後輸出,然後把輸出作為輸入,如此迴圈。可以看出輸出到達輸入口幾乎不需要時間,這意味著輸出變化的頻率很高。單我們需要乙個較低的頻率時就要接入乙個分頻器,其實就接入上面提到的邊沿觸發器,如下圖:
這個裝置中,q在0和1之間變化的頻率是clk的一半(自己最好推算一下),q後面可以繼續接入乙個邊沿觸發器,再次分頻,如此迴圈。我們有了下面這個裝置:
其訊號輸出通過影象表現出來就能看出點東西:
第二張圖要這樣看:第一列是0000,最後一列是1111,能不能聯想到什麼?我能想到的就是作為位址選擇器的輸入,這樣就能自動化操作,cpu就可以連續的從記憶體中取出指令,是的,這個裝置就是pc(程式計數器)的原型!!!激動有木有?當然這些輸出訊號還能被送往其他部件,作為讀寫控制訊號。
指令與CPU的執行探微(三)
本篇部落格試圖對cpu執行的細節進行一次全景式的描述,以彌補寫version1.0時的缺憾。此文以 深入理解計算機系統 的第四章 處理器體系結構 為藍本,結合從 編碼 中得到的知識,力圖把執行一條指令時,每一步中cpu到底都幹了些什麼描述清楚。由於這個執行過程與所使用的指令集密不可分,所以首先擺上 ...
CPU指令亂序執行問題
cpu為了提高指令執行效率,會在一條指令執行過程中 比如去記憶體讀資料 慢100倍 去同時執行另一條指令,前提是,兩條指令沒有依賴關係 寫操作也可以進行合併 硬體記憶體屏障 x86 sfence store 在sfence指令前的寫操作當必須在sfence指令後的寫操作前完成。lfence load...
8086的復位與啟動 CPU執行指令的步驟
東北大學 計算機硬體技術基礎 取指令將cs和ip的內容通過位址加法器得到指令的實體地址,經位址解碼器選址後將指定單元中的指令取入cpu的ir當中。解碼id對ir中的指令進行解碼,分析指令的操作碼 執行什麼操作 和運算元 具體數,存放位置 以及操作結果的存放位置,並由控制器向儲存器,運算器等有關部件發...