CPU的內部架構和工作原理

一直以來,總以CPU內部真是如當年學習《計算機組成原理》時書上所介紹的那樣,是各種邏輯門器件的組合。當看到納米技術時就想,真的可以把那些器件做的那麼小麼?直到看了Intel CPU製作流程AMD芯片的製作流程的介紹不禁感慨,原來科技是如此的發達。

本文我們以Intel爲例對CPU的工作原理做簡單介紹,僅僅是簡單介紹,那麼AMDARMMIPS甚至PowerPC你應該會觸類旁通才對。

還記得那是1968718,鮑勃-諾斯和戈登-摩爾的新公司在美國加利福尼亞州,美麗的聖弗朗西斯科灣畔芒延維尤城的梅多費大街365號開張了。並在成立不久斥資15000美元從一家叫INTELCO的公司手中買下了Intel名稱的使用權。由此Intel這位半導體巨人開始了他在IT行業傳奇般的歷史。
   1971年11月15日,這一天被當作全球IT界具有里程碑意義的日子而被寫入許多計算機專業教科書。Intel公司的工程師特德·霍夫發明了世界上第一個微處理器—4004,這款4位微處理器雖然只有45條指令,而且每秒只能執行5萬條指令。甚至比不上1946年由美國陸軍賓夕法尼亞大學研製的世界第一臺計算機ENIAC。但它的集成度卻要高很多,一塊4004的重量還不到一盅司。 他因發明了微處理器,被英國《經濟學家》雜誌稱爲“第二次世界大戰以來最有影響的科學家之一”。Intel公司的CPU發展歷程如下表所示:


   以及後面的Pentium 1,2,34,再到酷睿、酷睿2,這裏就不再一一列舉。Intel8086開始,就進入了我們所謂的x86時代。而80386的誕生則標誌着Intel正是進入了32位微處理器的時代。從80386Pentium 4這個年代的CPU,就是傳說中的IA-32時代。
   我們都知道CPU的根本任務就是執行指令,對計算機來說最終都是一串由“0”和“1”組成的序列。CPU從邏輯上可以劃分成3個模塊,分別是控制單元運算單元存儲單元,這三部分由CPU內部總線連接起來。如下所示:

控制單元:控制單元是整個CPU的指揮控制中心,由指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)和操作控制器OC(Operation Controller)等,對協調整個電腦有序工作極爲重要。它根據用戶預先編好的程序,依次從存儲器中取出各條指令,放在指令寄存器IR中,通過指令譯碼(分析)確定應該進行什麼操作,然後通過操作控制器OC,按確定的時序,向相應的部件發出微操作控制信號。操作控制器OC中主要包括節拍脈衝發生器、控制矩陣、時鐘脈衝發生器、復位電路和啓停電路等控制邏輯。

運算單元:是運算器的核心。可以執行算術運算(包括加減乘數等基本運算及其附加運算)和邏輯運算(包括移位、邏輯測試或兩個值比較)。相對控制單元而言,運算器接受控制單元的命令而進行動作,即運算單元所進行的全部操作都是由控制單元發出的控制信號來指揮的,所以它是執行部件。

存儲單元:包括CPU片內緩存和寄存器組,是CPU中暫時存放數據的地方,裏面保存着那些等待處理的數據,或已經處理過的數據,CPU訪問寄存器所用的時間要比訪問內存的時間短。採用寄存器,可以減少CPU訪問內存的次數,從而提高了CPU的工作速度。但因爲受到芯片面積和集成度所限,寄存器組的容量不可能很大。寄存器組可分爲專用寄存器和通用寄存器。專用寄存器的作用是固定的,分別寄存相應的數據。而通用寄存器用途廣泛並可由程序員規定其用途,通用寄存器的數目因微處理器而異。這個是我們以後要介紹這個重點,這裏先提一下。

我們將上圖細化一下,可以得出CPU的工作原理概括如下:

