大家天天都在使用手機(jī),你知道你的手機(jī)使用的什么處理器,?處理器又是何種架構(gòu)呢,?今天筆者就來談?wù)勌幚砥鞯募軜?gòu)和指令集。 我們知道一臺手機(jī)最重要的就是處理器,,也就是處理器,,那么什么是處理器呢? 處理器就是一堆數(shù)字電路(架構(gòu))以高低電平的各種組合實現(xiàn)了各種基本的運算(指令),。 接下來我們看看要想設(shè)計出處理器,,需要哪些東西,先看下圖,。 要想設(shè)計出處理器,,就需要有指令集,也就是規(guī)定處理器的相應(yīng)操作,,通過指令集去控制處理器實現(xiàn)相應(yīng)功能,。但處理器是一堆硬件電路,只能識別二進(jìn)制數(shù)據(jù),,所以指令集是由一堆二進(jìn)制數(shù)據(jù)組成,。處理器通過指令集是給用戶提供的一個接口。指令集架構(gòu)(Instructuon Set ArchitectureI, ISA)和處理器架構(gòu)(Micro architecture)是上下級的關(guān)系,。 而二進(jìn)制數(shù)據(jù)對人類來說讀起來很麻煩,。為了方便人類操作指令集,發(fā)明了匯編語言來描述指令集。匯編語言類似人類語言,,讀起來方便多了,。雖然匯編語言讀起來方便了,但也有缺陷,。首先匯編語言操作起來還是挺麻煩的,。其次匯編語言對應(yīng)一條條指令集,所以當(dāng)指令集改變時,,就得修改相應(yīng)匯編語言,,導(dǎo)致其可移植性很差,不能跨平臺使用,,如ARM架構(gòu)的匯編語言與Intel X86架構(gòu)的就不同,。這時人們就想開發(fā)一種更方便操作,超越指令集的語言,,于是有了C,,C++等高級語言。 處理器只能識別二進(jìn)制碼,,那怎么能識別高級語言呢,?于是人們開發(fā)了編譯器,依照如下順序,,將高級語言翻譯成二進(jìn)制碼: 至此,,人類就可以方便的利用高級語言編寫程序,控制處理器完成相應(yīng)工作,。然后程序員這個職業(yè)就此大規(guī)模誕生了,。哈哈,驚不驚喜,!好了,,接下來我們談?wù)勌幚砑軜?gòu)和指令集。 1馮·諾依曼架構(gòu)與哈佛架構(gòu)對于處理器架構(gòu),,目前已經(jīng)演變出很多架構(gòu),,但基本上都是由馮·諾依曼架構(gòu)和哈佛架構(gòu)演變而來。 1.1馮·諾伊曼架構(gòu)1945 年,,約翰·馮·諾依曼 (John von Neumann) 在他的著名《First Draft of a Report on the EDVAC》提出了電子數(shù)字計算機(jī),,也就是馮·諾伊曼架構(gòu)。 馮·諾伊曼架構(gòu)(Von Neumann Architecture),,也稱普林斯頓結(jié)構(gòu),,是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的處理器架構(gòu)。 該架構(gòu)將儲存裝置與中央處理器分開的概念,,因此依該架構(gòu)設(shè)計出的計算機(jī)又稱儲存程式型電腦,。 馮諾依曼架構(gòu)如下圖所示: 1.CPU:CPU是負(fù)責(zé)執(zhí)行計算機(jī)程序指令的電子電路單元。CPU是處理指令的計算機(jī)系統(tǒng)的主要組件。它運行操作系統(tǒng)和應(yīng)用程序,,不斷接收來自用戶或應(yīng)用程序的輸入,。 2.寄存器:它是一種存儲器,用于快速接收,、存儲和傳輸中央處理器立即使用的數(shù)據(jù)和指令,。 3 . ALU: Arithmetic Logic Unit 負(fù)責(zé)所有所需的計算,如乘法,、加法,、減法、比較,、邏輯運算符和其他算術(shù)運算符,。 4.控制單元(CU): CU也是中央處理器(CPU)的一部分。CU 操作系統(tǒng)內(nèi)的所有處理器控制信號,、輸入/輸出設(shè)備、數(shù)據(jù)和指令的移動,。 5.總線:用作指令和數(shù)據(jù)的信號通信,。 6.內(nèi)存單元:內(nèi)存單元由隨機(jī)存取內(nèi)存 (RAM) 組成,有時也稱為主內(nèi)存或主內(nèi)存,。與硬盤(二級內(nèi)存)不同,,這種內(nèi)存速度快,而且 CPU 可以直接訪問,。RAM 被分成多個分區(qū),。它的每個分區(qū)都由一個地址及其內(nèi)容組成。該地址將唯一標(biāo)識內(nèi)存中的每個位置,。將數(shù)據(jù)從永久內(nèi)存(硬盤)加載到更快且可直接訪問的臨時內(nèi)存 (RAM) 中,,可使 CPU 工作得更快。 PC和服務(wù)器芯片(譬如Intel AMD那些出的),,ARM Cortex-A系列嵌入式芯片(譬如核心是ARM Cortex A8的三星S5PV210,,譬如華為的麒麟970等手機(jī)芯片)等都是馮諾依曼結(jié)構(gòu)。這些系統(tǒng)都需要大量內(nèi)存,,所以工作內(nèi)存都是DRAM,,因為他們更適合使用馮諾依曼系統(tǒng)。 1.2哈佛架構(gòu)哈佛架構(gòu)(Harvard architecture)是一種將程序指令儲存和數(shù)據(jù)儲存分開的存儲器結(jié)構(gòu),。中央處理器首先到程序指令儲存器中讀取程序指令內(nèi)容,,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)儲存器中讀取數(shù)據(jù),,并進(jìn)行下一步的操作(通常是執(zhí)行),。 哈佛架構(gòu)的架構(gòu)如下: 1.總線:用作指令和數(shù)據(jù)的信號通路。在這種架構(gòu)中,數(shù)據(jù)和指令都有單獨的總線,。有不同類型的總線,,它們?nèi)缦拢簲?shù)據(jù)總線、數(shù)據(jù)地址總線,、指令總線,、指令地址總線。 2.操作寄存器:在哈佛架構(gòu)中,,使用了不同類型的寄存器,,用于存儲不同類型指令的地址。一些寄存器是內(nèi)存數(shù)據(jù)寄存器,,內(nèi)存地址寄存器,。 3.程序計數(shù)器:程序計數(shù)器具有要執(zhí)行的下一條指令的位置。程序計數(shù)器將下一個地址傳遞給內(nèi)存地址寄存器,。 4. ALU:Arithmetic Logic Unit 負(fù)責(zé)所有所需的計算,,如乘法、加法,、減法,、比較、邏輯運算符和其他算術(shù)運算符,。 5.控制單元(CU):CU也是中央處理器(CPU)的一部分,。CU 操作系統(tǒng)內(nèi)的所有處理器控制信號、輸入/輸出設(shè)備,、數(shù)據(jù)和指令的移動,。 6.輸入/輸出流:I/P設(shè)備用于在中央處理器(CUP)輸入指令的幫助下將數(shù)據(jù)讀入主存儲器。當(dāng)輸出通過輸出設(shè)備顯示時,,它提供來自系統(tǒng)的信息,。簡單地說,計算機(jī)系統(tǒng)在 O/P 設(shè)備的幫助下給出處理(計算)的結(jié)果,。 在遵循馮諾依曼架構(gòu)的普通計算機(jī)中,,指令和數(shù)據(jù)都存儲在同一內(nèi)存中。因此使用相同的總線來獲取指令和數(shù)據(jù),。這意味著 CPU 不能同時做兩件事(讀指令和讀/寫數(shù)據(jù)),。而哈佛體系結(jié)構(gòu)的計算機(jī)將指令和數(shù)據(jù)分別使用獨立存儲和獨立總線(信號路徑)。它基本上是為了克服馮諾依曼架構(gòu)的瓶頸而開發(fā)的,。指令和數(shù)據(jù)總線分開的主要優(yōu)點是 CPU 可以同時訪問指令和讀/寫數(shù)據(jù),。這是哈佛架構(gòu)的主要優(yōu)勢。 哈佛結(jié)構(gòu)的微處理器通常具有較高的執(zhí)行效率,,因其程序指令和數(shù)據(jù)指令分開組織和儲存的,,執(zhí)行時可以預(yù)先讀取下一條指令,。目前使用哈佛結(jié)構(gòu)的中央處理器和微控制器有很多,比如Microchip公司的PIC系列芯片,,還有摩托羅拉公司的MC68系列,、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9,、ARM10和ARM11,。MCU也就是單片機(jī)中幾乎都是用哈佛結(jié)構(gòu),譬如廣泛使用的51單片機(jī),、典型的STM32單片機(jī)(核心是ARM Cortex-M系列的)都是哈佛結(jié)構(gòu),。 與馮.諾曼結(jié)構(gòu)處理器比較,哈佛結(jié)構(gòu)處理器有兩個明顯的特點: 1.使用兩個獨立的存儲器模塊,,分別存儲指令和數(shù)據(jù),,每個存儲模塊都不允許指令和數(shù)據(jù)并存; 2.使用獨立的兩條總線,,分別作為CPU與每個存儲器之間的專用通信路徑,,而這兩條總線之間毫無關(guān)聯(lián)。 1.3總結(jié)哈佛結(jié)構(gòu)和馮諾依曼結(jié)構(gòu)主要區(qū)別在是否區(qū)分指令與數(shù)據(jù),。在教科書里這是兩種截然不同的做法,。 但實際上在內(nèi)存里,指令和數(shù)據(jù)是在一起的,。而在CPU內(nèi)的緩存中,,還是會區(qū)分指令緩存和數(shù)據(jù)緩存,,最終執(zhí)行的時候,,指令和數(shù)據(jù)是從兩個不同的地方出來的。你可以理解為在CPU外部,,采用的是馮諾依曼模型,,而在CPU內(nèi)部用的是哈佛結(jié)構(gòu)。 哈佛結(jié)構(gòu)設(shè)計復(fù)雜,,但效率高,。馮諾依曼結(jié)構(gòu)則比較簡單,但也比較慢,。CPU廠商為了提高處理速度,,在CPU內(nèi)增加了高速緩存。也基于同樣的目的,,區(qū)分了指令緩存和數(shù)據(jù)緩存,。有時為了解決現(xiàn)實問題,究竟是什么主義真的沒那么重要,。 實際上,,絕大多數(shù)現(xiàn)代計算機(jī)使用的是所謂的“Modified Harvard Architecture”,,指令和數(shù)據(jù)共享同一個address space,但緩存是分開的,。 在現(xiàn)實世界中很少有非常純粹的概念,,特別是在實際的應(yīng)用里。教科書里的大多是理想化的模型,,便于掌握某個概念的重點和本質(zhì),,但實際中很難達(dá)到這種理想化的狀態(tài)。 有一些ARM(Cortex-M系列)是哈佛結(jié)構(gòu),,而另一些ARM(Cortex-A)是馮諾依曼結(jié)構(gòu)(或者更準(zhǔn)確說是混合結(jié)構(gòu)),,對ARM體系CPU(除ARM7)對外表現(xiàn)為馮.諾伊曼架構(gòu),對內(nèi)則表現(xiàn)為哈佛架構(gòu),。 因此,,兩種架構(gòu)各有優(yōu)勢,不能一概而論,。就目前而言,,兩種現(xiàn)代處理器在大規(guī)模的處理都是馮諾依曼,在小規(guī)模的處理是哈佛,。 介紹完了處理器架構(gòu),,接下來說說指令集。 2 CISC與RISC指令集CISC(Complex Instruction Set Computers,,復(fù)雜指令集計算機(jī))和RISC(Reduced Instruction Set Computers,,精減指令集計算機(jī))是兩大類主流的CPU指令集類型。 2.1 CISC(復(fù)雜指令集計算機(jī))早期的CPU全部是采用CISC,,它的設(shè)計目的是要用最少的機(jī)器語言指令來完成所需的計算任務(wù),。 隨著集成電路的發(fā)展,特別是VLSI(超大規(guī)模集成電路)技術(shù)的迅速發(fā)展,,為了軟件編程方便和提高程序的運行速度,,硬件工程師采用的辦法是不斷增加硬件的復(fù)雜性來實現(xiàn)復(fù)雜功能的指令和多種靈活的編址方式,甚至某些指令可支持高級語言語句歸類后的復(fù)雜操作,,至使硬件越來越復(fù)雜,,造價也相應(yīng)提高。為實現(xiàn)復(fù)雜操作,,微處理器除向程序員提供類似各種寄存器和機(jī)器指令功能外,,還通過存于只讀存貯器(ROM)中的微程序來實現(xiàn)其極強(qiáng)的功能,處理器在分析每一條指令之后執(zhí)行一系列初級指令運算來完成所需的功能,,以這種指令集設(shè)計出來計算機(jī)就是CISC(complex instruction set computer),,其中以CISC架構(gòu)設(shè)計的處理器有以Intel、AMD的X86為代表,。 2.2 RISC(精簡指令集計算機(jī))采用復(fù)雜指令系統(tǒng)的計算機(jī)有著較強(qiáng)的處理高級語言的能力,,這對提高計算機(jī)的性能是有益的,。當(dāng)計算機(jī)的設(shè)計沿著這條道路發(fā)展時,有些人沒有隨波逐流,,他們回過頭去看一看過去走過的道路,,開始懷疑這種傳統(tǒng)的做法,IBM公司在紐約Yorktown的JhomasI.Wason研究中心于1975年組織力量研究指令系統(tǒng)的合理性問題,,因為當(dāng)時已感到,,日趨龐雜的指令系統(tǒng)不但不易實現(xiàn),而且還可能降低系統(tǒng)性能,。 1979年以帕特遜教授為首的一批科學(xué)家也開始在美國加冊大學(xué)伯克萊分校開展這一研究,。結(jié)果表明,CISC存在許多缺點,。首先,,在這種計算機(jī)中,各種指令的使用率相差懸殊:一個典型程序的運算過程所使用的80%指令,,只占一個處理器指令系統(tǒng)的20%,,事實上最頻繁使用的指令是取、存和加這些最簡單的指令,。這樣一來,,長期致力于復(fù)雜指令系統(tǒng)的設(shè)計,實際上是在設(shè)計一種難得在實踐中用得上的指令系統(tǒng)的處理器,。同時,,復(fù)雜的指令系統(tǒng)必然帶來結(jié)構(gòu)的復(fù)雜性。這不但增加了設(shè)計的時間與成本還容易造成設(shè)計失誤,。 此外,,盡管VLSI技術(shù)現(xiàn)在已達(dá)到很高的水平,但也很難把CISC的全部硬件做在一個芯片上,,這也妨礙單片計算機(jī)的發(fā)展,。在CISC中,,許多復(fù)雜指令需要極復(fù)雜的操作,,這類指令多數(shù)是某種高級語言的直接翻版,因而通用性差,。由于采用二級的微碼執(zhí)行方式,,它也降低那些被頻繁調(diào)用的簡單指令系統(tǒng)的運行速度。 因而,,針對CISC的這些弊病,。帕特遜等人提出了精簡指令的設(shè)想即指令系統(tǒng)應(yīng)當(dāng)只包含那些使用頻率很高的少量指令,并提供一些必要的指令以支持操作系統(tǒng)和高級語言,。按照這個原則發(fā)展而成的計算機(jī)被稱為精簡指令集計算機(jī)(Reduced Instruction Set Computer),,簡稱RISC,。RISC以ARM、Apple的Macintosh,、IBM Power為代表,。開源的RISC-V也是RISC指令集。 RISC的設(shè)計初衷針對CISC CPU復(fù)雜的弊端,,選擇一些可以在單個CPU周期完成的指令,,以降低CPU的復(fù)雜度,將復(fù)雜性交給編譯器,。 2.3 CISC和RISC區(qū)別為了說明兩者的區(qū)別,,先舉一個例子。下圖是實現(xiàn)乘法運算的計算步驟:a = a * b,。它需要4個步驟: A.讀出a的值 B.讀出b的值 C.相乘 D.寫結(jié)果到a中 使用CISC提供的乘法指令,,只需要一條指令即可完成這4步操作。當(dāng)然,,這一個指令需要多個CPU周期才可以完成,。 而RISC不提供“一站式”的乘法指令,需調(diào)用四條單CPU周期指令完成兩數(shù)相乘:內(nèi)存a加載到寄存器,,內(nèi)存b加載到寄存器,,兩個寄存器中數(shù)相乘,寄存器結(jié)果存入內(nèi)存a,。 按照此思路,,早期的設(shè)計出的RISC指令集,指令數(shù)是比CISC少些,。后來,,很多RISC的指令集中指令數(shù)反超了CISC。因此,,應(yīng)該根據(jù)指令的復(fù)雜度而非數(shù)量來區(qū)分兩種指令集,。 當(dāng)然,CISC也是要通過操作內(nèi)存,、寄存器,、運算器來完成復(fù)雜指令的。它在實現(xiàn)時,,是將復(fù)雜指令轉(zhuǎn)換成了一個微程序,,微程序在制造CPU時就已存儲于微服務(wù)存儲器。一個微程序包含若干條微指令(也稱微碼),,執(zhí)行復(fù)雜指令時,,實際上是在執(zhí)行一個微程序。這也帶來兩種指令集的一個差別,,微程序的執(zhí)行是不可被打斷的,,而RISC指令之間可以被打斷,,所以理論上RISC可更快響應(yīng)中斷。 總的來說,,區(qū)別如下: 1.指令能力: CISC的指令能力強(qiáng),,單多數(shù)指令使用率低卻增加了CPU的復(fù)雜度,指令是可變長格式,,它必須對不等長指令進(jìn)行分割,,因此在執(zhí)行單一指令的時候需要進(jìn)行較多的處理工作。 RISC的指令大部分為單周期指令,,指令長度固定,,CPU在執(zhí)行指令的時候速度較快且性能穩(wěn)定。因此在并行處理方面RISC明顯優(yōu)于CISC,,RISC可同時執(zhí)行多條指令,,它可將一條指令分割成若干個進(jìn)程或線程,交由多個處理器同時執(zhí)行,。RISC對內(nèi)存只有l(wèi)oad/store操作,,數(shù)據(jù)的運算都是在CPU內(nèi)部實現(xiàn)。 2.尋址方式: CISC支持多種尋址方式,。 RISC支持的尋址方式少,。 3.實現(xiàn)方式: CISC通過微程序控制技術(shù)實現(xiàn)(微碼)。 RISC增加了通用寄存器,,硬布線邏輯控制為主,,適合采用流水線方式執(zhí)行。RISC可以優(yōu)化編譯,,有效支持高級語言,。 4.研發(fā)周期: CISC的研制周期長。 RISC硬件簡單,,因而它的制造工藝簡單且成本低廉,。 |
|