M/S/U三级特权模式与切换机制
RISC-V定义了三个特权级别,形成层次结构:
| 特权级 | 编码 | 典型用途 | CSR前缀 |
|---|---|---|---|
| User | 00 | 应用程序 | u* |
| Supervisor | 01 | OS内核 | s* |
| Machine | 11 | Bootloader/固件 | m* |
特权级切换发生在以下场景:
// Lesson 01: Privilege Architecture — M/S/U Mode Switching
module privilege_arch(
input wire clk, rst_n,
input wire [1:0] req_priv, // 请求的目标特权级
input wire req_valid, // 请求有效
output reg [1:0] current_priv, // 当前特权级
output reg [1:0] prev_priv, // 前一特权级
output reg trap_active // trap进行中
);
localparam PRV_U = 2'b00, PRV_S = 2'b01, PRV_M = 2'b10;
reg [1:0] mstatus_mpp;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
current_priv <= PRV_M; prev_priv <= PRV_M;
mstatus_mpp <= PRV_M; trap_active <= 1'b0;
end else if (req_valid) begin
if (req_priv > current_priv) begin
mstatus_mpp <= current_priv; prev_priv <= current_priv;
current_priv <= req_priv; trap_active <= 1'b1;
end else if (req_priv < current_priv) begin
current_priv <= req_priv; trap_active <= 1'b0;
end
end
end
endmodule
| 特性 | RISC-V | ARMv8 | x86-64 |
|---|---|---|---|
| 特权级数 | 3 (M/S/U) | 4 (EL0-EL3) | 4 (Ring 0-3) |
| 最小实现 | 仅M-mode | EL1+EL0 | Ring 0+Ring 3 |
| 虚拟化支持 | H扩展(VS/VU) | EL2 | VMX |
| 安全扩展 | TrustZone(Tee) | EL3 | SGX |
| CSR访问控制 | 按特权级+地址范围 | 按EL | 按CPL |
RISC-V的3级特权是最精简的设计——如果不需要虚拟化(H扩展)和安全(TrustZone),3级足够运行完整的OS。
| 实现 | 特权级 | M-mode固件 | S-mode OS |
|---|---|---|---|
| SiFive E310 | M+U | FreeRTOS | — |
| SiFive U540 | M+S+U | OpenSBI | Linux |
| QEMU virt | M+S+U | OpenSBI | Linux/FreeBSD |
| 香山南湖 | M+S+U | OpenSBI | Linux |
| BOOM v3 | M+S+U | OpenSBI | Linux |
在嵌入式场景中,仅使用M+U两级特权可以大幅减小核心面积。FreeRTOS等实时OS直接运行在M-mode,用户代码在U-mode,不需要虚拟内存(S-mode的核心功能)。
在服务器/桌面场景中,M+S+U三级是标配:OpenSBI(M-mode)负责系统初始化和S-mode异常代理,Linux(S-mode)提供完整OS服务,用户程序(U-mode)通过ecall请求系统调用。
RISC-V的H扩展(Hypervisor)添加了VS(Virtual Supervisor)和VU(Virtual User)两个虚拟化特权级。此时特权级层次变为:M→HS→VS→VU,共4级。Hypervisor运行在HS-mode,Guest OS运行在VS-mode。
每次特权级切换(ecall/mret)需要保存和恢复CSR,典型开销为50-100个时钟周期。频繁的系统调用(如I/O密集型应用)可能消耗10-20%的CPU时间在特权级切换上。优化方法包括:
| 资料 | 内容 | 链接 |
|---|---|---|
| RISC-V特权规范 | CSR、Trap、中断完整定义 | riscv.org/specifications |
| RISC-V手册 | 中文版免费教材 | crva.ict.ac.cn |
| OpenSBI源码 | M-mode固件参考实现 | github.com/riscv/opensbi |
| Linux RISC-V | 内核移植与驱动 | kernel.org |
| BOOM处理器 | UC Berkeley开源OoO核心 | github.com/riscv-boom/riscv-boom |
| 香山处理器 | 中科院开源高性能核心 | github.com/OpenXiangShan |
| 课程范围 | 课程号 | 主题 |
|---|---|---|
| 特权架构 | 01-06 | 特权级→CSR→ecall→mret→trap→中断 |
| 内存系统 | 07-12 | PLIC→CLINT→SV39→TLB→直接映射→组相联 |
| 算术单元 | 13-14 | Booth乘法器→恢复余数除法 |
| 乱序执行 | 15-19 | OoO→ROB→寄存器重命名→记分牌→Tomasulo |
| 分支预测 | 20-21 | 2位预测器→BTB |
| RISC-V扩展 | 22-26 | RVC→RVM→RVA→RVF→RVD |
| 系统集成 | 27-30 | PMP→解码器→SoC→启动流程 |
建议使用以下环境进行实验: