x86 架構的簡單介紹
一、目前常見的 CPU 架構
目前主流的 CPU 架構主要分為兩個陣營:以 x86 為核心的複雜指令集架構(CISC),以及以 ARM 和 RISC-V 為代表的精簡指令集架構(RISC)。其中,x86 架構長期以來主導着桌面和服務器市場,代表廠商包括 Intel 與 AMD,其特點是指令集複雜、兼容性強、單核性能高,適合處理需要強大通用計算能力的場景。而 ARM 架構和新興的 RISC-V 架構則以低功耗、高能效比、架構簡潔為主要優勢,廣泛應用於移動終端、物聯網及嵌入式設備領域。ARM 生態成熟、授權模式靈活;RISC-V 則憑藉開源、可定製、免授權費等特性迅速崛起,吸引了眾多芯片廠商和研究機構的關注。經過多年的發展,這兩大陣營正在逐步向對方領域靠攏:x86 架構在能耗比和移動端優化方面持續改進,如 Intel 的低功耗系列處理器(Atom、Core Ultra)與 AMD 的高能效設計。ARM 架構則不斷提升高性能計算能力,已推出針對桌面和服務器市場的處理器,例如 Apple M 系列芯片、Ampere Altra、以及 華為鯤鵬(Kunpeng)服務器處理器等。同時,RISC-V 也開始探索高性能通用計算方向,出現瞭如 SiFive Performance 系列和 Alibaba 平頭哥玄鐵等高端內核。
此外還有經典的基於 RSIC 的 MIPS 架構,目前已開始轉向 RISC-V。由 IBM 主導的基於 RISC 的 Power 架構,用於大型機和高性能計算,包括用於桌面電腦的 PowerPC 和用於服務器的 POWER 系列。
| 架構 | 類型 | 代表廠商 | 主要領域 | 優勢 | 劣勢 |
|---|---|---|---|---|---|
| x86 | CISC | Intel、AMD | 桌面、服務器 | 性能強、兼容性好 | 功耗高 |
| ARM | RISC | Apple、華為、高通 | 移動、嵌入式 | 低功耗、生態成熟 | 授權依賴 |
| RISC-V | RISC | SiFive、平頭哥 | 嵌入式、AI、科研 | 開源靈活、潛力大 | 生態未完善 |
| MIPS | RISC | Wave Computing | 網絡設備(舊) | 設計簡潔 | 市場衰退 |
| Power | RISC | IBM | 高性能計算 | 吞吐量強 | 成本高、生態小 |
1.1 x86 架構
x86 是個人計算機歷史上最經典、最成功的 CPU 架構之一。從最早的 8086 到如今的 Core、Ryzen,它經歷了 40 多年的發展,形成了龐大的生態體系。幾乎所有的桌面操作系統(如 Windows、Linux、macOS 的早期版本)都對 x86 有深度優化。
核心特點:
- 複雜指令集(CISC):支持大量指令,功能強大但硬件實現複雜。
- 高性能:得益於超標量、亂序執行、分支預測等技術,單核性能長期領先。
- 功耗高:相比 RISC 架構,功耗與發熱較大,不適合移動端。
- 兼容性強:支持大量指令,功能強大但硬件實現複雜。
x86 的應用領域包括桌面電腦、服務器、數據中心、高性能工作站,並且逐漸朝着高能效的方向演進,比如 Intel Core Ultra、AMD Zen 5。
1.2 ARM 架構
核心特點:
- 精簡指令集計算 (RISC) 架構: 指令集簡單,設計緊湊高效。
- 低功耗和高能效: 這是其最大的優勢,非常適合電池供電的設備。
- 授權模式: ARM公司不生產芯片,而是設計架構和指令集,然後授權給各大芯片製造商進行二次開發和製造。
- 生態:Android、iOS、Linux 等系統都有良好支持。
ARM 的主要應用領域包括智能手機、平板電腦、智能電視、汽車電子、路由器、嵌入式設備等。其正在進軍高性能計算領域。Apple M 系列、華為鯤鵬、Ampere Altra 等產品已進入桌面和服務器市場,挑戰 x86 的地位。
1.3 RISC-V 架構
RISC-V 是一種完全開源的指令集架構,任何公司或個人都可以免費使用和修改。由於其開源的特點,很多想要自主設計芯片的公司基於此研究自己的處理器架構,比如由 RISC-V 轉變為自研架構的龍芯。
核心特點:
- 開源、免費:無專利費,無需授權。
- 精簡指令集
- 可擴展、可定製:適合科研、AI、IoT 等多種場景。
- 生態仍在成長:開發工具、編譯器、操作系統支持正在逐步完善。
- 潛力巨大:中國、歐洲、印度等國家正在積極推動 RISC-V 產業化。
RISC-V 的應用領域包括物聯網、微控制器、嵌入式系統、AI 加速器、高性能通用計算等等,被視為去美化、去授權依賴的關鍵路線之一,未來可能成為全球芯片生態的重要支柱。
二、x86 架構的組成
在介紹 x86 架構前,我們先明確核心前提 —— 指令集的概念。指令集(ISA,Instruction Set Architecture)是處理器架構的基礎核心,它定義了 CPU 能夠識別和執行的代碼規範。所有高級語言編寫的程序,最終都必須通過編譯轉化為機器碼,而這些機器碼正是指令集的具體落地形式。從硬件的角度看,處理器必須根據 ISA 的定義來構建其內部邏輯電路,以確保能正確解析和執行這些指令。指令集具有架構排他性,比如為 ARM 架構編譯的可執行文件,其包含的機器指令無法被 x86 處理器識別和運行。
指令集合彙編的關係。它們非常相關但不完全等同,是抽象與具體的關係。指令集是一個標準和架構。它定義了我們可以有哪些指令以及這些指令的功能是什麼。彙編指令是這種標準和架構的具體文本表示,是給人看的。它是根據指令集的規範,用助記符(比如 MOV, ADD, JMP)寫出來的代碼。每一條彙編指令都直接對應着一條指令集架構中定義的機器指令。當你用匯編器編譯彙編代碼時,它就會把這些助記符(如 ADD)翻譯成指令集規範所對應的二進制操作碼(如 00000011),也就是CPU真正能執行的機器碼。
指令集與微架構的關係。微架構是實現指令集的具體硬件電路。 指令集是目標,微架構是達成這個目標的手段。沒有微架構,指令集只是一紙空文;沒有指令集,微架構就不知道要執行什麼命令。一個指令集可以有多種微架構實現。Intel的Core i7 和 AMD 的 Ryzen 都執行 x86指令集,所以它們可以運行相同的Windows操作系統和軟件。但它們的內部設計(微架構)完全不同:Intel和AMD的緩存結構、流水線深度、分支預測算法、執行單元數量等都各有千秋。這就是為什麼同為x86 CPU,它們的性能和功耗卻不一樣。 在指令集基本不變的情況下,通過改進微架構(比如增加更多的執行單元、更好的分支預測、更大的緩存),可以讓CPU在同一個時鐘週期內處理更多的指令,從而大幅提升性能。
指令集的主要定義:
| 類別 | 説明 | 舉例 |
|---|---|---|
| 指令系統(Instruction Set) | 定義 CPU 能執行的所有操作 | 加法、乘法、跳轉、加載/存儲等 |
| 寄存器集(Registers) | 定義 CPU 內部可直接操作的高速存儲單元 | EAX、RAX(x86);X0–X31(ARM) |
| 數據類型(Data Types) | 支持的數據格式 | 字節、字、雙字、浮點數、向量 |
| 尋址方式(Addressing Modes) | 指定操作數的獲取方式 | 立即數、寄存器間接、基址+偏移 |
| 異常與中斷機制 | 定義錯誤處理、系統調用等機制 | 頁錯誤、除零錯誤、中斷向量表 |
| 內存模型(Memory Model) | 定義程序的內存訪問與一致性規則 | 物理地址、虛擬地址、分頁機制 |
同樣採用 x86 架構的不同廠商的處理器一般指令集是兼容的,他們的處理器的區別主要是實現指令集的具體微架構的設計區別。比如同樣實現一個指令,不同廠商執行這個指令的硬件電路設計不同。這就引出了 x86 的整套體系:
- 指令集架構(ISA):軟件層面定義的指令規則。
- 微架構(Microarchitecture):硬件層面具體實現方式。
- 擴展技術:如 SIMD[1](單指令處理多數據)、虛擬化、內存保護、超線程[2]等。
2.1 x86 架構的主要組成
| 層次 | 組成 | 功能 |
|---|---|---|
| 指令集層 | 指令系統、寄存器、尋址模式 | 軟件與硬件的接口 |
| 微架構層 | 取指、譯碼、執行、調度、預測 | 執行指令的實際邏輯 |
| 存儲層 | 緩存、MMU、總線 | 提供數據支撐 |
| 控制層 | 模式切換、異常處理、虛擬化 | 管理與調度 CPU 資源 |
2.1.1 指令集
ISA 是 x86 架構的靈魂,它定義了 CPU 可以理解和執行的所有指令、寄存器種類、尋址模式、異常機制等。x86 的 ISA 發展經歷了多個階段:
- x86(16位):8086~80286 時代。
- IA-32(32位):80386 開始,廣泛用於早期 PC。
- x86-64(64位):由 AMD 首先推出(AMD64),支持 64 位尋址與寄存器擴展。
- SIMD 擴展:MMX → SSE → AVX → AVX2 → AVX-512,大幅提升並行計算性能。
1. x86 指令集
這裏列舉一部分:
- 數據傳送指令: MOV, PUSH, POP, LEA(取有效地址)。
- 算術運算指令: ADD, SUB, MUL, DIV, INC, DEC。
- 邏輯運算指令: AND, OR, XOR, NOT, SHL(左移), SHR(右移)。
- 控制轉移指令: JMP(無條件跳轉), CALL / RET(函數調用/返回), Jcc(條件跳轉,如JZ, JNE)。
- 字符串操作指令: MOVS, CMPS, SCAS(與REP前綴配合使用)。
- 系統指令: 用於操作系統,如INT(觸發中斷), IRET(從中斷返回), LGDT(加載全局描述符表), CPUID(獲取CPU信息)。
2. x86 寄存器組
- 通用寄存器:用於算術運算、邏輯運算、內存尋址等。某些寄存器有特殊用途,如ECX常用於循環計數,ESP始終指向棧頂。
- 32位: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP。
- 64位:在32位基礎上擴展為RAX, RBX, RCX, RDX, RSI, RDI, RSP, RBP,並新增了R8到R15。
- 段寄存器:在實模式和保護模式的早期,用於內存分段管理。在現代64位模式下,它們的意義不大,通常被設置為0。
- CS(代碼段), DS(數據段), SS(堆棧段), ES, FS, GS(附加數據段)。
- 指令指針:存放下一條要執行的指令的內存地址。CPU就是通過改變它來實現跳轉和函數調用。
- EIP(32位) / RIP(64位)
- 標誌寄存器:存儲CPU運算後的狀態和控制標誌。
- EFLAGS(32位) / RFLAGS(64位)
- 控制寄存器:控制CPU的操作模式(如開啓分頁、保護模式)。只有操作系統內核能訪問。比如CR0 包含系統控制標誌,如保護模式使能位(PE)、分頁使能位(PG)。頁目錄基址寄存器 CR3,存放當前進程頁表的物理地址,是 MMU 的核心。
- CR0, CR1, CR2, CR3, CR4...
2.1.2 微架構
微架構是 實現 ISA 的硬件邏輯設計。不同 CPU(如 Intel Core i9、AMD Ryzen 9)雖然都屬於 x86 指令集,但它們的微架構不同(比如 Intel 的 Alder Lake、AMD 的 Zen 5)。微架構的主要組成部分包括:
-
取指單元(Fetch Unit)
負責從緩存或內存中讀取即將執行的指令,並預先存入指令隊列。現代 CPU 通常具備 分支預測器(Branch Predictor),提前預測跳轉結果以減少流水線停頓。
-
譯碼單元(Decode Unit)
將複雜的 x86 指令翻譯成更簡單的 微操作(Micro-ops 或 µops)。內部的執行單元通常是以類似 RISC 風格的微操作執行的。
-
調度與執行單元(Execution Engine)
將譯碼後的微操作交由不同的功能單元執行:ALU(算術邏輯單元),負責整數運算。FPU(浮點單元),負責浮點計算。SIMD/AVX 單元,負責並行向量計算。Load/Store 單元,負責數據讀寫。支持亂序執行[3](Out-of-Order Execution)與超標量[4](Superscalar)技術。
亂序執行是現代 CPU 性能的關鍵。x86 亂序執行的一些關鍵點:寄存器重命名,解決指令間的假數據依賴,讓更多指令可以並行執行;保留站,微操作在這裏等待他們所需的操作數就緒;調度器,監視保留站,一旦某個微操作的操作數就緒,就把它分派給一個空閒的執行單元,不嚴格按照原始程序順序,從而實現“亂序執行”。
2.1.3 存儲與緩存層次(Memory Hierarchy)
x86 處理器採用多級緩存結構來解決 CPU 與內存速度差異,這一點基本所有架構是一致的:
- L1 緩存:分為指令緩存與數據緩存,速度最快。
- L2 緩存:容量更大,訪問稍慢。
- L3 緩存:多個核心共享,提升整體數據吞吐。
- 主存(DRAM):由內存控制器訪問。
- 內存管理單元 MMU:集成在CPU內,負責將程序使用的虛擬地址通過查詢頁錶轉換為物理地址。
2.1.4 控制單元與系統管理
- 實模式(Real Mode):16 位尋址,兼容早期 DOS。
- 保護模式(Protected Mode):支持多任務與內存保護。
- 長模式(Long Mode):64 位尋址。
- 系統管理模式(SMM):用於硬件級控制(如電源管理)。
- 虛擬化擴展:Intel VT-x、AMD-V 支持虛擬機運行。
附錄
x86 指令集的發展
- x86 (16位)。始於Intel 8086/8088處理器。16位寄存器(AX, BX, CX...),1MB內存尋址空間,使用分段內存模型。
- x86-32 / IA-32。由 80386 處理器引入。擴展到32位寄存器(EAX, EBX, ECX...)。引入保護模式,支持虛擬內存、內存保護和多任務。尋址空間擴展到 4GB。這是現代操作系統(如Windows XP, Linux)真正興起的基礎。
- x86-64 / AMD64 / Intel 64。由 AMD 首先設計並推廣,後來被Intel採納。寄存器擴展到64位(RAX, RBX...),並新增了8個通用寄存器(R8-R15)。尋址空間理論上達到2^64字節,實際上目前是 48 位或 57 位。幾乎完全向後兼容 32 位代碼。這是我們現在使用的桌面、服務器 CPU 的基準指令集。
- MMX。Pentium MMX處理器,目的是加速多媒體處理(如圖像、音頻),使用80x87浮點寄存器的尾數部分,定義了8個64位寄存器(MM0-MM7),進行單指令多數據 SIMD操作,即一條指令可以同時處理多個小位寬的數據(如8個8位像素)。
- SSE。Pentium III處理器引入,為了解決MMX的一些缺陷,並提升浮點性能。引入了獨立的128位寄存器(XMM0-XMM7),後來增加到16個(XMM0-XMM15)。支持單精度浮點數的 SIMD 操作。SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 是一系列連續的擴展,功能不斷增強,例如SSE2加入了雙精度浮點數和整數的SIMD操作。
- AVX。Sandy Bridge架構(Intel)和 Bulldozer架構(AMD)。進一步擴展了 SIMD 能力。將寄存器寬度從128位擴展到256位(YMM0-YMM15)。引入了新的三操作數指令格式,更靈活。AVX, AVX2, AVX-512 是更強大的擴展。其中AVX-512將寄存器進一步擴展到512位(ZMM0-ZMM31),並引入了掩碼寄存器等強大功能,主要用於高性能計算和服務器領域。
什麼是 SIMD
x86的SIMD技術經歷了以下幾個主要階段,其核心是寄存器寬度和功能的不斷擴展:
| 技術 | 引入時間 | 寄存器寬度 | 典型數據容量 | 特點 |
|---|---|---|---|---|
| MMX | 1997 | 64位 | 8個8位整數 / 4個16位整數 | 使用浮點寄存器,主要處理整數 |
| SSE | 1999 | 128位 (XMM) | 4個32位單精度浮點數 | 革命性,引入獨立寄存器,支持浮點 |
| SSE2/3/4 | 2000s | 128位 | 2個64位雙精度浮點數 / 16個8位整數 | 功能不斷增強和完善 |
| AVX | 2011 | 256位 (YMM) | 8個32位單精度浮點數 | 更寬的寄存器,新指令格式 |
| AVX-512 | 2013 | 512位 (ZMM) | 16個32位單精度浮點數 | 極度強大,主要用於服務器/HPC |
在傳統的標量運算中,如果你要對兩個數組進行加法運算:
for (int i = 0; i < 4; i++) {
c[i] = a[i] + b[i];
}
CPU需要執行大致需要執行4條加法指令:
- 取
a[0]和b[0],相加,結果存入c[0]。 - 取
a[1]和b[1],相加,結果存入c[1]。 - 取
a[2]和b[2],相加,結果存入c[2]。 - 取
a[3]和b[3],相加,結果存入c[3]。
而在SIMD模式下,假設我們有一個128位的SIMD寄存器:
- 我們可以將
a[0]到a[3]這4個32位整數,一次性打包加載到一個128位的SIMD寄存器中。 - 同樣,將
b[0]到b[3]也打包加載到另一個SIMD寄存器中。 - 然後,執行一條SIMD加法指令,這條指令會同時將
a[0]+b[0],a[1]+b[1],a[2]+b[2],a[3]+b[3]這4個加法計算一次性完成。 - 最後,將結果一次性存回內存的
c[0]到c[3]。
只執行了1條加法指令。
SIMD是一種通過一條指令同時處理多個數據的並行計算技術。它是現代CPU提升數據吞吐量、實現高性能計算的最關鍵手段之一。 當你聽到 SSE、AVX 這些術語時,它們就是 x86 平台上 SIMD 指令集的具體實現。編譯器(如GCC、Clang、MSVC)通常可以自動將合適的循環代碼向量化,生成SIMD指令,而程序員也可以使用內置函數來手動編寫高性能的SIMD代碼。
註釋
Steady Progress!
-
SIMD/AVX 向量化並行處理數據,提高多媒體性能 ↩︎
-
超線程指單核心同時處理多線程任務 ↩︎
-
亂序執行可以提前執行不相關的指令,以提高程序執行效率 ↩︎
-
超標量執行指每個週期執行多條指令 ↩︎