RISC-V架构的三种特权模式如何切换

1、RISC-V的三种特权模式

特权模式功能描述
机器模式(M-mode)具有最高特权等级,具有访问所有资源的权限,通常运行固件和内核
管理员模式(S-mode)权限要比M模式低,通常是用来运行操作系统内核
用户模式(U-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 //MSTATUS_MPP的值为0x00001800,即对应mstatus的MPP位域

csrc mstatus, t0 // 将mstatus寄存器的MPP位域清为0就,设置陷入M模式之前CPU模式是U特权模式

la t0, 1f // 将前面的标签1所在的PC地址赋值给t0

csrw mepc, t0 // 将t0的值赋值给CSR寄存器mepc,执行mret命令后,CPU从mepc寄存器中保存的地址处开始执行

mret // 执行mret指令,则会将模式切换到UserMode,并且从前的标签1处开始执行

// 程序(标签1即为mret的下一条指令的位置)

1: // 标签1的位置,U模式要运行的程序
  • 芯片启动时是运行在M模式,当完成初始化操作需要切换到U模式或者S模式运行,同样是执行mret命令实现
  • 和3.1节不同,因为不是从低特权模式切换到高特权模式,不存在保存现场,自然也不存在恢复现场所以需要软件自己构建恢复现场
  • 构建恢复低特权模式的现场,就是设置相关的寄存器,指定切换到哪个低特权模式、什么地址执行等,和中断返回的恢复现场是一样的

4、低特权模式切换到高特权模式

  • 异常、响应中断或者NMI的方式,这是异步的,软件不可控
  • 执行ecall命令陷入高特权模式,这是软件主动切换到高特权模式
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值