1、RISC-V的三种特权模式
特权模式 | 功能描述 |
---|
机器模式(M-mode) | 具有最高特权等级,具有访问所有资源的权限,通常运行固件和内核 |
用户模式(U-mode) | 权限要比M模式低,通常是用来运行操作系统内核 |
管理员模式(S-mode) | 级别最低的模式,它不能访问硬件资源,只能访问某些通用寄存器和通用指令,一般用于执行应用程序 |
- 芯片不一定会实现三种特权模式,可以只实现其中的部分特权模式,但是M模式是必须要实现的
- 单片机(运行RTOS):通常只有M模式和U模式,或者只有M模式
- 通用SOC(运行linux):M、S、U模式
- 芯片在启动时,默认是处于M模式
- 特权级别:M模式 > S模式 > U模式
2、三种特权模式之间的切换
- 从M模式返回低特权模式,使用mret命令,会返回到切换M模式之前的模式
- 从S模式返回低特权模式,使用sret命令,会返回到切换S模式之前的模式
- U模式可以通过ecall指令切换到高特权模式,至于是切换到M模式还是S模式,取决于是M模式还是S模式来处理U模式的系统调用,这个异常委托有关
- medeleg是RISC-V架构定义的异常委托寄存器,默认所有异常都是M模式处理,但是可以设置medeleg寄存器把部分异常交由S模式处理
3、高特权模式切换到低特权模式
3.1、低特权模式 -> 高特权模式 -> 低特权模式
- 这种是最常见的情况,程序运行在低特权模式,遇到中断、异常陷入到高特权模式,执行mret或者sret命令返回低特权模式
- 执行mret指令的硬件行为与异常处理模式下执行mret指令的行为相同。切换到高特权模式时,硬件会更新相关寄存器来记录低特权模式下的运行信息,通过保存现场、恢复现场来达到从高特权模式切换到低特权模式继续执行
- 参考博客:《RISC-V架构——中断处理和中断控制器介绍》;
3.2、高特权模式 -> 低特权模式
/ Switch Machine sub-mode to User mode /
li t0, MSTATUS_MPP
csrc mstatus, t0
la t0, 1f
csrw mepc, t0
mret
1:
- 芯片启动时是运行在M模式,当完成初始化操作需要切换到U模式或者S模式运行,同样是执行mret命令实现
- 和3.1节不同,因为不是从低特权模式切换到高特权模式,不存在保存现场,自然也不存在恢复现场所以需要软件自己构建恢复现场
- 构建恢复低特权模式的现场,就是设置相关的寄存器,指定切换到哪个低特权模式、什么地址执行等,和中断返回的恢复现场是一样的
4、低特权模式切换到高特权模式
- 异常、响应中断或者NMI的方式,这是异步的,软件不可控
- 执行ecall命令陷入高特权模式,这是软件主动切换到高特权模式