天天看點

CPU關于x86、x86_64x64、amd64和arm64以及aarch64的差別ARM,AMD,X86,AArch64的概念

為什麼叫x86和x86_64和amd64?

為什麼大家叫x86為32為系統?

為什麼軟體版本會注明for amd64版本,不是intel64呢?

**

CPU類型

x86

X64(CISC)

ARM(Acorn RISC Machine)

m68000,m68k(moto)

Power(IBM)

Power(apple,ibm,moto)

UItrasparc(Sun)

Alpha(HP)

安騰(compaq)**

伺服器分類

按照CPU體系架構來區分,伺服器主要分為兩類:

非x86伺服器:使用RISC(精簡指令)或EPIC(并行指令代碼)處理器,并且主要采用UNIX和其它專用作業系統的伺服器,指令系統相對簡單,它隻要求硬體執行很有限且最常用的那部分指令,cpu主要有Compaq的Alpha、HP的PA-RISC、IBM的Power PC、MIPS的MIPS和SUN的Sparc、Intel研發的EPIC安騰處理器等。這種伺服器價格昂貴,體系封閉,但是穩定性好,性能強,主要用在金融、電信等大型企業的核心系統。

x86伺服器:又稱CISC(複雜指令集)架構伺服器,即通常所講的PC伺服器,它是基于PC機體系結構,使用intel或其他相容x86指令集的處理器晶片的伺服器。目前主要為Intel的Xeon E3,E5,E7系列,價格相對便宜、相容性好、穩定性較差、安全性不算太高。

裝置名稱	DESKTOP-OSQH7RQ
處理器	12th Gen Intel(R) Core(TM) i7-12700   2.10 GHz
機帶 RAM	16.0 GB (15.3 GB 可用)
系統類型	64 位作業系統, 基于 x64 的處理器


           

對比

[root@master kubernetes]# docker version
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:22 2018
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.0
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.4
  Git commit:       4d60db4
  Built:            Wed Nov  7 00:19:08 2018
  OS/Arch:          linux/amd64
  Experimental:     false
           

x86是指intel的開發的一種32位指令集,從386開始時代開始的,一直沿用至今,是一種cisc指令集,所有intel早期的cpu, amd早期的cpu都支援這種指令集,intel官方文檔裡面稱為“IA-32"

x84_64是x86 CPU開始邁向64位的時候,有2選擇:

1、向下相容x86。

2、完全重新設計指令集,不相容x86。

AMD搶跑了,比Intel率先制造出了商用的相容x86的CPU,AMD稱之為AMD64,搶了64位PC的第一桶金,得到了使用者的認同。

Intel選擇了設計一種不相容×86的全新64為指令集,稱之為IA-64(這玩意似乎就是安騰),但是比amd晚了一步,而且A-64也挺慘淡的,因為是全新設計的CPU,沒有編譯器,也不支援windows(微軟把intel給忽悠了,承諾了會出安騰版windows server版,但是遲遲拿不出東西)。後來不得不在時機落後的情況下也開始支援AMD64的指令集,但是換了個名字,叫x86_64,表示是x86指令集的64擴充,大概是不願意承認這玩意是AMD設計出來的。

實際上,x86_64.x64,AMD64基本上是同一個東西,我們現在用的intel/amd的桌面級CPU基本上都是x86_64,與之相對的arm.ppc等都不是x86_64。

x86、x86_64主要的差別就是32位和64位的問題, x86中隻有8個32位通用寄存器, eax,ebx,ecx,edx, ebp,esp, esi, edi。

x86_64把這8個通用寄存器擴充成了64位的,并且比x86增加了若幹個寄存器(好像增加了8個,變成了總共16個通用寄存器)。同樣的MMX的寄存器的位數和數量也進行了擴充。此外cpu擴充到64位後也能支援更多的記憶體了,等等許多好處。

對于普通程式來說,CPU位數的擴充、寄存器數量的增加不會帶來明顯的性能提升,比如E浏覽器、Office辦公這類的軟體。特定的程式很能夠充分利用64位CPU、更多的寄存器帶來的優勢,比如MMX除了能提升多媒體程式的性能,對矩陣、多項式、向量計算都能帶來提升,更多的MMX寄存器、更大的寄存器字長都有利于SIMD指令的執行,能夠提升CPU對資料的吞吐量(RISC指令集的CPU動不動就有數百個寄存器,可以有效的緩存中間計算結果,不需要把中間結果寫入記憶體,進而減少記憶體通路次數,顯著提升性能)

