????????指令集是CPU體系架構的重要組成部分。C語言的語法是對解決現實問題的運算和流程的方法的高度概況和抽象,其主要為算術、邏輯運算和分支控制,而指令集就是對這些抽象的詳細支持,匯編僅僅只是是為了讓開發者更好地記住指令,但它跟CPU所認的機器碼事實上是一一相應的,因此匯編也是低級語言。
????????CPU的指令運行一般包含取指、譯碼和運行,這是經典的三級指令運行流水線,教科書上往往以這三種過程來描寫敘述,arm7也是。可是現代的CPU設計往往使用更廣泛使用的5級流水線,也就是分為取指、譯碼、運行、訪存和回寫。為什么要分為5級?這是由流水線的各個階段的時間來決定的。我們能夠考慮現實生活的工廠的流水線。
??????? 如果某流水線僅僅有 三個工序,有三個工人A、B、C,則這條生產線的效率就取決于效率最低的那個工人的效率。現如果B做完其負責的工序須要10秒,而A和C完畢僅僅須要5秒,總共要完畢4個產品。那總時間應該是:5+10*4+5 = 50秒,(第一個5是A先做第一道工序的時間,這時B和C都得等,而最后一個5是C必須要等B所有完畢后才干開始)即會出現C在等待,而B一直在忙死忙活的場景。 ?
??????? 當然,不管如何,流水線的運行總比完畢沒有流水好,就好比A、B、C負責的工作都由一個人去做,那做完一個得20秒。所有做完得20*4 = 80秒。
??????? 最理性的場景就是三個人做事的效率是一樣的,那就不會出現等待的情況。那如今確實遇到B工作效率最低的問題,怎么解決呢?就是將B的工作又一次分解,平均分成兩個工序,也就是B1和B2,分別都是5秒完畢,那完畢的總時間是40秒。
???????? CPU指令的三級流水運行正是遇到各步驟流水時間不均的問題,也就是取指和譯碼往往比較快,而運行包含運算和訪問寄存器、內存或者回寫等功能,因此運行的時間一般比取指和譯碼要長,取指和譯碼能夠在單時鐘周期內完畢,但運行須要2到3個時鐘周期才干完畢。要想得到更高的流水效率,就須要將運行部分分解為運行(運算等)、訪存(內存)和回寫(寄存器)。
?????????CPU指令的流水線運行對于軟件開發者來說,最重要的就是要知道當前PC(程序計數寄存器)的值與當前運行指令的關系。取指指的是CPU依據當前PC的值內存的相應地址去取指令,因此PC值永遠都指的都是當前取指令步驟的地址,而譯碼則是CPU的一部分電路依據取出來的指令機器碼進行譯碼,選擇相應的電路來運行這條運行,如選擇加法電路還是減法電路,還是邏輯與電路等等;運行就是這個電路的運行過程了。
???????? arm7的流水線示意圖是:
?
????????????? 從圖能夠看到在T1時刻,CPU的運行電路運行的是MOV指令,而取指電路取的是SUB指令,因此當前運行電路的MOV相應的運行地址應該是當前PC值減8. 假設當前運行的指令是一個函數調用(即BL指令),但返回地址就應該是ADD指令所在的地址,即(PC減4)。
?
????????有人問到流水線斷流的問題,補充說明一下,斷流主要有下面情況:
??????? 1)數據相關。如第二條指令須要的數據正好是第一條指令運行的結果。這時第二條必須等待。
????????2)分支跳轉。指令分支推斷之后,可能會順序運行,也可能跳轉到其它地方,這時也會引起流水線的斷流。
?
?
?
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
