RISC-V指令基础

RV32

RV32I

RV32M

RV32F & RV32D

RV32A

RV32C

RV32V

RV64

RV64I

RV64M & RV64A

RV64F & RV64D

RV64C

RiscV中断

分类

在Riscv中中断的类型分为3种

  • software interrupt——软件中断

  • timer interrupt——时钟中断

  • external interrupt——外部中断

  • mstatus(Machine Status),维护各种状态,如全局中断使能状态。

  • mip(Machine Interrupt Pending),记录当前的中断请求。

  • mie(Machine Interrupt Enable),维护处理器的中断使能状态。

  • mcause(Machine Exception Cause),指示发生了何种异常。

  • mtvec(Machine Trap Vector),存放发生异常时处理器跳转的地址。

  • mtval(Machine Trap Value),存放与当前自陷相关的额外信息,如地址异常的故障地址、非法指令异常的指令,发生其他异常时其值为0。

  • mepc(Machine Exception PC),指向发生异常的指令。

  • mscratch(Machine Scratch),向异常处理程序提供一个字的临时存储。

image-20220707145631097

RiscV特权

在RiscV中有3大权限模式

  • M——Machine Mode

    最简单嵌入式系统只支持Machine模式

  • S——Supervisor Mode

    支持虚拟内存概念的类Unix系统,需要支持Machine,User和Supervisor三种模式

  • U——User Mode

    安全的嵌入式系统支持Machine模式和User模式

特权指令

在这里插入图片描述
  • sret : 监管者模式下的异常和中断返回
  • mret : 机器模式下的异常和中断返回
  • sfence.vma : 刷新虚拟内存映射(tlb)
  • wfi :使处理器暂停执行,并进入低功耗的等待状态,使处理器暂停执行,并进入低功耗的等待状态

特权级切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
.section .text
.globl start
start:
la t0, supervisor
csrw mepc, t0
la t1, m_trap
csrw mtvec, t1
li t2, 0x1800
csrc mstatus, t2
li t3, 0x800
csrs mstatus, t3
li t4, 0x100
csrs medeleg, t4
mret
m_trap:
csrr t0, mepc
csrr t1, mcause
la t2, supervisor
csrw mepc, t2
mret
supervisor:
la t0, user
csrw sepc, t0
la t1, s_trap
csrw stvec, t1
sret
s_trap:
csrr t0, sepc
csrr t1, scause
ecall
user:
csrr t0, instret # 这里仅为了展示在 U 模式下可以访问的为数不多的 CSR,表示当前硬件线程已执行指令的条数
ecall

流程图:

image-20240201162905307

参考

Linux Lab