x86

X86架構(The x86 architecture)是微處理器執行的計算機語言指令集,指一個intel通用計算機系列的标準編号縮寫,也辨別一套通用的計算機指令集合。

1978年6月8日,Intel釋出了新款16位微處理器“8086”,也同時開創了一個新時代: x86架構誕生了。

在40年的發展史中,x86家族不斷壯大,從桌面轉戰筆記本、伺服器、超級計算機、編寫裝置,期間還挫敗或者限制了很多競争對手的發展,讓不少處理器廠商及其架構技術成為曆史名字,即使有些封閉發展的也難以為繼,比如蘋果就已經放棄PowerPC了。

AMD64/×86-64

x86-64有時會簡稱為“×64”,是64位微處理器架構及其相應指令集的一種,也是Intel x86架構的延伸産品。

"x86-64”1999由AMD設計,AMD首次公開64位集以擴充給IA-32,稱為x86-64(後來改名為 AMD64)。AMD64架構在IA-32上新增了64位寄存器,并相容早期的16位和32位軟體,可使現有以x86為對象的編譯器容易轉為AMD64版本。

*由于AMD64和ntel64基本上一緻,很多軟硬體産品都使用一種不傾向任何一方的詞彙來表明它們對兩種架構的同時相容。出于這個目的,AMD對這種CPU架構的原始稱呼-“x86-64”被不時地使用,還有變體“x86_64”。其他公司如微軟和Sun在營銷資料中使用“x64”作為對“x86-64”的縮寫。 *

許多作業系統及産品,尤其那些是在lntel進入這塊市場之前就引入“×86-64”支援的,使用“AMD64”或“amd64”同時指代AMD64和lntel64。

現在的x86 CPU在位數上有32/64bit之分,在ARCH上有又x86/x86_64/x64/i386/IA32/IA64/amd64

最近又新出來一個x32,還好不是ARCH,隻是ABI,沒有那麼混亂。

先說一下x86的這些arch,不要求很嚴格的話,基本上可以用下面的公式來表達:

x86=i386=IA32

amd64=x86_64=x64!=IA64

其實這兩個等式裡很多都是别名,嚴格說的話, x86的世界裡隻存在x86/x86_64/IA64三種架構。

當年AMD先于Intel推出向下相容的amd64 CPU,而Intel推出的不相容32位系統的IA64慘淡收場(被MS放了鴿子),後來Intel在指令上支援了amd64,不過不願意叫amd64,改了個名字x86_64。

再說64bit/32bit的相容性問題:

現在的64bit CPU實際上都做了相容32bit的特殊設計,是以64bit的CPU上運作32bit的軟體(包括kernel/app,driver除外)是沒有問題。反過

來,32bit的CPU上運作64bit的軟體是不可以的。

最後說重點,64bit相比32bit的性能優勢:

這裡不考慮64bit硬體上運作32bit軟體的這種過度方式。

從架構上來說,64bit擁有64bit 的register和64bit的bus,在資料傳輸效率上比32bit要高不少;另外,64bit位址總線的尋址空間突破了4G的限制。

是以,對于大記憶體,密集資料運算的應用場景,64bit的優勢是非常明顯的。網上有一些benchmark,這裡不貼了。

但是,對于小記憶體系統, 64bit的CPU在某些狀況下可能比32bit CPU的效率更低。

因為64 bit的CPU的位址是64位的,指針是64位的,編譯生成的二進制檔案更大,運作時占用的記憶體更多;另一方面,因為64位位址的問題, cache中能存放的指令就更少,是以更容易導緻cache的miss.

是以在某些應用場景,64 bitCPU的更大的尋址空間,更快的資料傳遞,更快的浮點運算的特性,與其64 bit的位址/指針所導緻的cache miss的特性,始終并存。

為了充分利用64的優勢,又避免64bit位址導緻的cache miss的問題,Intel提出了x32ABI的概念。

x32不是一個ARCH,是一個ABI。

x32可以充分的使用64 bit硬體的64 bit寄存器,64bit總線,以及64bit新增的指令,進而獲得更快的資料處理速度。

