回到文章列表
risc-v-register-caller-callee-saved

【RISC-V】常用Register以及Caller/Callee Saved

發布於 2026-04-21·18·
RISC-V

開發OS最重要的事情之一就是要熟悉使用的指令集,但我經常忘記RISC-V有哪些暫存器以及它們的功能等等,這篇文章就來記錄一下。

分類

首先RISC-V每顆CPU核心都有幾類暫存器:

  • x0-x31: 通用暫存器,最常計算用的
  • f0-f31: 浮點數運算使用,xv6沒有處理這個,編譯時就擋掉浮點數運算,我暫時也先不考慮支援這個,等到哪天真的碰到計算浮點數的Exception再說
  • csr (Control and Status Registers): 各種控制CPU行為的暫存器,非常重要
  • pc (Program Counter): 下一行指令的Address

x0-x31

RegisterABI 名稱Caller/Callee Saved用途
x0zero恆為 0。寫入會被丟棄,讀取永遠得到 0。
x1raCaller返回地址 (Return Address)。執行 call 時自動更新。
x2spCallee堆疊指標 (Stack Pointer)。必須保持 16-byte 對齊。
x3gp全域指標 (Global Pointer)。指向靜態全域變數區。
x4tp執行緒指標 (Thread Pointer)。OS 常拿來存 CPU HartID 或 PCB。
x5 - x7t0 - t2Caller臨時暫存器 (Temporary) 0 - 2。
x8s0 / fpCalleeSaved 0 / 幀指標 (Frame Pointer)。用於 Trace 呼叫堆疊。
x9s1CalleeSaved 1。
x10 - x11a0 - a1Caller函式參數 0 - 1 / 回傳值。Syscall 結果也存於此。
x12 - x17a2 - a7Caller函式參數 2 - 7。a7 通常用於傳遞 Syscall ID。
x18 - x27s2 - s11CalleeSaved 2 - 11。swtch.S 必須手動保存這組暫存器。
x28 - x31t3 - t6Caller臨時暫存器 3 - 6。

註:

  • ABI: Application Binary Interface
  • Saved: RISC-V ABI規定Callee使用前必須先存到Stack中,使用完後也必須還原,也就是說從Caller的角度來看是不變的,所以sX比tX更穩定
  • 參考: RISC-V Calling Convention