天天看點

CPU掃盲-CPU與指令集

指令集架構就像是特定的CPU的設計圖紙,它規定了這個CPU需要支援那些指令、寄存器有那些狀态以及輸入輸出模型。根據指令集結構的設計,在CPU上通過硬體電路進行實作,就得到了支援該指令集的CPU。指令集就像是我們程式設計語言中的接口,隻定義規範和标準,不做具體的實作,同一個指令集架構可以有多種不同的實作方式,但隻要是基于同一指令集架構的應用程式可以互相移植。是以我們上層應用隻需要關注CPU的指令集架構即可,具體的CPU實作由廠商去關注。

​ 很多非開發的同學指令集名稱與CPU名稱分不清。這是因為一種 CPU 隻能識别一種指令集,是以很多情況下 CPU 都以其支援的指令集名稱來稱呼,比如當我們要下載下傳軟體時通常關注的就是指令集的名稱x86、ARM等,但是我們在買電腦時廠商備注的卻是酷睿12代、龍芯3C5000、飛騰2000等,是以導緻有的同學會把龍芯、飛騰、酷睿與x86、ARM搞混。這裡的龍芯、飛騰、酷睿指的是CPU的名稱,名字可以有CPU的廠商來取。而x86、ARM則是指令集的名稱,基本都是由國外最早的幾家處理器廠商創造并命名的如:x86是美國Intel公司、ARM是英國的ARM公司。

​ CPU本身隻是在塊矽晶片上所內建的超大規模的內建電路,內建的半導體數量可達到上億個,是由非常先進複雜的制造技術制造出來的,是以CPU的性能不僅僅受指令集的影響,相同的指令集下好的CPU廠商和差的CPU廠商制造出來的CPU性能也是天差地别的,如:蘋果自研的m1晶片,使用的就是ARM指令集,但其性能吊打很多使用ARM指令集的CPU廠商(這個不得不承認)。

​ 相信大家也知道國内很多優秀CPU廠商如:long xin、fei teng、kun peng等,目前隻有老大哥long xin自研了LoongArch指令集。為何其他廠商都選擇走捷徑采用的國外的指令集呢?指令集的創造真的那麼難嗎?雖然創造一套指令集并不容易,但也沒有到望而卻步的程度,真正難的是指令集背後的生态和推廣。就像我自己可以發明一門語言,語言本身沒什麼問題,問題是我用自己發明的語言和别人交流,誰聽得懂呢,誰又願意去學這門語言呢?大家都很忙,不通用的東西沒人願意花精力去學。同一段機器指令010001110(随便寫的),在A指令集下這組機器語言可能表示指派,在B指令集下,這組機器語言可能表示循環,是以相同一段源代碼,在不同指令集的編譯器下,最終呈現的編譯結果是不同的,雖然都是由01組成的二進制數字,但是長短和順序是不同的,是以每個指令集都要有對應的編譯器、彙編器、解釋器(後文暫且統稱編譯器),編譯後的彙編語言和機器語言是不能跨指令集使用的。試想如果要自立門戶創造新的指令集,那有誰願意給它寫編譯器呢?這可不是一個小工程,他要跟着指令集的疊代而疊代,也要自己不斷的優化疊代,需要大量的人力成本和時間成本。即使自己完成了編譯器,要知道每種指令集都有他自己的新特性以及一些特殊指令,不然也沒必要重複造輪子,如果一些軟體使用了ARM或者x86的特殊指令(一些内嵌彙編語言的軟體,如:jvm的模版解釋器就使用了彙編語言),那這些軟體就要自己修改源代碼來适配新的指令集,軟體的開發程式員自然罵娘。是以自研指令集并不難,難的是如何推廣,讓大家用起來。這裡要再吹一下老大哥long xin,long xin釋出LoongArch指令集的同時,完成了針對GCC、LLVM、GoLang三大編譯器的開發,完成了針對Java、JavaScript、.NET三大虛拟機的開發,使作業系統廠商和應用夥伴,可基于long xin的軟體環境,更友善地開發應用。long xin為了能夠更好的适應市場,也為了避免軟體程式員罵娘,投入巨大成本完成ARM和x86指令集的二進制翻譯工作,使運用了ARM和x86特性的軟體也不用修改源碼即可适配,但指令集翻譯本身隻是過渡的手段,為了增加使用者群體,我相信随着long xin的獨立軟體生态逐漸強大,指令集翻譯就會越來越邊緣化,成為錦上添花之舉。long xin的自研指令集也為全面國産化奠定了牢固的基礎,在此也希望國内更多軟體廠商能給與long xin支援,待到中華騰飛日,且讓世界聽龍吟。

​ 至此CPU和指令集的關系已經講解完畢,我們在下載下傳軟體時除了要選擇指令集之外,還要選擇32位還是64位如: * * * .x86_32、 * * *.x86_64,我們已經知道了x86代表的是指令集,那32位和64位是指什麼呢?

​ 這裡32 位和 64 位中的“位”就是bit,也叫字長,是指的是cpu一次能處理的資料的長度(也就是寄存器的位數)。這裡有一個誤區很多人一直認為32位和64位代表的是CPU位址總線引腳的數量,因為談起32位和64位CPU的不同第一個想到的就是尋址空間不同,32位CPU最大可以尋址4GB的記憶體位址,64位CPU尋址範圍可以遠超4GB,而位址總線的數量對應着CPU的尋址能力(由于32位CPU位址總線引腳是32條,每根位址總線的狀态隻能是高電平或低電平,也就是隻能是1或0。 是以32位位址總線一共有232種狀态,每種狀态代表一個記憶體位址,每個記憶體位址為1位元組,是以232種狀态一共可以表示4GB的記憶體位址),是以這個誤區坑騙了很多人。在Intel x86指令集架構下的第一款CPU 80x86中,CPU是16位但位址引線卻是20條,通過将段基址寄存器中段基位址左移4位再加段内偏移位址的方式實作了20位位址尋址,是以說32和64指的并不是位址總線的數量。至于為什麼現在CPU不管是32位的還是64位其位址總線引腳數量都等于其位數,是因為現在不管是資源還是制造技術都遠勝當年,沒必要因為幾根位址總線再去做段基位址左移這種設計上的妥協,不然每次尋址前都要先做一次乘法對CPU的性能還是影響很大的。

繼續閱讀