同時x32又使用32bit的位址/pointer,32bit的C資料類型,是以cache miss并不會增加。

x32是一個ABI,其設計到的部分包括: kerne的support,toolchain的support,system lib的support。現在kernel(from 3.4)和toolchain的support都已經OK。

ARM,AMD,X86,AArch64的概念

AMD,中文名(超威)超微半導體,是除了英特爾以外最大的x86架構微處理供應商,也是除了英偉達以外僅有的獨立圖形處理供應商。

x86泛指一系列由英特爾公司開發的處理器的架構,最早為1978年面世的“ntel 8086” CPU。早期的處理器均是以此格式來命名,如intel8086、80186、80286、80386、80486,這些架構被統稱為x86。由于數字不能被注冊成為商标,是以公司每當有新的處理器使用,均會采用可注冊的名稱,如Pentium。

基于x86的32位架構(常被稱為i386,x86) , IA-32,而基于x86的64位架構,x86-64常稱為AMD64或Intel64。最早是由AMD公司首先根據x86的架構生産出了64位的處理器,但是由于是競争關系,Intel公司不願意承認AMD64,近些年才推出了Intel64

ARM(英文為Advanced RISC Machine,或Acorn RISC Machine)也是一個架構,非常适用于移動通信這種低成本,高性能,低耗電的領域。ARM的公司為安謀控股(ARM Holding plc),又稱為ARM公司,總部位于劍橋的設計與軟體公司,現在已被日本的軟銀公司收購,後者同時也是國内網際網路巨頭阿裡巴巴的最大股東。

AArch64是ARMv8的一種執行狀态。

為了更廣泛地向企業領域推進,需要引入64位構架,同時也需要在ARMv8架構中引入新的AArch64執行狀态。

AArch64不是一個單純的32位ARM構架擴充,而是ARMv8内全新的構架,完全使用全新的A64指令集。這些都源自于多年對現代構架設計的深入研究。更重要的是, AArch64作為一個分離出的執行狀态,意味着一些未來的處理器可能不支援舊的 AArch32執行狀态。

雖然最初的64位ARM處理器将會完全向後相容,但我們大膽且前瞻性地将AArch64作為在ARM8處理器中唯一的執行狀态。我們在這些系統中将不支援32位執行狀态,這将使許多有益的實作得到權衡,如預設情況下,使用一個較大的64K大小的頁面,并會使得純淨的64位ARM伺服器系統不受遺留代碼的影響。立即進行這種劃分是很重要的,因為有可能在未來幾年内将出現僅支援64位的伺服器系統。沒有必要在新的64位架構中去實作一個完整的32位流水線,這将會提高未來 ARM伺服器系統的能效。

這樣回想起來, AArch64作為在Fedora ARM項目中被支援的ARM構架是一個很自然的過程: armv5tel、armv7hl、aarch64。新的架構被命名為: aarch64,這同ARM自己選擇的主線命名方式保持一緻,同時也考慮到了ARM架構名與ARM商标分開的期望。

ARMv8-A将64位架構支援引入ARM架構中,其中包括:

64位通用寄存器、SP(堆棧指針)和PC(程式計數器)

64位資料處理和擴充的虛拟尋址

兩種主要執行狀态:

AArch64- 64位執行狀态,包括該狀态的異常模型、記憶體模型、程式員模型和指令集支援

AArch32—32位執行狀态,包括該狀态的異常模型、記憶體模型、程式員模型和指令集支援

這些執行狀态支援三個主要指令集;

A32(或ARM): 32位固定長度指令集,通過不同架構變體增強部分32位架構執行環境現在稱為AArch32。

T32(Thumb)是以16位固定長度指令集的形式引入的,随後在引入Thumb-2技術時增強為16位和32位混合長度指令集。部分32位架構執行環境現在稱為AArch32。

A64:提供與ARM和Thumb 指令集類似功能的32位固定長度指令集。随ARMv8-A一起引入,它是一種AArch64指令集。

ARMISA不斷改進,以滿足前沿應用程式開發人員日益增長的要求,同時保留了必要的向後相容性,以保護軟體開發投資。在 ARMv8-A中,對A32和T32進行了一些增補,以保持與A64指令集一緻。

繼續閱讀