跳转至

RISC-V 特权指令简介

1 CSR 读后写指令:csrrw

image-20230817222757697

这一条指令的格式是:

Assembly
csrrw rd, csr, rs

这条指令会把 csr 寄存器的值读入 rd,然后把 rs 的值写入 csr 寄存器。

2 CSR 读后写立即数指令:csrrwi

image-20230817221320007

这一条指令的格式是:

Assembly
csrrwi rd, csr, zimm

这条指令会把 csr 寄存器的值读入 rd,然后把立即数 zimm 写入 csr 寄存器。不同于普通指令立即数,zimm 只有 5 位,在计算时需要进行零扩展。

3 CSR 读后置位指令:csrrs

image-20230817221507896

这一条指令的格式是:

Assembly
csrrs rd, csr, rs

这条指令会把 csr 寄存器的值读入 rd,然后把 rs 寄存器的值与 csr 寄存器的值进行按位或运算,结果写入 csr 寄存器。表现为 csrrs 为掩码,置位 rs 中为 1 的位。

4 CSR 读后置位立即数指令:csrrsi

image-20230817222006219

这一条指令的格式是:

Assembly
csrrsi rd, csr, zimm

这条指令会把 csr 寄存器的值读入 rd,然后把 5 位立即数 zimm 零扩展至 32 位,并与 csr 寄存器的值进行按位或运算,结果写入 csr 寄存器。表现为 csrzimm 为掩码,置位 zimm 中为 1 的位。

5 CSR 读后复位指令:csrrc

image-20230817222157618

这一条指令的格式是:

Assembly
csrrc rd, csr, rs

这条指令会把 csr 寄存器的值读入 rd,之后把 rs 寄存器的值按位取反,并与 csr 寄存器的值进行按位与运算,结果写入 csr 寄存器。表现为 csrrs 为掩码,复位 rs 中为 1 的位。

6 CSR 读后复位立即数指令:csrrci

image-20230817224217548

这一条指令的格式是:

Assembly
csrrci rd, csr, zimm

这条指令会把 csr 寄存器的值读入 rd,然后把 5 位立即数 zimm 零扩展至 32 位并按位取反,再与 csr 寄存器的值进行按位与运算,结果写入 csr 寄存器。表现为 csrzimm 为掩码,复位 zimm 中为 1 的位。

7 环境调用指令:ecall

image-20230817225600173

环境调用指令会主动触发 RISC-V 中的一种异常——系统调用异常。这种异常将会向操作系统发起进入更高级别运行环境的申请。系统调用本质上也是异常,因此其与普通异常一样,都会被处理器捕获、设置某些 CSR 的值并跳转到异常处理流程中。

8 机器模式异常返回指令:mret

image-20230817230149725

在机器模式处理完异常后,可以通过 mret 指令返回到之前的模式。这个指令会恢复异常发生时 PC 的值,并更新 CSR 状态使其回到用户态。需要注意的是,本课程中我们不涉及外设中断,因此可以忽视 MIE 等和中断相关的寄存器变化。