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