|
指令集是CPU體系架構(gòu)的重要組成部分。C語言的語法是對(duì)解決現(xiàn)實(shí)問題的運(yùn)算和流程的方法的高度概況和抽象,其主要為算術(shù)、邏輯運(yùn)算和分支控制,而指令集就是對(duì)這些抽象的具體支持,匯編只不過是為了讓開發(fā)人員更好地記住指令,但它跟CPU所認(rèn)的機(jī)器碼其實(shí)是一一對(duì)應(yīng)的,因此匯編也是低級(jí)語言。
CPU的指令執(zhí)行一般包括取指、譯碼和執(zhí)行,這是經(jīng)典的三級(jí)指令執(zhí)行流水線,教科書上往往以這三種過程來描述,arm7也是。但是現(xiàn)代的CPU設(shè)計(jì)往往使用更廣泛使用的5級(jí)流水線,也就是分為取指、譯碼、執(zhí)行、訪存和回寫。為什么要分為5級(jí)?這是由流水線的各個(gè)階段的時(shí)間來決定的。我們可以考慮現(xiàn)實(shí)生活的工廠的流水線。
假設(shè)某流水線只有 三個(gè)工序,有三個(gè)工人A、B、C,則這條生產(chǎn)線的效率就取決于效率最低的那個(gè)工人的效率,F(xiàn)假設(shè)B做完其負(fù)責(zé)的工序需要10秒,而A和C完成只需要5秒,總共要完成4個(gè)產(chǎn)品。那總時(shí)間應(yīng)該是:5+10*4+5 = 50秒,(第一個(gè)5是A先做第一道工序的時(shí)間,這時(shí)B和C都得等,而最后一個(gè)5是C必須要等B全部完成后才能開始)即會(huì)出現(xiàn)C在等待,而B一直在忙死忙活的場(chǎng)景。
當(dāng)然,無論怎樣,流水線的執(zhí)行總比完成沒有流水好,就好比A、B、C負(fù)責(zé)的工作都由一個(gè)人去做,那做完一個(gè)得20秒。全部做完得20*4 = 80秒。
最理性的場(chǎng)景就是三個(gè)人做事的效率是一樣的,那就不會(huì)出現(xiàn)等待的情況。那現(xiàn)在確實(shí)遇到B工作效率最低的問題,怎么解決呢?就是將B的工作重新分解,平均分成兩個(gè)工序,也就是B1和B2,分別都是5秒完成,那完成的總時(shí)間是40秒。
CPU指令的三級(jí)流水執(zhí)行正是遇到各步驟流水時(shí)間不均的問題,也就是取指和譯碼往往比較快,而執(zhí)行包括運(yùn)算和訪問寄存器、內(nèi)存或者回寫等功能,因此執(zhí)行的時(shí)間一般比取指和譯碼要長(zhǎng),取指和譯碼可以在單時(shí)鐘周期內(nèi)完成,但執(zhí)行需要2到3個(gè)時(shí)鐘周期才能完成。要想得到更高的流水效率,就需要將執(zhí)行部分分解為執(zhí)行(運(yùn)算等)、訪存(內(nèi)存)和回寫(寄存器)。
CPU指令的流水線執(zhí)行對(duì)于軟件開發(fā)人員來說,最重要的就是要知道當(dāng)前PC(程序計(jì)數(shù)寄存器)的值與當(dāng)前執(zhí)行指令的關(guān)系。取指指的是CPU根據(jù)當(dāng)前PC的值內(nèi)存的對(duì)應(yīng)地址去取指令,因此PC值永遠(yuǎn)都指的都是當(dāng)前取指令步驟的地址,而譯碼則是CPU的一部分電路根據(jù)取出來的指令機(jī)器碼進(jìn)行譯碼,選擇對(duì)應(yīng)的電路來執(zhí)行這條執(zhí)行,如選擇加法電路還是減法電路,還是邏輯與電路等等;執(zhí)行就是這個(gè)電路的執(zhí)行過程了。
arm7的流水線示意圖是:
從圖可以看到在T1時(shí)刻,CPU的執(zhí)行電路執(zhí)行的是MOV指令,而取指電路取的是SUB指令,因此當(dāng)前執(zhí)行電路的MOV對(duì)應(yīng)的運(yùn)行地址應(yīng)該是當(dāng)前PC值減8. 如果當(dāng)前運(yùn)行的指令是一個(gè)函數(shù)調(diào)用(即BL指令),但返回地址就應(yīng)該是ADD指令所在的地址,即(PC減4)。
有人問到流水線斷流的問題,補(bǔ)充說明一下,斷流主要有以下情況:
1)數(shù)據(jù)相關(guān)。如第二條指令需要的數(shù)據(jù)正好是第一條指令執(zhí)行的結(jié)果。這時(shí)第二條必須等待。
2)分支跳轉(zhuǎn)。指令分支判斷之后,可能會(huì)順序執(zhí)行,也可能跳轉(zhuǎn)到其他地方,這時(shí)也會(huì)引起流水線的斷流。
|
|