特权级架构 — Privilege Architecture

M/S/U三级特权模式与切换机制

📖 RISC-V特权级概述

RISC-V定义了三个特权级别,形成层次结构:

特权级层次: ┌─────────────────────────────────────────┐ │ M-Mode (Machine) 最高特权 │ │ • 完全硬件访问权 │ │ • 异常/中断处理入口 │ │ • CSR全访问 │ │ ┌─────────────────────────────────────┐│ │ │ S-Mode (Supervisor) 中间特权 ││ │ │ • 操作系统内核运行 ││ │ │ • 虚拟内存管理 ││ │ │ • 受限CSR访问 ││ │ │ ┌─────────────────────────────────┐││ │ │ │ U-Mode (User) 最低特权 │││ │ │ │ • 用户应用程序运行 │││ │ │ │ • 无法直接访问硬件 │││ │ │ │ • 需通过ecall请求服务 │││ │ │ └─────────────────────────────────┘││ │ └─────────────────────────────────────┘│ └─────────────────────────────────────────┘
特权级编码典型用途CSR前缀
User00应用程序u*
Supervisor01OS内核s*
Machine11Bootloader/固件m*
RISC-V的特权级设计比ARM(EL0-EL3)和x86(Ring 0-3)更简洁。M-mode是必选的,S和U是可选的。最小的RISC-V实现可以只有M-mode。

🔬 特权级切换机制

特权级切换发生在以下场景:

特权级切换流程: U-Mode M-Mode ┌──────┐ ecall ┌──────────────┐ │ App │ ────────→│ Trap Handler │ │ │ │ (mepc/mcause)│ │ │ ←────────│ │ └──────┘ mret └──────────────┘ 关键CSR: mstatus.mpp — 保存切换前的特权级 mepc — 保存触发trap的PC mcause — 保存trap原因

特权级切换规则

🖥️ Verilog实现:特权级切换模块

// 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
Verilator仿真验证通过 — M/S/U三级特权切换正确

代码解析

📊 特权级对比:RISC-V vs ARM vs x86

特性RISC-VARMv8x86-64
特权级数3 (M/S/U)4 (EL0-EL3)4 (Ring 0-3)
最小实现仅M-modeEL1+EL0Ring 0+Ring 3
虚拟化支持H扩展(VS/VU)EL2VMX
安全扩展TrustZone(Tee)EL3SGX
CSR访问控制按特权级+地址范围按EL按CPL

RISC-V的3级特权是最精简的设计——如果不需要虚拟化(H扩展)和安全(TrustZone),3级足够运行完整的OS。

🧪 实验练习

  1. 添加S-mode异常委托:通过medeleg/mideleg将部分异常委托给S-mode处理
  2. 实现mstatus.MIE位:全局中断使能,影响特权级切换时机
  3. 添加特权级违规检测:U-mode访问M-mode CSR时触发异常
  4. 实现双特权级最小系统:仅M+U,适合嵌入式场景
M/S/U三级特权切换正确
思考题:为什么RISC-V复位后从M-mode而不是U-mode启动?如果从U-mode启动会有什么问题?
参考资料:RISC-V Privileged Spec §1.1 | OpenSBI文档 | ARMv8-A Architecture Reference Manual

🔗 RISC-V特权级实现案例

实现特权级M-mode固件S-mode OS
SiFive E310M+UFreeRTOS
SiFive U540M+S+UOpenSBILinux
QEMU virtM+S+UOpenSBILinux/FreeBSD
香山南湖M+S+UOpenSBILinux
BOOM v3M+S+UOpenSBILinux

在嵌入式场景中,仅使用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时间在特权级切换上。优化方法包括:

🎯 本课与整体课程的关系

特权架构知识图谱: ┌─────────────────────────────────────────────┐ │ 01 特权架构 (本课) │ │ M/S/U三级切换 │ │ ↓ │ │ 02 CSR寄存器 — 控制特权行为 │ │ ↓ │ │ 03 ecall — U→M请求服务 │ │ 04 mret — M→U返回 │ │ ↓ │ │ 05 Trap — 异常入口机制 │ │ 06 中断 — 异步事件处理 │ │ ↓ │ │ 07 PLIC — 多源中断路由 │ │ 08 CLINT — 定时器中断 │ └─────────────────────────────────────────────┘

📚 延伸阅读与参考资料

资料内容链接
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-12PLIC→CLINT→SV39→TLB→直接映射→组相联
算术单元13-14Booth乘法器→恢复余数除法
乱序执行15-19OoO→ROB→寄存器重命名→记分牌→Tomasulo
分支预测20-212位预测器→BTB
RISC-V扩展22-26RVC→RVM→RVA→RVF→RVD
系统集成27-30PMP→解码器→SoC→启动流程

实验环境搭建

建议使用以下环境进行实验: