我(作者)開始寫這東西基本上是由于太閑。發(fā)這篇文是由于,一來(lái)本身就是想科普,二來(lái)發(fā)現(xiàn)到很多人對(duì)isa,cpu架構(gòu)的誤解。
先說(shuō)明關(guān)于本文的幾點(diǎn):
1. 既然是科普向,那不是專門寫給專業(yè)人員看的,專業(yè)人員都喜歡看那些非常嚴(yán)肅,定義嚴(yán)謹(jǐn)?shù)慕炭茣冶救耸且粋€(gè)不大喜歡教科書式教育的人,所以這篇也不會(huì)是那種各種專業(yè)詞語(yǔ)亂飛的文章。但是我沒(méi)有在國(guó)內(nèi)學(xué)習(xí)過(guò)cpu架構(gòu),所以有些名字我的確不喜歡或者不知道中文翻譯,會(huì)用英語(yǔ)原文。盡量不用這種文縐縐的語(yǔ)氣,多點(diǎn)用調(diào)侃或者比較非正式的話語(yǔ)。
2. 在這邊的公司面試的時(shí)候,我遇到過(guò)一個(gè)比較有趣的問(wèn)題是:
你要設(shè)計(jì)cpu,你怎么向你奶奶解釋你現(xiàn)在的工作。
首先,我奶奶已經(jīng)去世了,也沒(méi)辦法向她解釋。其實(shí),這是一個(gè)非常有趣的問(wèn)題,為什么面試的時(shí)候回經(jīng)常問(wèn)?因?yàn)閏pu設(shè)計(jì)行業(yè)里面,很多專業(yè)的知識(shí),別說(shuō)一般市民,即使是公司里面的其他員工,隨時(shí)是跨領(lǐng)域的對(duì)話,所以,必須會(huì)用比較簡(jiǎn)單的例子來(lái)解釋復(fù)雜的問(wèn)題。
我當(dāng)時(shí)回答是用廚房煮菜的過(guò)程來(lái)解釋cpu的流水線,這篇文當(dāng)然也會(huì)常常用到類似的比喻,不是因?yàn)槲蚁矚g做菜或者我是吃貨,是因?yàn)槲耶?dāng)時(shí)只想到廚房。
3. 一篇全是文字的科普向文章是非常非常沉悶的,為了讓讀者不睡著,我會(huì)偶爾講冷笑話,如果太冷了,本人水平有限,望包含!下面開始:
什么是ISA?
ISA, Instruction Set Architecture. 中文就是,指令,集合,架構(gòu)。在計(jì)算機(jī)里面,什么是ISA呢?就是xx定義的一個(gè)指令集,這里的xx可以指任何東西。比如你只會(huì)做加法,你就定義一個(gè)叫假發(fā)ISA,這個(gè)指令集只做加法,這也是一個(gè)isa。
任何一個(gè)ISA對(duì)于另外一個(gè)isa都沒(méi)有根本意義上的“先進(jìn)”,ISA之間的對(duì)比是非常復(fù)雜的。你只會(huì)做加法,我只會(huì)做乘法,你說(shuō)我們誰(shuí)先進(jìn)?我見得比較多的是爭(zhēng)吵x86 ISA比ARM ISA先進(jìn)的,我往往一臉懵逼,好像他們比我懂,我是不是不應(yīng)該插一腿進(jìn)去...
x86 ISA現(xiàn)在是Intel和AMD共同擁有,也就是說(shuō)如果你要開新的x86 cpu公司你必須向這兩者付版權(quán)費(fèi)用,而且必須兩者都同意你才能獲得完整的ISA,如果你只獲得一部分不完整的ISA,那就和完全沒(méi)拿到ISA一樣(編者:我突然想到最近AMD給國(guó)內(nèi)X86授權(quán),按照作者的意思,是不是國(guó)內(nèi)拿到的X86授權(quán)是不完整的?因?yàn)楦杏X(jué)Intel沒(méi)同意)。
ISA在cpu里面,就像是字典,用廚房的比喻就是菜譜,菜譜定義了你這個(gè)廚房會(huì)做什么菜,這個(gè)菜做出來(lái)是什么樣什么味道,那么顧客在這家連鎖店的任何一間都能叫到相同的菜,吃到相同的味道。
ARM ISA當(dāng)然是ARM公司所有的,當(dāng)時(shí)ARM公司是定菜單的,并且給出試菜的人,說(shuō)你們每家店都要做出這個(gè)味才算ARM。而做店的則是不同的公司,像Qualcomn啦,他們中間喜歡怎么做菜是他們的自由,但是必須會(huì)那幾道菜,必須做出這個(gè)味。
各家的菜單都一樣,所以顧客不需要知道是誰(shuí)做的菜,只要是這個(gè)菜單,做出來(lái)肯定一個(gè)味。因?yàn)?a href="http://www.zgszdi.cn/v/tag/527/" target="_blank">操作系統(tǒng)根本不需要知道你cpu是怎么設(shè)計(jì)的,操作系統(tǒng)只要知道,我需要運(yùn)行這些指令,你知道怎么運(yùn)行就行了,每個(gè)不同牌子的cpu,只要你運(yùn)行出來(lái)結(jié)果都一樣,就行了。
如果isa定義1+1=9,那么這個(gè)是定義下來(lái)的,所有人都這樣錯(cuò),就沒(méi)錯(cuò)。如果isa定義了1+1=9,你要糾正他,我的cpu是1+1=2,那么你做出來(lái)的cpu雖然數(shù)學(xué)上正確,但是所有軟件,系統(tǒng),就突然不知道怎么辦了。你說(shuō)這么愚蠢的錯(cuò)誤cpu不可能犯是吧?
自行百度一下蘋果75-37.5 bug(雖然不一定是cpu或者isa上的錯(cuò)誤,也許是軟件上的)
然后又有人說(shuō)ISA是鐵定下來(lái)的,x86的良好生態(tài)環(huán)境是因?yàn)樗腎SA一直有l(wèi)egacy支持。legacy直接翻譯就是遺產(chǎn)。x86的legacy支持的意思就是,世界上第一個(gè)x86 cpu支持的東西,今年你發(fā)明的x86 cpu也支持,以后的也要支持。
的確從某個(gè)角度上來(lái)說(shuō),農(nóng)企和Intel都非常努力的去支持很多已經(jīng)沒(méi)什么人的東西,就是餐館里菜譜里面有些菜基本上你都不會(huì)去試的。你說(shuō)你都不用了,農(nóng)企Intel還在那里浪費(fèi)設(shè)計(jì)是吧?你不用不代表沒(méi)人用啊,X國(guó)很多軍用的設(shè)備還是Windows95啊,甚至還是服役中的Windows3.1啊,銀行的atm還有用Windows98的。別問(wèn)我為什么他們要那樣,如果他們肯花錢找些軟件工程師重新寫那些程序,就可以用最新的東西,很多沒(méi)有注釋,現(xiàn)在沒(méi)有人學(xué)的語(yǔ)言,或者算法詭異的程序,很多軍事設(shè)備還在用啊。
原因大概是:這種語(yǔ)言連學(xué)都沒(méi)人學(xué),我自己都看不懂,我看你怎么破解我的坦克系統(tǒng)!
但是實(shí)際上x86又不是完全100%的legacy支持,至少ISA上面沒(méi)有這樣定義,農(nóng)企和Intel也沒(méi)有官方明文定義。
x86里面有一個(gè)指令叫cpuid,系統(tǒng)/編譯器運(yùn)行它的時(shí)候,它會(huì)給出一些數(shù)據(jù),就是告訴系統(tǒng)/編譯器,這個(gè)cpu支持什么東西,這個(gè)cpu有些什么新東西之類的。所以,理論上可以設(shè)計(jì)一個(gè)cpu,不支持那些非常少用的指令,以降低cpu的設(shè)計(jì)復(fù)雜程度,也更省電省事。(對(duì)不起,你想吃的這個(gè)菜,我們不賣了,你找另外一家試試)
CPU架構(gòu)
這個(gè)主題,如果你有編程經(jīng)驗(yàn),食用效果更佳。
下面這段純屬個(gè)人經(jīng)歷,無(wú)關(guān)主題,可跳過(guò)。
如果你有編程經(jīng)驗(yàn),你有沒(méi)有想過(guò),你寫的代碼是怎么運(yùn)行的?
我當(dāng)初就是由于這個(gè)原因而對(duì)cpu感興趣然后不知不覺(jué)進(jìn)了這一行。
我是這樣的一個(gè)人,我看到輪子轉(zhuǎn),我就想知道輪子是怎么轉(zhuǎn)的,我就想拆開馬達(dá),拆開電線,然后學(xué)物理,學(xué)磁感線,然后知道是什么讓輪子轉(zhuǎn)。
后來(lái)由于各種原因我有緣接觸匯編,cpu架構(gòu)之后,對(duì)比起編程,我對(duì)cpu的運(yùn)行原理非常興趣,我是興趣使動(dòng)的,然后就花時(shí)間去研究了。其實(shí)UIUC對(duì)于半導(dǎo)體,EE那邊的研究更多更有趣,但是那邊的教授的所有課讓我對(duì)computer architecture的有濃厚興趣。
我學(xué)習(xí)過(guò)程是這樣的,怎么寫c->c怎么編譯會(huì)匯編語(yǔ)言->匯編語(yǔ)言怎么在cpu里面運(yùn)行->cpu的組成->transistor的原理->半導(dǎo)體的電子學(xué)應(yīng)用->半導(dǎo)體的工業(yè)使用。
在學(xué)習(xí)半導(dǎo)體的時(shí)候,對(duì)各種光學(xué)半導(dǎo)體也曾經(jīng)非常感興趣,沒(méi)有繼續(xù)學(xué)下去的原因是,設(shè)備太貴了,里面的數(shù)學(xué)太難了(對(duì),說(shuō)的就是數(shù)學(xué),很多方程都沒(méi)有解答方法,很多是以前的數(shù)學(xué)家通過(guò)直接觀察式子,然后試答案試出來(lái)的,所以很多differential equation要單純靠記憶,我對(duì)背書非常非常不在行,如果有哪一天有數(shù)學(xué)家發(fā)現(xiàn)了可以怎么算,我學(xué)了算法也許還能去學(xué)一點(diǎn))!
后來(lái)就去研究cpu怎么才能提高效率。
回歸正題,代碼是怎樣運(yùn)行的呢?
給純來(lái)看科普的讀者的廚房比喻,你要組織一個(gè)宴會(huì),然后你說(shuō)了要弄些什么,你就是軟件。然后有個(gè)人,專門根據(jù)你你要求,弄成一份菜單,他就是編譯器。然后把這份菜單給廚房,基本上就是:讀菜單拿食材(instruction fetch),切菜(decode),煮菜(execute),上盤出餐(load store and writeback)。然后前面就一讀菜單,后面就一直工作。
給有一點(diǎn)編程知識(shí)的讀者:舉個(gè)例子,c:
int func(){
...
int a = 1;
a = a +3;
...
}
這段編譯后,大概就是
sub sp, 4 ; stack point increase變量都在函數(shù)棧里留一個(gè)位置,因?yàn)槭莍nt所以留4
mov ebx, 1 ; ebx用來(lái)存1,就是你定義 a了,a=1
; mov [sp], ebx ;有時(shí)候如果需要,就把ebx是值存到剛剛預(yù)留的棧里
; mov ebx, [sp] ;需要用的時(shí)候再讀出來(lái),不是必然會(huì)發(fā)生的,但是這兩步可能發(fā)生
add ebx, 3 ; ebx = ebx+3, 當(dāng)然你可以用其他register
...
你不需要讀得懂,因?yàn)槲沂执虻模址昼婂e(cuò)給你看。
然后這些東西,就會(huì)跑到內(nèi)存,沒(méi)錯(cuò),你運(yùn)行軟件的時(shí)候,代碼是先去到內(nèi)存,如果想了解他們?cè)趺磸挠脖P跑到內(nèi)存,這是另外一個(gè)主題,我這里先不討論,然后緩存又會(huì)把這些代碼讀取,緩存就已經(jīng)在SoC里面的,cpu在從緩存里面讀取,別問(wèn)為什么這么麻煩讀這么多次,都是為了省錢和稍微加快速度。
由于是舉例子,我就隨便亂說(shuō)個(gè)decode。這個(gè)是Intel公布的manual,問(wèn)我為什么不用本家農(nóng)企是吧?因?yàn)槲夷玫睫r(nóng)企那個(gè)不是對(duì)外公布的,公布版我還要上網(wǎng)找。
Opcode Instruction Op/ En 64-bit Mode Compat/ Leg Mode D
05 id ADD EAX, imm32 I Valid Valid Add imm32 to EAX.
在cacheline里面看起來(lái)大概是這樣的 0x05__02___00000003
里面的_代表其他位不詳細(xì)講的,大概這個(gè)翻譯成機(jī)械碼就是 要做05(ADD加法)在02(ebx實(shí)際上我印象中ebx是02,然而eax是00,不是01,這些編碼亂七八糟的,Intel決定的,別問(wèn)我)后面的00000003就是32為imm32,就是 add, ebx 03
cpu讀了這條cacheline叫instruction fetch,然后下一步就是把它decode,解釋成add, ebx 03,再下一步就是把運(yùn)行(execute,沒(méi)錯(cuò),這么麻煩之后,最后終于要算了),把算得的結(jié)果存到ebx上,然后再看看需不需要存回去cacheline或者內(nèi)存里面(load/store writeback)。這個(gè)就是cpu的基本運(yùn)行原理。
CPU pipeline
有時(shí)候會(huì)聽到cpu流水線,如果按照上面的做法,沒(méi)一個(gè)指令都要通過(guò)這幾部來(lái)預(yù)算,那么只有一部分電子器件在用的時(shí)候,其他部分都在發(fā)呆浪費(fèi)電。就像是,廚房里面,從取菜到上盤全部都一個(gè)人做,肯定要累死那個(gè)人,但是你炒菜的時(shí)候,是不是想,如果有人已經(jīng)幫你切好菜,我就一直炒菜好了,這樣我們廚房工作效率就高了,cpu也是這樣。
上圖是一個(gè)經(jīng)典的cpu運(yùn)行流水線。
換成廚房理論,就是,一個(gè)人專門去食材,一個(gè)人專門切菜,一個(gè)人專門炒菜,一個(gè)人專門上盤,一個(gè)人專門給客人下單上菜,是不是現(xiàn)代化很多呢!
然而這樣不能滿足我們cpu的工程師,我們還有branch prediction,什么叫branch prediction呢?程序黎里面最耗時(shí)間的一個(gè)就是branch,就像c里面的if,你得到答案之前不知道是繼續(xù)往下走還是進(jìn)去if里面的括號(hào)。就像下單的小哥,那些猶豫不決而改菜單的人最討厭了。
于是cpu里面有了這個(gè)東西,他是怎么用的呢。下單的小哥也不是笨蛋,顧客a來(lái)了100多次了,有80次都改單把豬肉改成雞肉,那么他下單時(shí)候,小哥就先說(shuō)了,改雞肉,如果顧客a覺(jué)得還是豬肉吧,就再抄,如果顧客a真的改單,那么廚房以及開始做了,而且有80%的幾率啊,小哥還是挺聰明的吧。
cpu也大概是這樣,根據(jù)每個(gè)loop的地址(顧客)來(lái)訓(xùn)練出一個(gè)未卜先知的系統(tǒng)。
上圖里面還有OOO(out of order),x86里面,real mode可以用的general register只有8個(gè),eax,ebx,之類的,64位之后增加了8個(gè)。流水線工作,如果
mov eax,1;
add eax,1;
sub eax,2;
你們發(fā)現(xiàn)問(wèn)題了沒(méi),eax用了再用,但是流水線做add的時(shí)候,eax是1,sub在等add retire之前,是不能做的,那么你就不得不等。
那么流水線的效率就體現(xiàn)不出來(lái)了。因?yàn)檫@里有一個(gè)write after write 的dependency,就是同一個(gè)register,你兩個(gè)pipeline stage要用同一個(gè)register,而且x86在傳統(tǒng)模式只有8個(gè)register,eax,ebx等等,64位模式增加了一些。所以這中情況是非常常見的。為了解決這個(gè)問(wèn)題,就有了out of order execute, in order commit。就是不按順序來(lái)運(yùn)行指令,但是按順序完成指令。
用廚房理論解釋就是,有這么一道菜(或者說(shuō)兩道菜),雞要先煮了然后炸,你煮熟雞之前不能炸,否則炸了再煮,口感就不同了,顧客肯定罵死你,但是后面又有其他菜在等,鍋你是有的,所以在煮雞的時(shí)候,你先做后面的菜,然后雞煮好了,再炸。出餐的時(shí)候,你還是先出了這道雞肉再出后的菜,那樣顧客就不會(huì)投訴出餐的順序不按菜單了。
大概就說(shuō)這么一通吧,也不知道有沒(méi)有解釋清楚,我中文越來(lái)越差了,說(shuō)話都咬舌頭,而且我說(shuō)方言版本的粵語(yǔ)比較多,普通話有時(shí)候也說(shuō)不準(zhǔn)確了Orz(求別噴,用得少就說(shuō)不好了)。
里面夾雜了一些英文,因?yàn)槲铱戳酥形牡姆g,我覺(jué)得那樣翻譯不好,也不準(zhǔn)確,但是我又不想自己想個(gè)新詞來(lái)誤導(dǎo)讀者,只好用英文了。如果有讀者對(duì)某些題目有特別的興趣,我再想想什么時(shí)候有空再寫點(diǎn)什么吧。
-
cpu
+關(guān)注
關(guān)注
68文章
10902瀏覽量
213001 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6892瀏覽量
123742 -
ISA
+關(guān)注
關(guān)注
0文章
55瀏覽量
43788
原文標(biāo)題:老奶奶都能看懂的CPU技術(shù)科普
文章出處:【微信號(hào):EngicoolArabic,微信公眾號(hào):電子工程技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
LoRa技術(shù)科普
LoRa技術(shù)科普
STM32CubeMX是啥?
上汽通用前瞻技術(shù)科研中心實(shí)驗(yàn)室初體驗(yàn)
IC運(yùn)營(yíng)工程技術(shù)科普
技術(shù)科普:什么是SRv6?
京東方首檔自制技術(shù)科普綜藝《BOE解憂實(shí)驗(yàn)室》燃情上線
天河區(qū)科技活動(dòng)周啟動(dòng)!機(jī)智云致力助推物聯(lián)網(wǎng)技術(shù)科普及創(chuàng)新應(yīng)用
![天河區(qū)科技活動(dòng)周啟動(dòng)!機(jī)智云致力助推物聯(lián)網(wǎng)<b class='flag-5'>技術(shù)科普</b>及創(chuàng)新應(yīng)用](https://file1.elecfans.com/web2/M00/89/FB/wKgaomSNgJGAbOkdAACHf9IKveo974.png)
經(jīng)緯恒潤(rùn)再次受邀亮相一汽零部件新技術(shù)科技展
![經(jīng)緯恒潤(rùn)再次受邀亮相一汽零部件新<b class='flag-5'>技術(shù)科</b>技展](https://file1.elecfans.com/web2/M00/8F/4E/wKgZomTMZ_yAJBGXAAOlRpOXqlo471.png)
經(jīng)緯恒潤(rùn)再次受邀亮相一汽零部件新技術(shù)科技展
![經(jīng)緯恒潤(rùn)再次受邀亮相一汽零部件新<b class='flag-5'>技術(shù)科</b>技展](https://file.elecfans.com/web2/M00/43/70/pYYBAGJ9-2eAAapGAAAqR-wyG1A368.jpg)
MEMS技術(shù)科普文章
![MEMS<b class='flag-5'>技術(shù)科普</b>文章](https://file1.elecfans.com/web2/M00/90/95/wKgaomTbGJyALSw7AABs0iqIAa0577.png)
先進(jìn)封裝技術(shù)科普
![先進(jìn)封裝<b class='flag-5'>技術(shù)科普</b>](https://file.elecfans.com/web2/M00/43/36/poYBAGJ82TeAPsAHAAA_r6nG8nE277.jpg)
評(píng)論