公眾號(hào):Vehicle攻城獅
作者:Defry
指令集
建設(shè)一棟大樓的基本元素有:水泥、磚頭、鋼材等原材料,但不同的構(gòu)造過程則會(huì)呈現(xiàn)不同的建筑形式,其中建造圖紙起到了很大的指導(dǎo)作用。
同樣, CPU從表象上看雖然形式很多,但基本電路都由晶體管構(gòu)成,例如常見的MOS管。
通過晶體管等基本電子元器件的組合可構(gòu)成基本的邏輯電路:如與門、非門、與非門等。
這些基本邏輯電路通過不同的邏輯組合可分別完成不同的功能,就好比“把大象放進(jìn)冰箱的段子”,首先打開冰箱門-->然后把大象放進(jìn)去-->最后關(guān)上冰箱門。通過這些邏輯組合使動(dòng)作具有了意義,而這些實(shí)現(xiàn)特定功能的邏輯組合集合就是指令集,如基本的加減運(yùn)算。
指令集是一個(gè)標(biāo)準(zhǔn),其會(huì)隨著需求變化不斷添加新的指令或優(yōu)化。同樣,指令集發(fā)生變更后,工程師在設(shè)計(jì)CPU時(shí)也需要在硬件電路上增加對(duì)應(yīng)的電路模塊來支持變更的指令,配套的編譯器也會(huì)隨之升級(jí)。我們?cè)谕?1、STM32等單片機(jī)時(shí)需要相應(yīng)的編譯器來實(shí)現(xiàn)相應(yīng)程序開發(fā)就是這個(gè)道理。而在任何一款遵循同一指令集架構(gòu)實(shí)現(xiàn)的處理器上,開發(fā)的應(yīng)用無須做任何修改便可以運(yùn)行。
指令集與機(jī)器碼的橋梁-編譯器
無論處于上層的應(yīng)用程序多么酷炫吊炸天,其在處理器上執(zhí)行就必須被翻譯成“機(jī)器語言”,然后通過0或1的排列組合去操作硬件實(shí)現(xiàn)功能。翻譯官這個(gè)角色就是編譯器的活,它將軟件與硬件世界連接了起來。編譯器在這個(gè)過程中,要經(jīng)過編譯、匯編、鏈接等幾個(gè)步驟, 最后生成"可執(zhí)行文件",可執(zhí)行文件中保存的是二進(jìn)制機(jī)器碼,這串機(jī)器碼可以直接被CPU讀取和執(zhí)行。
?
上圖表示在指令寄存器中正在執(zhí)行的一段為00101110機(jī)器碼,左四位0010為指令集LOAD_A(匯編代碼,將數(shù)據(jù)放到寄存器A),右四位1110(RAM地址,就是要去取這個(gè)地址上的8bit 機(jī)器碼數(shù)據(jù)放到寄存器A)。注意到0010這4bit數(shù)據(jù)先被放入一個(gè)門電路中,輸出結(jié)果就是1bit(拉高電壓),去控制內(nèi)存讀取這一條wire。這個(gè)圖只突出顯示了開啟內(nèi)存讀取一條wire的原理,沒有顯示在這一步指令中所有門電路原理圖。
為啥根據(jù)指令集設(shè)計(jì)CPU而不是先設(shè)計(jì)CPU再指令集
設(shè)計(jì)一款CPU的過程就好比建房子,我們建房子肯定先要以一定的建設(shè)標(biāo)準(zhǔn)和規(guī)范為前提,依據(jù)一定的工程標(biāo)準(zhǔn)不僅使建設(shè)過程有序進(jìn)行更重要的是最終能被驗(yàn)收和被大家所接受。這也類似于我們軟件開發(fā)流程,必須先有需求再有開發(fā),否則開發(fā)的軟件都沒有應(yīng)用的場(chǎng)景。因此憑空設(shè)計(jì)一款CPU,首先會(huì)不會(huì)被廠商用另說,很多相應(yīng)的配套也難以支持更何談讓軟件開發(fā)人員進(jìn)行開發(fā)和推廣了。所以指令集作為一種標(biāo)準(zhǔn)規(guī)范,用于規(guī)范芯片設(shè)計(jì)工程師及編譯器開發(fā)工程師。
?
因?yàn)樾酒c集成開發(fā)環(huán)境-IDE都遵循相同的指令集標(biāo)準(zhǔn),所以高級(jí)語言編寫的程序經(jīng)指定編譯器編譯后能直接運(yùn)行在對(duì)應(yīng)的CPU上,反之則不能運(yùn)行。
所以,CPU在設(shè)計(jì)之前,就需要先設(shè)計(jì)一套指令集或者說使用現(xiàn)成的指令集(如ARM、X86指令集)并在硬件電路上實(shí)現(xiàn)這些指令。CPU設(shè)計(jì)好后,還需要配套的編譯器,編譯器也需要參考這個(gè)指令集標(biāo)準(zhǔn),將我們編寫的C程序、C++等程序編譯成CPU硬件電路支持的加減乘除、與或非等指令,我們的程序才能在CPU上運(yùn)行。
指令集與微架構(gòu)
微架構(gòu)是將指定指令集在處理器中如何執(zhí)行實(shí)現(xiàn)的方法,同現(xiàn)實(shí)生活中解決相同問題有很多途徑的原理一樣:同一指令集可以有不同的微架構(gòu),因同一指令可以通過不同的電路單元或組合來實(shí)現(xiàn)。例如英特爾基于x86指令集的微架構(gòu)就很多代:
?
再比如ARM M系列處理器基于Armv6-M指令集所構(gòu)建的M0/M1等微架構(gòu):
我們?cè)佑|的STM32F4系列單片機(jī)就是基于Armv7-M指令集的ARM Cortex-M4內(nèi)核:
?
不同的微架構(gòu)有著不同的用途和性能,總體來說一大堆的運(yùn)算單元、邏輯單元、寄存器等在各種總線和控制線的連接下組成了CPU的微架構(gòu)。因此處理器架構(gòu)是微架構(gòu)和指令集架構(gòu)的結(jié)合,指令集是處理器的語言,而微架構(gòu)是具體的實(shí)現(xiàn)。
指令集分類
目前市面上存在兩種指令集類型:
1、Reduced Instruction Set Computing (RISC) 精簡(jiǎn)指令集:比如ARM、MIPS和大火的RISC-V等。
2、Complex Instruction Set Computing (CISC) 復(fù)雜指令集:比如Intel、AMD的X86等。
其中x86架構(gòu)主要占據(jù)傳統(tǒng)PC市場(chǎng),善于處理大數(shù)據(jù);ARM占據(jù)移動(dòng)市場(chǎng),善于處理快數(shù)據(jù);而RISC-V則依靠自己精簡(jiǎn)的優(yōu)勢(shì)在數(shù)據(jù)傳輸領(lǐng)域占據(jù)優(yōu)勢(shì)。除此之外,其他指令集架構(gòu)也占據(jù)部分市場(chǎng)如MIPS、Power等。
?
無論是CISC還是RISC,除了努力鞏固自己的性能優(yōu)勢(shì),加強(qiáng)產(chǎn)品的性能外,還需要汲取雙方產(chǎn)品的特色,取長(zhǎng)補(bǔ)短,期望有所突破,例如英特爾逐漸開始擁抱RISC-V。不過無論如何,未來的CPU肯定在朝著高性能、低功耗的方向發(fā)展。誰能在低功耗下提供高性能,誰就有希望獲得成功。
參考文獻(xiàn):CSDN、知乎、英特爾、ARM等