特权级机制

我们这里只会介绍原理和从 M mode 转到 S mode 的方法。

我们已经在操作系统简介中介绍了特权级及其作用。我们知道,特权级机制可以保证应用的运行不会影响到内核或者其他的应用。

整个特权级机制是通过硬件加上指令集支持实现的。CPU 有一些特殊的寄存器,叫做 CSR (Control and Status Register),用于控制和记录特权相关的状态。

我们将从高特权态到低特权态的操作称为 eret (environment return),将低特权态到高特权态的操作成为 ecall

特权指令

RISCV 大致提供这些特权指令:

指令描述
ecall从低特权态进入高特权态
ebreak用于调试
mret从机器态到低特权态,在特权态不正确的情况下执行会产生非法指令异常
sret从监管态到低特权态,在特权态不正确的情况下执行会产生非法指令异常
wfi等待中断,在 U mode 下执行会产生非法指令异常
sfence.vma刷新 TLB,在 U mode 下执行会产生非法指令异常
csrr读取 CSR(到通用寄存器)
csrw写入 CSR(从通用寄存器)
csrrw读取 CSR 并写入 CSR,这个过程是原子的

一些特权寄存器或寄存器位的命名

我们会在 RISCV 的手册中看到一些特权寄存器或寄存器位的命名,但是由于体系结构喜欢用简称来称呼,而简称对于不熟悉的人来说不是很友好,这里我们介绍一些比较常见的命名。

  • mstatus/sstatus (Machine/Supervisor Status):记录特权级的状态。
  • mpp/spp (Machine/Supervisor Previous Privilege):记录上一次的特权级。
  • mpie/spie (Machine/Supervisor Previous Interrupt Enable):记录上一次的中断使能状态,这是由于当发生中断时,中断会被禁用,以免在处理中断时又发生中断。
  • mepc/sepc (Machine/Supervisor Exception Program Counter):记录上次异常的地址。
  • mcause/scause (Machine/Supervisor Cause):记录异常的原因。
  • mtval/stval (Machine/Supervisor Trap Value):记录异常的附加信息。
  • medeleg/mideleg (Machine Exception/Interrupt Delegation):处理异常/中断的特权态。
  • mie/sie (Machine/Supervisor Interrupt Enable):中断启用。
  • mip/sip (Machine/Supervisor Interrupt Pending):有中断等待。
  • mscratch/sscratch (Machine/Supervisor Scratch):用于保存临时数据,可以利用如 csrrw a0, mscratch, a0 来交换 mscratch 和通用寄存器的值。
  • satp (Supervisor Address Translation and Protection Register):用于设置虚拟内存映射规则。
  • mtvec/stvec (Machine/Supervisor Trap Handler Vector):用于设置 trap 的处理起始点(发生 trap 之后会跳转到这个地址)。