arm vs AArch64 vs amd64 vs x86_64 vs x86:有什么區(qū)別?
當你查看數(shù)據(jù)表或軟件下載頁面時是否被 ARM
、AArch64
、x86_64
、i386
等術語混淆?這些被稱為 CPU 架構,我會幫你深入了解這個計算話題。
以下的表將為你總結每個字符串所代表的意義:
CPU 架構 | 描述 |
| 64 位 AMD/英特爾 CPU 的別稱 |
| 64 位 ARM CPU 的別稱 |
| 32 位 AMD/英特爾 CPU |
| 32 位 ARM CPU 的別稱 |
| 64 位 RISC-V CPU 的別稱 |
| 64 位 PowerPC CPU,小端字節(jié)序存儲 |
從左到右是使用該術語來描述 CPU 架構超過其右側其他可選用術語的偏好。
從左到右是使用該術語描述 CPU 架構的優(yōu)先級,使用左側的而不是其右側的其他可供選擇的術語。
如果你像我一樣是個極客,并想要更深入地解釋,請繼續(xù)閱讀!
概述:CPU 架構
通常來說,我之前列出的術語是描述 CPU 架構的。但嚴格講,它們被計算機工程師視為 CPU 的 指令集架構Instruction Set Architecture(ISA)。
CPU 的指令集架構定義了 CPU 如何解析二進制代碼中的 1 和 0。
這些 CPU 的 ISA 有幾個主要的類別:
- x86(AMD/英特爾)
- ARM
- RISC-V
- PowerPC(IBM 仍在使用)
當然,還有更多種類的 CPU ISA,比如 MIPS、SPARC、DEC Alpha 等等。但我列出的這些至今仍然被廣泛使用(以某種形式)。
上述列出的 ISA 主要根據(jù) 內(nèi)存總線的寬度
?? 32 位的 CPU ISA 要么是已經(jīng)過時的歷史產(chǎn)物,被留下來要么只是為了支持舊的系統(tǒng),要么只運用在微控制器中??梢哉f,所有新的硬件都已經(jīng)是 64 位的了,特別是那些面向消費者的硬件。
x86(AMD/英特爾)
x86 CPU 的指令集架構主要源于英特爾,因為英特爾是最初搭配 8085 微處理器創(chuàng)建了它。8085 微處理器的內(nèi)存總線寬度為 16 位。而后來,AMD 加入了這個領域,并且一直緊隨英特爾的步伐,直到 AMD 創(chuàng)建出了自己的超集 64 位架構,超過了英特爾。
x86 架構的子集如下:
i386
:如果你擁有的是 2007 年之前的 CPU,那么這可能就是你的 CPU 架構。它是現(xiàn)在使用的 AMD/英特爾的 x86 架構的 32 位“版本”。x86_64
/x86
/amd64
:這三個術語在不同的項目中可能會被交替使用。 但它們都是指 x86 AMD/英特爾架構的 64 位“版本”。無論如何,x86_64
這個字符串比x86
和amd64
使用得更廣泛(也更受歡迎)。例如,F(xiàn)reeBSD 項目稱 64 位的 x86 架構為amd64
,而 Linux 和 macOS 則稱之為x86_64
。
?? 由于 AMD 在創(chuàng)造 64 位 ISA 上超越了英特爾,所以一些項目(比如 FreeBSD)把 x86 的 64 位版本稱為
amd64
。但更被廣泛接受的術語還是 x86_64。
對于 CPU ISA,“x86” 這個字符串是一種特殊的情況。你要知道,在從 32 位的 x86(i386
)到 64 位的 x86(x86_64
)的過渡過程中,CPU 制造商確保了 CPU 能夠運行 32 位 和 64 位指令。所以,有時你可能會看到 x86
也被用來意指“這款產(chǎn)品只能運行在 64 位的計算機上,但如果該計算機能運行 32 位指令,那么你也可以在它上面運行 32 位的用戶軟件”。
這種 x86 的模糊性——也就是諸如能同時運行 32 位代碼的 64 位處理器——其主要用于和存在于運行在 64 位處理器上的,但是允許用戶運行 32 位軟件的操作系統(tǒng),Windows 就通過這種被稱作“兼容模式”的特性運用了這種方式。
匯總一下,由 AMD 和 英特爾 設計的 CPU 有兩種架構:32 位的(i386
)和 64 位的(x86_84
)。
其它的英特爾
x86_64
ISA 實際上有幾個子集。這些子集都是 64 位,但它們新添加了諸如 SIMD(單指令多數(shù)據(jù)Single Instruction Multiple Data)指令等功能。
x86_64-v1
:這是大多數(shù)人都熟知的基礎x86_64
ISA。當人們談論x86_64
時,他們通常指的就是x86_64-v1
ISA。x86_64-v2
:此版本新增了更多如 SSE3(流式 SIMD 擴展版本 3Streaming SIMD Extensions 3)之類的指令擴展。x86_64-v3
:除了基礎指令外,還新增了像 AVX(高級矢量擴展Advance Vector eXtensions)和 AVX2 等指令。這些指令可以使用高達 256 位寬的 CPU 寄存器!如果你能夠有效利用它們,就能大規(guī)模并行處理計算任務。x86_64-v4
:這個版本在x86_64-v3
ISA 的基礎上,迭代了更多的 SIMD 指令擴展,比如 AVX256 和 AVX512。其中,AVX512 可以使用高達 512 位寬的 CPU 寄存器!
ARM
ARM 不僅是一家為 CPU ISA 制定規(guī)范的公司,它也設計并授權給其他廠商使用其 CPU 內(nèi)核,甚至允許其他公司使用 ARM CPU ISA 設計自己的 CPU 內(nèi)核。(最后那句話聽起來就像是個 SQL 查詢似的!)
你可能因為如樹莓派這類的 單板計算機Single Board Computer)(SBC)聽說過 ARM。但其實 ARM 的 CPU 還廣泛應用于手機中。最近,蘋果從使用 x86_64
處理器轉向了在其筆記本和臺式機產(chǎn)品中使用自家設計的 ARM 處理器。
就像任一種 CPU 架構一樣,ARM 基于內(nèi)存總線寬度也有兩個子集。
官方認定的 32 位和 64 位 ARM 架構的名稱分別是 AArch32
和 AArch64
。這里的 AArch
字符串代表 “Arm 架構Arm Architecture”。這些是 CPU 執(zhí)行指令時可切換的模式。
實際符合 ARM 的 CPU ISA 的指令規(guī)范被命名為 ARMvX
,其中 X
是規(guī)范版本的代表數(shù)字。目前為止,已經(jīng)有九個主要的規(guī)范版本。規(guī)范 ARMv1
到 ARMv7
定義了適用于 32 位 CPU 的架構,而 ARMv8
和 ARMv9
是適用于 64 位 ARM CPU 的規(guī)范。(更多信息在此)
?? 每個 ARM CPU 規(guī)范又有進一步的子規(guī)范。例如 ARMv8,我們有 ARMv8-R、ARMv8-A、ARMv8.1-A、ARMv8.2-A、ARMv8.3-A、ARMv8.4-A、ARMv8.5-A、ARMv8.6-A、ARMv8.7-A、ARMv8.8-A 和 ARMv8.9-A。 其中 -A 表示“應用核心”,-R 表示“實時核心”。
你可能會覺得困惑,為什么在 AArch64
正式被 ARM 認定為 64 位 ARM 架構后,有些人仍然稱其為 arm64
。原因主要有兩點:
arm64
這個名稱在 ARM 決定采用AArch64
之前就已經(jīng)廣為人知了。(ARM 的一些官方文檔也將 64 位的 ARM 架構稱為arm64
…… ??)- Linus Torvalds 對 AArch64 因此,Linux 的代碼庫主要將
AArch64
稱為arm64
。然而,當你在系統(tǒng)中運行uname -m
時,輸出仍然是aarch64
。
因此,對于 32 位 ARM CPU,你應該尋找 AArch32
這個字符串,但有時也可能是 arm
或 armv7
。相似的,對于 64 位 ARM CPU,你應該找 AArch64
這個字符串,但有時也可能會是 arm64
、ARMv8
或 ARMv9
。
RISC-V
RISC-V 是 CPU 指令集架構(ISA)的一個開源規(guī)范。**但這并不意味著 CPU 自身是開源的!**這有點像以太網(wǎng)的情況。以太網(wǎng)規(guī)范是開源的,但你需付費購買網(wǎng)線、路由器和交換器。同樣,RISC-V CPU 也要花錢購買。 ??
盡管如此,這并沒有阻止人們創(chuàng)建并在開源許可下提供免費獲?。?strong>設計上的獲取,并非物理核心/SoC)的 RISC-V 核心。這是其中的一項嘗試。
?? 總結一下:如果你在尋找運行于 RISC-V 消費級 CPU 上的軟件,你應該尋找 “rv64gc” 這一字符串。這是許多 Linux 發(fā)行版所公認的。
像所有 CPU 架構一樣,RISC-V 擁有 32 位和 64 位 CPU 架構。但由于 RISC-V 是非常新的描述 CPU ISA 的方式,大部分主流消費端或客戶端的 CPU 核心一般都是 64 位的。大部分 32 位的設計都是微控制器,用于非常具體的用例。
它們的區(qū)別在于 CPU 的擴展。被稱為 RISC-V CPU 的最低要求即實現(xiàn)“基本整數(shù)指令集Base Integer Instruction Set”(rv64i
)。
下表列出了一些擴展及其描述:
擴展名稱 | 描述 |
| 64 位基本整數(shù)指令集(必須的) |
| 乘法和除法指令 |
| 原子指令 |
| 單精度浮點指令 |
| 雙精度浮點指令 |
| 別名;一組運行通用操作系統(tǒng)所需的擴展集(包括 |
| 壓縮指令 |
在 rv64i
這一字符串中,rv
表示 RISC-V,64
指的是 64 位 CPU 架構,而 i
指的是強制性的基本整數(shù)指令集擴展。 rv64i
之所以是一體的,因為即使 i
被認為是一種“擴展”,但它是必須的。
約定俗成的,擴展名稱按上述特定順序排列。因此,rv64g
展開為 rv64imafd
,而不是 rv64adfim
。
?? 還有其他一些像 Zicsr 和 Zifencei 這樣的擴展,它們位于
d
和g
擴展之間,但我故意不列出,以避免令你感到害怕。因此,嚴格說來,(在寫這篇文章的時候)
rv64g
實際上是rv64imafdZicsrZifencei
。惡魔般的笑聲
PowerPC
PowerPC 曾是蘋果、IBM 以及,摩托羅拉早期合作時代的一種流行 CPU 架構。在蘋果轉向英特爾的 x86 架構之前,它一直被應用于蘋果的全部消費品產(chǎn)品線。
最初,PowerPC 采取的是大端字節(jié)序的內(nèi)存排序。后來隨著 64 位架構的引入,增加了使用小端字節(jié)排序的選項。這么做的目的是為了與英特爾的內(nèi)存排序保持兼容(以防止軟件錯誤),因為英特爾自始至終都一直采用的是小端字節(jié)序。有關字節(jié)序的更多內(nèi)容,我可以嘮叨很久,不過你可以通過閱讀 這篇 Mozilla 的文檔 來了解更多。
由于字節(jié)序在此也起到了一定的作用,PowerPC 共有三種架構:
powerpc
:表示 32 位的 PowerPC 架構。ppc64
:表示擁有大端字節(jié)序內(nèi)存排序的 64 位 PowerPC 架構。ppc64le
:表示擁有小端字節(jié)序內(nèi)存排序的 64 位 PowerPC 架構。
目前,ppc64le
是被廣泛使用的架構。
結論
市面上有各種各樣的 CPU 架構。對于每一種架構,都有 32 位和 64 位的子集。在現(xiàn)有的 CPU 中,我們可以找到 x86、ARM、RISC-V 和 PowerPC 等架構。
其中,x86 是最廣泛和易于獲取的 CPU 架構,因為英特爾和 AMD 都采取了這種架構。此外,ARM 提供的產(chǎn)品幾乎在手機和易于獲取的單板計算機中被獨占使用。
RISC-V 正在努力使硬件更廣泛地被使用。我就有一款帶有 RISC-V CPU 的單板計算機。 ??
而 PowerPC 主要用于服務器,至少當前如此。