最近RISC-VのLinuxサポート周りを調べている中で、「SBI(Supervisor Binary Interface)」という仕組みが要所で登場する。
最初は「ブート時の一時的なインターフェースかな?」と思っていたが、どうやらRISC-Vにおいてはランタイムでも重要な役割を持つ仕組みであることが分かってきた。
ここでは、SBIの基本的な仕組みと役割に加え、x86との対比を通してこの設計の意図を掘り下げる。
SBIとは何か?
SBI(Supervisor Binary Interface)は、RISC-VのSモード(Supervisorモード)で動作するOSと、Mモード(Machineモード)で動作するファームウェア(通常OpenSBI)との間のインターフェース仕様である。
RISC-Vには以下のような特権レベルが定義されている:
| モード名 | 用途 | 使用者 |
|---|---|---|
| M-mode | 最上位特権。ハード初期化、割り込み、タイマ等の制御 | ファームウェア(OpenSBI等) |
| S-mode | OS用特権モード | Linuxカーネルなど |
| U-mode | ユーザー空間 | アプリケーション |
SBIの役割:OSとハードウェアの間を取り持つ
Sモードで動作するLinuxは、Mモードのレジスタ(例:mtimecmp など)に直接アクセスできない。
そのため、Linuxがタイマや割り込みなどのハードウェア機能を使いたいときは、SBIを通じてファームウェアに依頼する必要がある。
タイマ割り込みの流れ
Linux(S-mode) │ ├─ sbi_set_timer() ↓ OpenSBI(M-mode) ├─ mtimecmpに設定 ↓ ハードウェア ├─ 時間到達 → M-mode割り込み ↓ OpenSBI └─ 割り込みをS-modeに再送 Linux(割り込みハンドラ起動)
x86との比較:設計思想の違い
特権レベルの比較
| アーキテクチャ | 特権構造 | 実際に使われるレベル |
|---|---|---|
| x86 | Ring 0~3 | Ring 0(OS)とRing 3(ユーザ) |
| RISC-V | M/S/Uモード(+H) | Mモード:ファームウェア Sモード:OS Uモード:ユーザ |
タイマ・割り込み制御の比較
| 項目 | x86 | RISC-V |
|---|---|---|
| タイマ設定 | OSが直接制御 | OSがSBI経由で依頼 |
| 割り込み制御 | OSがPIC/APICを直接操作 | OSはPLIC/CLINTをSBI経由で操作 |
| BIOS後のファームウェア | 消える(UEFIなど) | OpenSBIが常駐する |
OpenSBIとは?
OpenSBIは、SBI仕様に準拠したオープンソースのリファレンス実装である。 起動初期だけでなく、Linux動作中もバックグラウンドでSBIコールの処理、割り込み委譲、タイマ制御などを行っている。
GitHub:https://github.com/riscv-software-src/opensbi
OpenSBI v3.0の新機能
- FWFT:ファームウェア機能の検出と制御
- SSE:Supervisorイベント通知
- svinval命令:TLB無効化の効率化
- mseal:Supervisor領域の保護
- vDSO強化:getrandom() などの高速化
- ベンダー拡張対応(SiFiveなど)
まとめ
SBIはRISC-Vにおけるランタイム抽象化レイヤーとして、OSとハードウェアの橋渡しを行う。 x86とは異なり、OSが全権を握るのではなく、Mモードのファームウェアと協調して動作する設計となっている。
この分離構造により、セキュリティ・移植性・抽象化の利点が得られる一方、設計思想としてはx86とは明確に異なる。