大家都知道, riscv 有三种Mode ,分别是 M-mode S-mode U-mode , boot 时 为 M-mode riscv-privileged-20190608.pdf 文档中有写 一个riscv架构芯片的 模式实现 可以有三种选择 M Simple embedded systems M, U Secure embedded systems M, S, U Systems running Unix-like operating systems freertos 全程 为 M-mode , 所以可以在 任何 riscv 芯片中运行 当前Mode 没有发现 哪个寄存器 可以 show 当前 Mode RISC-V Machine Mode 和 User Mode 相互切换 RISC-V特权指令和CSR Mode 切换 Machine Mode -> User Mode /* Switch Machine sub-mode to User mode */ // MSTATUS_MPP 的值为 0x00001800,即对应 mstatus 的 MPP 位域,请参、 // 见第 7.4.7 节了解 mstatus 的位域详情。 li t0, MSTATUS_MPP // 将 mstatus 寄存器的 MPP 位域清为 0 csrc mstatus, t0 // 将后面的标签 1 所在的 PC 地址赋值给 t0 la t0, 1f // 将 t0 的值赋值给 CSR 寄存器 mepc csrw mepc, t0 // 执行 mret 指令,则会将模式切换到 User Mode,并且从前的标签 1 处开始执行 // 程序(标签 1 即为 mret 的下一条指令的位置) mret // 标签 1 的位置 1: User Mode -> Machine Mode Bumblebee 内核从 User Mode 切换到 Machine Mode 只能通过异常、响应中断或者 NMI 的方式发生: 响应异常进入异常处理模式。请参见第 3.4 节了解其详情。 注意:软件可以通过调用 ecall 指令强行进入 ecall 异常处理函数。 响应中断进入中断处理模式。请参见第 5.6 节了解其详情。 响应 NMI 进入 NMI 处理模式。请参见第 4.3 节了解其详情。 User Mode -> Supervisor ModeSupervisor Mode -> User Mode Supervisor Mode -> Machine ModeMachine Mode -> Supervisor Mode