總的來說,CPU從內存中一條一條地取出指令和相應的數據,按指令操作碼的規定,對數據進行運算處理,直到程序執行完畢爲止。
   
上圖中我沒有畫總線,只是用邏輯方式對其進行呈現。原因早期Intel的微處理器,諸如80858086/8088CPU,普遍採用了地址總線和數據總線複用技術,即將部分(或全部)地址總線與數據總線共用CPU的一些引腳。例如8086外部地址總線有20根,數據總線複用了地址總線的前16根引腳。複用的數據總線和地址總線雖然可以少CPU的引腳數,但卻引入了控制邏輯及操作序列上的複雜性。所以,自80286開始,IntelCPU才採用分開的地址總線和數據總線。
   
不管是複用還是分開,對我們理解CPU的運行原理沒啥影響,上圖沒畫總線的目的就是怕有些人太過於追求細節,一頭紮下去,浮不起來,不能從宏觀上藐視敵人。
   
OK,總結一下,CPU的運行原理就是控制單元在時序脈衝的作用下,將指令計數器裏所指向的指令地址(這個地址是在內存裏的)送到地址總線上去,然後CPU將這個地址裏的指令讀到指令寄存器進行譯碼。對於執行指令過程中所需要用到的數據,會將數據地址也送到地址總線,然後CPU把數據讀到CPU的內部存儲單元(就是內部寄存器)暫存起來,最後命令運算單元對數據進行處理加工。周而復始,一直這樣執行下去,天荒地老,海枯枝爛,直到停電。
   
如果你對這段話還是覺得比較暈乎,那麼就看我們老師是怎麼講的:
   
1、取指令:CPU的控制器從內存讀取一條指令並放入指令寄存器。指令的格式一般是這個樣子滴:


        操作碼就是彙編語言裏的mov,add,jmp等符號碼;操作數地址說明該指令需要的操作數所在的地方,是在內存裏還是在CPU的內部寄存器裏。
   
2、指令譯碼:指令寄存器中的指令經過譯碼,決定該指令應進行何種操作(就是指令裏的操作碼)、操作數在哪裏(操作數的地址)。
   
3、 執行指令,分兩個階段“取操作數”和“進行運算”。
   
4、 修改指令計數器,決定下一條指令的地址。

關於CPU我們從宏觀上把握到這個程度就OK了,後面我們會逐步進入微觀階段,依次介紹80X86寄存器及其用途,NASM彙編和AT&T的區別,以及C代碼中嵌入的彙編語言的寫法。之所以介紹彙編語言目的不是說用匯編去寫代碼,那是相當的不現實,除非你是硬件驅動工程師。稍微偏上層一點的開發人員懂點低等的東西,對自己理解整個系統的架構和原理是相當有好處的。
    
未完,待續…


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(32201) | 評論(12) | 轉發(16) |
給主人留下些什麼吧!~~
45_avatar_small.jpg

大見DJ2013-05-10 16:13:43

wjlkoorey258:呵呵,和當年“復旦ABC”那些牛人比起來相去甚遠啊。

呵呵 他早就出書了。

回覆 | 舉報
58_avatar_small.jpg

wjlkoorey2582013-05-09 00:02:10

大見DJ:內容清晰 語言很幽默。呵呵

呵呵,和當年“復旦ABC”那些牛人比起來相去甚遠啊。

回覆 | 舉報
58_avatar_small.jpg

wjlkoorey2582013-05-09 00:01:07

tntcheng:個人感覺 《編碼隱匿在計算機軟硬件背後的語言》這本書真的很好!謝謝樓主博文

謝謝推薦,回頭去翻一翻。

回覆 | 舉報
45_avatar_small.jpg

大見DJ2013-05-08 21:29:06

內容清晰 語言很幽默。呵呵

00_avatar_small.jpg

tntcheng2013-04-16 20:41:39

個人感覺 《編碼隱匿在計算機軟硬件背後的語言》這本書真的很好!謝謝樓主博文

評論熱議
發佈了87 篇原創文章 · 獲贊 14 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章