處理器(CPU)架構(gòu)和原理分析
一直以來(lái),總以為CPU內(nèi)部真是如當(dāng)年學(xué)習(xí)《計(jì)算機(jī)組成原理》時(shí)書上所介紹的那樣,是各種邏輯門器件的組合。當(dāng)看到納米技術(shù)時(shí)就想,真的可以把那些器件做的那么小么?直到看了Intel CPU制作流程及AMD芯片的制作流程的介紹不禁感慨,原來(lái)科技是如此的發(fā)達(dá)。
本文我們以Intel為例對(duì)CPU的工作原理做簡(jiǎn)單介紹,僅僅是簡(jiǎn)單介紹,那么AMD,ARM,MIPS甚至PowerPC你應(yīng)該會(huì)觸類旁通才對(duì)。
還記得那是1968年7月18日,鮑勃-諾斯和戈登-摩爾的新公司在美國(guó)加利福尼亞州,美麗的圣弗朗西斯科灣畔芒延維尤城的梅多費(fèi)大街365號(hào)開張了。并在成立不久斥資15000美元從一家叫INTELCO的公司手中買下了Intel名稱的使用權(quán)。由此Intel這位半導(dǎo)體巨人開始了他在IT行業(yè)傳奇般的歷史。
1971年11月15日,這一天被當(dāng)作全球IT界具有里程碑意義的日子而被寫入許多計(jì)算機(jī)專業(yè)教科書。Intel公司的工程師特德·霍夫發(fā)明了世界上第一個(gè)微處理器—4004,這款4位微處理器雖然只有45條指令,而且每秒只能執(zhí)行5萬(wàn)條指令。甚至比不上1946年由美國(guó)陸軍賓夕法尼亞大學(xué)研制的世界第一臺(tái)計(jì)算機(jī)ENIAC。但它的集成度卻要高很多,一塊4004的重量還不到一盅司。 他因發(fā)明了微處理器,被英國(guó)《經(jīng)濟(jì)學(xué)家》雜志稱為“第二次世界大戰(zhàn)以來(lái)最有影響的科學(xué)家之一”。Intel公司的CPU發(fā)展歷程如下表所示:
以及后面的Pentium 1,2,3和4,再到酷睿、酷睿2,這里就不再一一列舉。Intel從8086開始,就進(jìn)入了我們所謂的x86時(shí)代。而80386的誕生則標(biāo)志著Intel正是進(jìn)入了32位微處理器的時(shí)代。從80386到Pentium 4這個(gè)年代的CPU,就是傳說(shuō)中的IA-32時(shí)代。
我們都知道CPU的根本任務(wù)就是執(zhí)行指令,對(duì)計(jì)算機(jī)來(lái)說(shuō)最終都是一串由“0”和“1”組成的序列。CPU從邏輯上可以劃分成3個(gè)模塊,分別是控制單元、運(yùn)算單元和存儲(chǔ)單元,這三部分由CPU內(nèi)部總線連接起來(lái)。如下所示:
控制單元:控制單元是整個(gè)CPU的指揮控制中心,由指令寄存器IR(Instruction Register)、指令譯碼器ID(Instruction Decoder)和操作控制器OC(Operation Controller)等,對(duì)協(xié)調(diào)整個(gè)電腦有序工作極為重要。它根據(jù)用戶預(yù)先編好的程序,依次從存儲(chǔ)器中取出各條指令,放在指令寄存器IR中,通過指令譯碼(分析)確定應(yīng)該進(jìn)行什么操作,然后通過操作控制器OC,按確定的時(shí)序,向相應(yīng)的部件發(fā)出微操作控制信號(hào)。操作控制器OC中主要包括節(jié)拍脈沖發(fā)生器、控制矩陣、時(shí)鐘脈沖發(fā)生器、復(fù)位電路和啟停電路等控制邏輯。
運(yùn)算單元:是運(yùn)算器的核心??梢詧?zhí)行算術(shù)運(yùn)算(包括加減乘數(shù)等基本運(yùn)算及其附加運(yùn)算)和邏輯運(yùn)算(包括移位、邏輯測(cè)試或兩個(gè)值比較)。相對(duì)控制單元而言,運(yùn)算器接受控制單元的命令而進(jìn)行動(dòng)作,即運(yùn)算單元所進(jìn)行的全部操作都是由控制單元發(fā)出的控制信號(hào)來(lái)指揮的,所以它是執(zhí)行部件。
存儲(chǔ)單元:包括CPU片內(nèi)緩存和寄存器組,是CPU中暫時(shí)存放數(shù)據(jù)的地方,里面保存著那些等待處理的數(shù)據(jù),或已經(jīng)處理過的數(shù)據(jù),CPU訪問寄存器所用的時(shí)間要比訪問內(nèi)存的時(shí)間短。采用寄存器,可以減少CPU訪問內(nèi)存的次數(shù),從而提高了CPU的工作速度。但因?yàn)槭艿叫酒娣e和集成度所限,寄存器組的容量不可能很大。寄存器組可分為專用寄存器和通用寄存器。專用寄存器的作用是固定的,分別寄存相應(yīng)的數(shù)據(jù)。而通用寄存器用途廣泛并可由程序員規(guī)定其用途,通用寄存器的數(shù)目因微處理器而異。這個(gè)是我們以后要介紹這個(gè)重點(diǎn),這里先提一下。
我們將上圖細(xì)化一下,可以得出CPU的工作原理概括如下:
總的來(lái)說(shuō),CPU從內(nèi)存中一條一條地取出指令和相應(yīng)的數(shù)據(jù),按指令操作碼的規(guī)定,對(duì)數(shù)據(jù)進(jìn)行運(yùn)算處理,直到程序執(zhí)行完畢為止。
上圖中我沒有畫總線,只是用邏輯方式對(duì)其進(jìn)行呈現(xiàn)。原因早期Intel的微處理器,諸如8085,8086/8088CPU,普遍采用了地址總線和數(shù)據(jù)總線復(fù)用技術(shù),即將部分(或全部)地址總線與數(shù)據(jù)總線共用CPU的一些引腳。例如8086外部地址總線有20根,數(shù)據(jù)總線復(fù)用了地址總線的前16根引腳。復(fù)用的數(shù)據(jù)總線和地址總線雖然可以少CPU的引腳數(shù),但卻引入了控制邏輯及操作序列上的復(fù)雜性。所以,自80286開始,Intel的CPU才采用分開的地址總線和數(shù)據(jù)總線。
不管是復(fù)用還是分開,對(duì)我們理解CPU的運(yùn)行原理沒啥影響,上圖沒畫總線的目的就是怕有些人太過于追求細(xì)節(jié),一頭扎下去,浮不起來(lái),不能從宏觀上藐視敵人。
OK,總結(jié)一下,CPU的運(yùn)行原理就是:控制單元在時(shí)序脈沖的作用下,將指令計(jì)數(shù)器里所指向的指令地址(這個(gè)地址是在內(nèi)存里的)送到地址總線上去,然后CPU將這個(gè)地址里的指令讀到指令寄存器進(jìn)行譯碼。對(duì)于執(zhí)行指令過程中所需要用到的數(shù)據(jù),會(huì)將數(shù)據(jù)地址也送到地址總線,然后CPU把數(shù)據(jù)讀到CPU的內(nèi)部存儲(chǔ)單元(就是內(nèi)部寄存器)暫存起來(lái),最后命令運(yùn)算單元對(duì)數(shù)據(jù)進(jìn)行處理加工。周而復(fù)始,一直這樣執(zhí)行下去,天荒地老,??葜€,直到停電。
如果你對(duì)這段話還是覺得比較暈乎,那么就看我們老師是怎么講的:
1、取指令:CPU的控制器從內(nèi)存讀取一條指令并放入指令寄存器。指令的格式一般是這個(gè)樣子滴:
操作碼就是匯編語(yǔ)言里的mov,add,jmp等符號(hào)碼;操作數(shù)地址說(shuō)明該指令需要的操作數(shù)所在的地方,是在內(nèi)存里還是在CPU的內(nèi)部寄存器里。
2、指令譯碼:指令寄存器中的指令經(jīng)過譯碼,決定該指令應(yīng)進(jìn)行何種操作(就是指令里的操作碼)、操作數(shù)在哪里(操作數(shù)的地址)。
3、 執(zhí)行指令,分兩個(gè)階段“取操作數(shù)”和“進(jìn)行運(yùn)算”。
4、 修改指令計(jì)數(shù)器,決定下一條指令的地址。
關(guān)于CPU我們從宏觀上把握到這個(gè)程度就OK了,后面我們會(huì)逐步進(jìn)入微觀階段,依次介紹80X86寄存器及其用途,NASM匯編和AT&T的區(qū)別,以及C代碼中嵌入的匯編語(yǔ)言的寫法。之所以介紹匯編語(yǔ)言目的不是說(shuō)用匯編去寫代碼,那是相當(dāng)?shù)牟滑F(xiàn)實(shí),除非你是硬件驅(qū)動(dòng)工程師。稍微偏上層一點(diǎn)的開發(fā)人員懂點(diǎn)低等的東西,對(duì)自己理解整個(gè)系統(tǒng)的架構(gòu)和原理是相當(dāng)有好處的。