1. 程式人生 > >CPU的內部架構和工作原理

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

2013-05-09 00:02:10

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

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

回覆 | 舉報 58_avatar_small.jpg

2013-05-09 00:01:07

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

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

回覆 | 舉報 45_avatar_small.jpg

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

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

回覆 | 舉報 00_avatar_small.jpg

2013-04-16 20:41:39

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

回覆 | 舉報 評論熱議