1, 簡(jiǎn)介
中央處理器(Central Processing Unit,簡(jiǎn)稱CPU)是一塊由超大規(guī)模的集成電路組成的運(yùn)算和控制核心,主要功能是運(yùn)行指令和處理數(shù)據(jù)?,F(xiàn)在CPU一般都比較小,基本上只有指甲蓋般大小。CPU從誕生到現(xiàn)在主要在兩個(gè)維度上做了很大的提升,一個(gè)是材料及工藝,另一個(gè)是設(shè)計(jì)思想。
我們先看第一個(gè)維度:材料及工藝。你可曾想過(guò)人類歷史上第一個(gè)計(jì)算機(jī)(主要就是CPU)有多大?據(jù)資料了解其大小為24.4米×2.4米,重達(dá)28噸,功耗為170kW,但是運(yùn)算速度僅為每秒5000次的加法運(yùn)算。人類第一個(gè)CPU之所以體積這么大,功耗這么高,是因?yàn)樗褂昧?7840支電子管。隨著1947年貝爾實(shí)驗(yàn)室的肖克利等人發(fā)明了鍺晶體管(又叫做三極管),人們可以用體積小、功耗低、開(kāi)關(guān)速度快的晶體管替換體積大、功耗高、開(kāi)關(guān)慢的電子管。晶體管是20世紀(jì)的一項(xiàng)重大發(fā)明,為集成電路的誕生做了堅(jiān)實(shí)的鋪墊。
隨著20世紀(jì)中后期,半導(dǎo)體制造技術(shù)進(jìn)步,使得集成電路成為可能。相對(duì)于使用各種分立電子組件組裝電路,集成電路可以把很大數(shù)量的微晶體管集成到一個(gè)小芯片上,這是一個(gè)巨大的進(jìn)步。第一個(gè)集成電路是在1958年由杰克·基爾比完成的,它包括一個(gè)雙極性晶體管,三個(gè)電阻和一個(gè)電容器。1959年,仙童公司首先推出了采用光刻技術(shù)的平面型晶體管(如二極管、三極管、電阻和電容),而后1961年推出了平面型集成電路。理論上只要光刻工藝不斷提升,元器件的密度也會(huì)相應(yīng)地提升。1965年時(shí)任仙童半導(dǎo)體實(shí)驗(yàn)室主任的摩爾提出了摩爾定律:集成電路可容納的元器件數(shù)量,每18~24個(gè)月翻一番。
再看第二個(gè)維度:設(shè)計(jì)思想。其實(shí),在第一個(gè)計(jì)算機(jī)誕生的時(shí)候,雖然采取了最先進(jìn)的電子技術(shù),但缺少設(shè)計(jì)思想上的指導(dǎo),導(dǎo)致很多邏輯都是硬化在電路板上的。這會(huì)造成一旦修改程序,就要重新組裝電路板,這樣的編程效率很低。這時(shí)馮·諾依曼提出了一個(gè)至關(guān)重要的設(shè)計(jì)思路:計(jì)算機(jī)的邏輯結(jié)構(gòu),將軟硬件分離,要求CPU順序地從存儲(chǔ)器中取出指令和數(shù)據(jù)進(jìn)行相應(yīng)的計(jì)算,主要的思想:
二進(jìn)制:程序、數(shù)據(jù)的最終形態(tài)都是二進(jìn)制編碼、存儲(chǔ)在存儲(chǔ)器中,二進(jìn)制編碼也是CPU能夠識(shí)別、執(zhí)行的編碼;
指令、數(shù)據(jù)可存儲(chǔ):指令序列和數(shù)據(jù)存在主(內(nèi))存儲(chǔ)器中,以便于CPU在工作時(shí)能夠高速地從存儲(chǔ)器中提取指令并加以分析和執(zhí)行;
計(jì)算機(jī)組成:確定了計(jì)算機(jī)的五個(gè)基本組成部分,運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備、輸出設(shè)備;
馮·諾依曼的結(jié)構(gòu)框圖如下:
其實(shí),馮·諾依曼體系結(jié)構(gòu)也存在一些問(wèn)題,但是人們并沒(méi)有完全拋棄這種體系結(jié)構(gòu),而是在這一系列問(wèn)題上做了改進(jìn):
指令、數(shù)據(jù)公用內(nèi)存:指令和數(shù)據(jù)都存儲(chǔ)在一個(gè)存儲(chǔ)器上,并且通過(guò)一個(gè)系統(tǒng)總線進(jìn)行訪問(wèn)。 當(dāng)前主存的讀寫(xiě)速度是跟不上cpu運(yùn)行速度的,所以為了解決這個(gè)問(wèn)題,在cpu和主存增加了高速緩存,并且在L1高速緩存上,還區(qū)分了指令緩存和數(shù)據(jù)緩存,并進(jìn)一步提升系統(tǒng)總線的訪問(wèn)速度。 另外,為了解決指令和數(shù)據(jù)共用系統(tǒng)總線帶來(lái)的速度慢的問(wèn)題,又提出了哈佛架構(gòu),將指令和數(shù)據(jù)分別存放在不同的主存上,可以并行訪問(wèn),這提高了運(yùn)行速度,但是結(jié)構(gòu)復(fù)雜,不適合外部主存的擴(kuò)展,所以哈佛結(jié)構(gòu)并未得到廣泛應(yīng)用;
指令順序指令:指令只能順序,在一個(gè)pipe上運(yùn)行。 為了提升指令運(yùn)行速度增加了,亂序執(zhí)行、多級(jí)流水線、分支預(yù)測(cè)等功能;
在馮·諾依曼體系結(jié)構(gòu)設(shè)計(jì)思想指導(dǎo)下,并伴隨著芯片在摩爾定律下的制作工藝提升,現(xiàn)在的CPU越來(lái)越強(qiáng)大,在功能、算力不斷提升的同時(shí),功耗、面積也在不停的減少。 得益于芯片技術(shù)的發(fā)展,我們現(xiàn)在不僅有更輕便,容易攜帶的筆記本,還有各種方便攜帶的嵌入式產(chǎn)品使用,比如:智能手機(jī)、智能手表、藍(lán)牙耳機(jī)等。 可以預(yù)見(jiàn),隨著技術(shù)的發(fā)展,后面將會(huì)有更豐富的產(chǎn)品出現(xiàn),這無(wú)不彰顯了科學(xué)技術(shù)就是第一生產(chǎn)力。 接下來(lái),我們重點(diǎn)關(guān)注當(dāng)代CPU的工作原理,通過(guò)對(duì)CPU工作原理的了解,為工作中更好地進(jìn)行功能開(kāi)發(fā)、性能優(yōu)化、功耗優(yōu)化做鋪墊。
2, 框架
為了講述的方便,上面畫(huà)了CPU+主存的框架。這基本上是現(xiàn)在復(fù)雜CPU的主流做法,CPU內(nèi)部包含控制器、運(yùn)算器、寄存器,使用虛擬地址,經(jīng)過(guò)MMU可以轉(zhuǎn)化成物理地址。其中MMU里面有一個(gè)頁(yè)表高速緩存表(Table Lookup Buffer,簡(jiǎn)稱TLB)和頁(yè)表遍歷單元(Table Walk Unit,簡(jiǎn)稱TWU),當(dāng)TLB緩存著要訪問(wèn)的虛擬地址到物理地址的轉(zhuǎn)換關(guān)系的時(shí)候,就可以直接找到的物理地址,通過(guò)該物理地址在L1 cache中查找數(shù)據(jù)。如果TLB中沒(méi)有緩存要訪問(wèn)虛擬地址對(duì)應(yīng)的物理地址,這時(shí)會(huì)通過(guò)TWU模塊遍歷主存中的頁(yè)面,查找相應(yīng)的物理地址,找到后再通過(guò)這個(gè)物理地址訪問(wèn)L1cache。如果L1 cache中存在著要訪問(wèn)的物理地址對(duì)應(yīng)的內(nèi)容,直接返回給相應(yīng)的寄存器。如果L1 cache中沒(méi)找到相應(yīng)的數(shù)據(jù),就依次從L2、L3 cache中查找,如果在所有層級(jí)的cache中都沒(méi)查找到有效的數(shù)據(jù),就會(huì)直接訪問(wèn)主存取出物理地址對(duì)應(yīng)的數(shù)據(jù)分別給到寄存器和L1 cache。
其中實(shí)線部分是命中TLB及cache的數(shù)據(jù)訪問(wèn)方式,虛線部分是沒(méi)有命中TLB及cache,通過(guò)TWU和頁(yè)表訪問(wèn)主存獲取數(shù)據(jù)的方式。這個(gè)框架相對(duì)于馮·諾依曼體系結(jié)構(gòu)多了MMU及cache,這兩個(gè)單元主要是為了解決兩個(gè)問(wèn)題,一個(gè)是地址空間保護(hù)、內(nèi)存使用效率低的問(wèn)題,另一個(gè)是馮·諾依曼體系結(jié)構(gòu)訪問(wèn)指令、數(shù)據(jù)共用存儲(chǔ)器慢的問(wèn)題。接下來(lái),我們分別看看各個(gè)模塊的功能。
2.1 中央處理器核心
CPU CORE是一種根據(jù)指令進(jìn)行各種處理的電子電路。一般由控制器、運(yùn)算器、寄存器組成。后面會(huì)專門(mén)寫(xiě)篇文章,詳細(xì)分析一款ARM核的微架構(gòu)。接下來(lái),我們分別看一下各模塊的功能。
1) 控制器
控制器又稱為控制單元(Control Unit,簡(jiǎn)稱CU),是計(jì)算機(jī)的指揮中心,只有在它的控制下,整個(gè)CPU才能夠有條不紊地工作、自動(dòng)執(zhí)行程序。CU包括指令寄存器、指令計(jì)數(shù)器,其中指令寄存器存放當(dāng)前正在執(zhí)行的指令,指令計(jì)數(shù)器總是指向下一條要執(zhí)行指令的地址。CU的工作流程為:從內(nèi)存中取指令、翻譯指令、分析指令。然后根據(jù)指令的含義,向有關(guān)部件發(fā)送控制命令,控制相關(guān)部件執(zhí)行指令所包含的操作。具體的依次指令執(zhí)行過(guò)程如下:CU通過(guò)指令計(jì)數(shù)器獲取下一條將要執(zhí)行指令的地址,通過(guò)該地址獲取具體的指令存放在指令寄存器,然后對(duì)該指令解碼,如果是一個(gè)add(加法指令),會(huì)通過(guò)將寄存器中的值加載到運(yùn)算器,其中寄存器中的值是從cache或者主存中獲取的,經(jīng)過(guò)運(yùn)算器的運(yùn)算產(chǎn)生進(jìn)位、溢出等信號(hào)反饋給控制器,產(chǎn)生的結(jié)果也存放在寄存器中。
2) 運(yùn)算器
運(yùn)算器是一個(gè)負(fù)責(zé)算術(shù)運(yùn)算和邏輯運(yùn)算的模塊,主要包含算術(shù)邏輯單元(Arithmetic Logic Unit,簡(jiǎn)稱ALU)和浮點(diǎn)運(yùn)算單元(Floating Point Unit,簡(jiǎn)稱FPU)。 ALU的主要功能:在控制信號(hào)的作用下,完成加、減、乘、除等算術(shù)運(yùn)算,以及與、或、非、異或等邏輯運(yùn)算以及移位、補(bǔ)位等運(yùn)算。 通常ALU由兩個(gè)輸入端和一個(gè)輸出端(兩個(gè)值輸入,一個(gè)結(jié)果輸出)。 FPU主要負(fù)責(zé)浮點(diǎn)運(yùn)算和高精度整數(shù)運(yùn)算。 有些FPU還具有向量運(yùn)算的功能,另外一些則有專門(mén)的向量處理單元。
運(yùn)算器是用與、或、非邏輯門(mén)電路搭建起來(lái)的,比如,帶進(jìn)位的二進(jìn)制加法電路:
運(yùn)算器主要的處理對(duì)象是數(shù)據(jù),所以數(shù)據(jù)的長(zhǎng)度以及數(shù)據(jù)的表示方法,對(duì)運(yùn)算器的影響很大。大多數(shù)通用CPU是以16、32、64位數(shù)據(jù)作為運(yùn)算器一次處理數(shù)據(jù)的長(zhǎng)度。能夠一次性對(duì)一個(gè)數(shù)據(jù)的所有位,同時(shí)處理的運(yùn)算器稱為并行運(yùn)算器,一次只能對(duì)數(shù)據(jù)的一個(gè)位處理的運(yùn)算器稱為串行運(yùn)算器。我們通常所說(shuō)的“CPU是幾位的”就是指ALU一次所能處理的數(shù)據(jù)的位數(shù)。
運(yùn)算器與其他部分的關(guān)系:計(jì)算機(jī)運(yùn)算時(shí),運(yùn)算器的操作對(duì)象和操作種類由控制器決定。運(yùn)算器操作的數(shù)據(jù)從cache或內(nèi)存中讀取,處理的結(jié)果再寫(xiě)入內(nèi)存(或者暫時(shí)存放在內(nèi)部寄存器中),而且運(yùn)算器對(duì)內(nèi)存數(shù)據(jù)的讀寫(xiě)是由控制器來(lái)進(jìn)行的。
3) 寄存器
寄存器的主要功能是存儲(chǔ)數(shù)據(jù)、地址及指令,并且能夠高速、自動(dòng)地完成數(shù)據(jù)的存儲(chǔ)。寄存器是有記憶功能的器件,而且采用兩種穩(wěn)定狀態(tài)0或1來(lái)記錄數(shù)據(jù)信息,所以CPU中的程序和數(shù)據(jù)都要轉(zhuǎn)換為二進(jìn)制才可以存儲(chǔ)和操作。寄存器也是由與、或、非邏輯門(mén)電路組成的,下面就展示1bit的存儲(chǔ),32個(gè)bit就是32個(gè)重復(fù)的1bit電路。
其中D為寄存器中一個(gè)bit要改變成值的輸入,B為當(dāng)前寄存器的一個(gè)bit。當(dāng)WE(Write Enable)為0時(shí),B保持不變,不受D的變化影響。當(dāng)WE為1時(shí),這時(shí)候D為0時(shí),B為0,并將該值存到電路中,當(dāng)D為1時(shí),B為1,并將該值存到電路中。
2.2 MMU
內(nèi)存映射單元(Memory Map Unit,簡(jiǎn)稱MMU),指的是將虛擬地址轉(zhuǎn)化成物理地址的模塊。MMU包含了兩個(gè)模塊:頁(yè)表查找表(Table Lookup Buffer,簡(jiǎn)稱TLB)和頁(yè)表遍歷單元(Table Walk Unit,簡(jiǎn)稱TWU)。TLB是一個(gè)高速緩存,用于緩存頁(yè)表轉(zhuǎn)換的結(jié)果,從而減少頁(yè)表查詢的時(shí)間。一個(gè)完整的頁(yè)表翻譯和查找的過(guò)程叫做頁(yè)表查詢,頁(yè)表查詢是通過(guò)硬件模塊TWU自動(dòng)完成的,但是頁(yè)表的維護(hù)需要軟件來(lái)完成,且存放在主存中,因此頁(yè)表查詢是一個(gè)耗時(shí)的過(guò)程。當(dāng)TLB未命中時(shí),MMU才會(huì)通過(guò)TWU查詢頁(yè)表,從而得到翻譯后的物理地址,這個(gè)虛擬地址及物理地址的映射也會(huì)存儲(chǔ)在TLB中。
對(duì)于ARM這樣的處理器,CPU看到的都是虛擬地址,需要經(jīng)過(guò)MMU轉(zhuǎn)化為物理地址,才能訪問(wèn)cache或者內(nèi)存拿到物理地址中的內(nèi)容。你可能會(huì)疑問(wèn),為什么需要虛擬內(nèi)存,直接用物理內(nèi)存不行嗎?是的,不行。為了做進(jìn)程地址空間的隔離及提升內(nèi)存的使用效率,使用虛擬內(nèi)存是很有必要的。后面會(huì)專門(mén)寫(xiě)一篇文章專門(mén)講述MMU。
2.3 緩存
由于CPU與內(nèi)存之間存在很大的速度差(兩者相差上百倍),同時(shí)又因?yàn)槌绦虻募虞d有時(shí)間及空間局部性的特點(diǎn),也就是說(shuō)程序的一個(gè)內(nèi)存位置被訪問(wèn)了,附近的位置很快也會(huì)被訪問(wèn)到。那么我們可以把內(nèi)存中的部分代碼提前加載到訪問(wèn)更快的cache里面。既然cache的主要作用是CPU與主存的緩沖層,那么cache的速度應(yīng)該接近于CPU,基本上是與CPU同頻運(yùn)作。一般緩存都集成在CPU芯片上,L1 cache分為L(zhǎng)1D和L1I cache,L1D、L1I和L2 cache在同一個(gè)cpu上,L3 cache一般是多個(gè)cpu間共享。既然cache的訪問(wèn)速度這么快是不是越大越好,其實(shí)并不是,單拿成本和die的面積來(lái)說(shuō)cache就不能做的太大。后面會(huì)專門(mén)寫(xiě)一篇文章專門(mén)講述cache。
現(xiàn)代計(jì)算機(jī)或嵌入式系統(tǒng)的存儲(chǔ)設(shè)備一般有cache、內(nèi)存、SSD、HDD硬盤(pán)。這些存儲(chǔ)設(shè)備越靠近 CPU 速度越快,容量越小,價(jià)格越貴。
寄存器(Register):寄存器與其說(shuō)是存儲(chǔ)器,其實(shí)更像是 CPU 本身的一部分,只能存放極其有限的信息,但是速度非??欤虲PU同步。
高速緩存(CPU Cache):使用 靜態(tài)隨機(jī)存取存儲(chǔ)器(Static Random-Access Memory,簡(jiǎn)稱SRAM)的芯片。
內(nèi)存(DRAM):使用動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(Dynamic Random Access Memory,簡(jiǎn)稱DRAM)的芯片,比起 SRAM 來(lái)說(shuō),它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少。
硬盤(pán):如固態(tài)硬盤(pán)(Solid-state drive 或 Solid-state disk,簡(jiǎn)稱SSD)、硬盤(pán)(Hard Disk Drive,簡(jiǎn)稱HDD)。
每一種存儲(chǔ)器設(shè)備只和它相鄰的存儲(chǔ)設(shè)備打交道。比如,CPU Cache是從內(nèi)存里加載而來(lái)的,或者需要寫(xiě)回內(nèi)存,并不會(huì)直接寫(xiě)回?cái)?shù)據(jù)到硬盤(pán),也不會(huì)直接從硬盤(pán)加載數(shù)據(jù)到CPU Cache中,而是先加載到內(nèi)存,再?gòu)膬?nèi)存加載到cache中。
可以看出,越是速度快的設(shè)備,容量就越小。這里一共10M的cache,成本只是幾十美元。而 8GB 的內(nèi)存、128G 的 SSD 以及 1T 的 HDD,大概零售價(jià)格加在一起,也就和我們的高速緩存的價(jià)格差不多。
2.4 主存
主存里分別存儲(chǔ)了各種數(shù)據(jù),包括代碼段、數(shù)據(jù)段、字符串、地址等。它的讀寫(xiě)速度相對(duì)寄存器、cache慢了很多,但是單位成本卻低了很多。通過(guò)系統(tǒng)中的存儲(chǔ)金字塔設(shè)計(jì),利用程序的時(shí)間及空間局部性原理,可以很好地利用主存的價(jià)格優(yōu)勢(shì),彌補(bǔ)讀寫(xiě)時(shí)間慢的問(wèn)題。后面會(huì)專門(mén)寫(xiě)一篇文章講解主存。
2.5 總線
雖然從上面的框圖上不能直觀地看到BUS總線的存在,但是地址、數(shù)據(jù)的傳輸都是依賴總線完成的。它就像一條高速公路,快速完成各個(gè)單元間的數(shù)據(jù)交換,也是數(shù)據(jù)從內(nèi)存流進(jìn)和流出CPU的地方。CPU總線(前端總線)傳輸速率決定著CPU與內(nèi)存之間傳輸數(shù)據(jù)的速度快慢。CPU總線速率越高,CPU等待從內(nèi)存取指令和數(shù)據(jù)時(shí)間越少,運(yùn)行程序速度越快??偩€又細(xì)分成數(shù)據(jù)總線、地址總線和控制總線。后面會(huì)專門(mén)寫(xiě)一篇文章講解總線相關(guān)的知識(shí)。
3,CPU的運(yùn)行過(guò)程
3.1 指令集
指令集架構(gòu)(Instruction Set Architecture,簡(jiǎn)稱ISA)是CPU和軟件之間的橋梁。ISA包含指令集、特群集、寄存器、執(zhí)行模式、安全擴(kuò)展、性能加速擴(kuò)展等方面。其中,指令集是ISA的重要組成部分,通常包含一系列不同功能的指令,用于數(shù)據(jù)搬移、計(jì)算、內(nèi)存訪問(wèn)、過(guò)程調(diào)用等。CPU在運(yùn)行操作系統(tǒng)或者應(yīng)用程序的時(shí)候,實(shí)際上是在執(zhí)行它被編譯后所包含的指令。根據(jù)執(zhí)行指令的特征,CPU分為精簡(jiǎn)指令集計(jì)算機(jī)(Reduced Instruction Set Conputer,簡(jiǎn)稱RISC)和復(fù)雜指令集計(jì)算機(jī)(Complex Instruction Set Conputer,簡(jiǎn)稱CISC)。
RISC類CPU的指令功能單純,種類少。相對(duì)地,CISC類CPU指令功能復(fù)雜,種類繁多。RISC指令精簡(jiǎn)的好處是CPU內(nèi)部構(gòu)造可以簡(jiǎn)化,適合高速操作,但是在進(jìn)行相同的操作時(shí),由于每條指令功能單純,所以與CISC相比,RISC需要使用更多的指令數(shù)量。雖然CISC的內(nèi)部構(gòu)造復(fù)雜不適合高速操作,但進(jìn)行相同處理時(shí)指令數(shù)比RISC要少。
RISC架構(gòu)最大的特點(diǎn)是只使用載入和存儲(chǔ)指令訪問(wèn)內(nèi)存,之中架構(gòu)成為載入存儲(chǔ)架構(gòu)。這樣做的好處是可以簡(jiǎn)化指令集和流水線的設(shè)計(jì),在這種架構(gòu)下,運(yùn)算指令只能對(duì)寄存器中的數(shù)據(jù)進(jìn)行操作。RISC和CISC兩種架構(gòu)各有所長(zhǎng),在追求高速運(yùn)行的CPU領(lǐng)域中,RISC被認(rèn)為更具優(yōu)勢(shì)。雖然這些年,Intel和AMD兩家公司的CPU指令集依然是CISC的,但內(nèi)部卻將復(fù)雜指令分解成簡(jiǎn)單指令,使得內(nèi)部像RISC一樣工作。
3.2 CPU一般運(yùn)行過(guò)程
CPU從cache或主存中取出指令,然后放入指令寄存器,控制器對(duì)該指令進(jìn)行譯碼。最終把指令分解成一系列的微操作,然后發(fā)出各種控制命令,執(zhí)行微操作序列,從而完成一條指令的執(zhí)行。指令是CPU規(guī)定執(zhí)行操作的類型和操作數(shù)的基本命令。指令是由一個(gè)字節(jié)或者多個(gè)字節(jié)組成(對(duì)于arm64,指令長(zhǎng)度是4個(gè)字節(jié)),其中包括操作碼字段、一個(gè)或多個(gè)有關(guān)操作數(shù)地址的字段以及一些表征機(jī)器狀態(tài)的狀態(tài)字以及特征碼。有的指令中也直接包含操作數(shù)本身,且用二進(jìn)制序列表示。指令的構(gòu)造如下:
1) 取指
取指令(Instruction Fetch,簡(jiǎn)稱IF)階段是將一條指令從cache或主存中獲取指令到指令寄存器的過(guò)程。CPU中有一個(gè)程序計(jì)數(shù)器(Program Counter,簡(jiǎn)稱PC)寄存器,其中保存著將要執(zhí)行指令的地址。指令讀取是通過(guò)將PC寄存器的值輸出給cache或者內(nèi)存,然后由cache或內(nèi)存返回該值對(duì)應(yīng)地址中的指令。當(dāng)一條指令被取出后,PC中的數(shù)值將根據(jù)指令字長(zhǎng)度自動(dòng)遞增。
2) 譯碼
取出指令后,CPU會(huì)立即進(jìn)入指令譯碼(Instruction Decode,簡(jiǎn)稱ID)階段。在指令譯碼階段,指令譯碼器按照預(yù)定的指令格式,對(duì)取回的指令進(jìn)行拆分和解釋,識(shí)別區(qū)分出不同的指令類別以及各種獲取操作數(shù)的方法。指令有很多種,有進(jìn)行各種運(yùn)算的指令、控制下一條命令的指令、對(duì)內(nèi)存進(jìn)行讀寫(xiě)的命令,還有對(duì)CPU進(jìn)行控制的指令。
3) 執(zhí)行
在取指令和指令譯碼階段之后,接著進(jìn)入執(zhí)行指令(Execute,簡(jiǎn)稱EX)階段。此階段的任務(wù)是完成指令所規(guī)定的各種操作,實(shí)現(xiàn)具體指令的功能。為此,CPU的不同部分的組件被連接起來(lái),以執(zhí)行所需的操作。例如,執(zhí)行一個(gè)加法運(yùn)算,ALU將會(huì)連接到一組輸入和一組輸出。輸入提供了要進(jìn)行相加運(yùn)算的數(shù)值,而輸出求和后的結(jié)果。如果加法運(yùn)算產(chǎn)生一個(gè)對(duì)該CPU處理而言過(guò)大的結(jié)果,在標(biāo)志暫存器里,運(yùn)算溢出(Arithmetic Overflow,簡(jiǎn)稱AO)標(biāo)志可能會(huì)被設(shè)置。
4) 訪存
根據(jù)指令需要,有可能要訪問(wèn)主存,讀取操作數(shù),這樣就進(jìn)入了訪存取數(shù)的階段。此階段的任務(wù)是:根據(jù)指令中的地址碼,經(jīng)過(guò)MMU將虛擬地址轉(zhuǎn)化成物理地址,根據(jù)物理地址得到操作數(shù)在cache或主存中的地址,并從cache或主存中讀取該操作數(shù)用于運(yùn)算。
5) 寫(xiě)回
結(jié)果寫(xiě)回(Write Back,簡(jiǎn)稱WB)階段一般把執(zhí)行指令階段的運(yùn)行結(jié)果數(shù)據(jù)寫(xiě)回到內(nèi)部寄存器中,以便被后續(xù)的指令快速地存取。在有些情況下,結(jié)果數(shù)據(jù)也可被寫(xiě)入相對(duì)較慢、但較廉價(jià)且容量較大的主存。許多指令還會(huì)改變程序狀態(tài)寄存器中標(biāo)志位的狀態(tài),這些標(biāo)志位標(biāo)識(shí)著不同的操作結(jié)果,可被用來(lái)影響程序的動(dòng)作。在指令執(zhí)行完畢、結(jié)果數(shù)據(jù)寫(xiě)回之后,若無(wú)意外事件(如結(jié)果溢出等)發(fā)生,CPU就接著從程序計(jì)數(shù)器PC中取得下一條指令地址,開(kāi)始新一輪的循環(huán),下一個(gè)指令周期將順序取出下一條指令。
3.3 CPU中斷流程
在正常情況下,CPU 可以順序執(zhí)行,也可以分支執(zhí)行,這些總歸是按照既定順序去執(zhí)行?,F(xiàn)實(shí)中,有時(shí)需要暫時(shí)中斷CPU的當(dāng)前執(zhí)行流,讓CPU去做點(diǎn)其他的工作,再回頭來(lái)繼續(xù)原來(lái)的執(zhí)行流。因此CPU硬件提供了一種中斷機(jī)制,可以先讓CPU停下,等中斷服務(wù)程序執(zhí)行完后,再切回來(lái):
保存PC:保存當(dāng)前的 PC 的值到內(nèi)存的某個(gè)位置
修改PC:修改 PC 的值,讓執(zhí)行其他執(zhí)行流
回原PC:其他執(zhí)行流執(zhí)行結(jié)束之后,通過(guò)將剛才保存的 PC 值恢復(fù)到 PC 寄存器
繼續(xù)原執(zhí)行流:繼續(xù)中斷前的執(zhí)行流
審核編輯:湯梓紅
評(píng)論
查看更多