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