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