關於 CPU 通用暫存器的常見疑問:一台電腦有多少通用暫存器?多程式同時運行暫存器夠嗎?程式計數器與程式碼暫存器關係?本文從架構層面系統解答。
| 層面 | x86-64 (AMD64) | ARMv8 (AArch64) | RISC-V (RV64) |
|---|---|---|---|
| **架構可見通用暫存器** | 16 個 (RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8-R15) | 31 個 (X0-X30, XZR) + SP/PC 專用 | 32 個 (x0-x31, x0 硬接 0) |
| **物理暫存器 (微架構)** | 100-200+ (Intel Sunny Cove ~180, AMD Zen 3 ~192) | 100-200+ (Apple M1 ~192, Neoverse N1 ~128) | 100-200+ (SiFive P550 ~128) |
結論:程式設計師看到的只有架構定義的 16/31/32 個;硬體內部透過**暫存器重命名**擁有數倍物理暫存器,支援亂序執行與推測執行。
// 簡化的上下文切換流程 (內核態)
void context_switch(Thread *prev, Thread *next) {
// 1. 保存 prev 所有暫存器 (含 PC, SP, 旗標, 通用暫存器)
save_registers(prev->context);
// 2. 切換頁表/位址空間 (若進程不同)
switch_mm(prev->mm, next->mm);
// 3. 恢復 next 暫存器
restore_registers(next->context);
// 4. 跳轉到 next->context.pc 繼續執行
}
| 機制 | 說明 |
|---|---|
| 暫存器重命名 | 架構暫存器映射到大量物理暫存器,消除 WAW/WAR 相依,支援亂序執行 |
| 推測執行 | 分支預測失敗時,物理暫存器狀態可快速回滾 (棄用重命名映射) |
| 多核心 | 每核心擁有**獨立完整暫存器組** (含 PC、旗標、通用暫存器),硬體緩存一致性協定 (MESI) 同步記憶體視圖 |
| SMT / Hyper-Threading | 單核心雙邏輯執行緒共享物理暫存器池,透過分區/標籤隔離架構狀態 |
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.htmlhttps://developer.arm.com/documentation/ddi0487/latesthttps://riscv.org/technical/specifications/https://blog.csdn.net/maimang1001/article/details/9206167 (任務切換上下文)、https://blog.csdn.net/edonlii/article/details/8771023 (暫存器重命名)核心觀點:**架構暫存器少 (16-32),物理暫存器多 (100+);多程式靠時間片切換+上下文保存/恢復;PC 指向下一條指令;程式不需用完所有暫存器;多核心各自獨立暫存器組**。