RISC-V特权架构 - CSR寄存器

RV32/64 特权架构 - CSR寄存器

  • [1 CSR地址空间](#1 CSR地址空间)
  • [2 CSR定义](#2 CSR定义)
    • [2.1 用户级](#2.1 用户级)
    • [2.2 监管级](#2.2 监管级)
    • [2.3 超级监管级](#2.3 超级监管级)
    • [2.4 机器级](#2.4 机器级)
  • [3 CSR访问](#3 CSR访问)
    • [3.1 CSRRW](#3.1 CSRRW)
    • [3.2 CSRRS](#3.2 CSRRS)
    • [3.3 CSRRC](#3.3 CSRRC)
    • [3.4 CSRRWI](#3.4 CSRRWI)
    • [3.5 CSRRSI](#3.5 CSRRSI)
    • [3.6 CSRRCI](#3.6 CSRRCI)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。

1 CSR地址空间

RISC-V架构中定义了一些控制和状态寄存器(control and status register),简称CSR,与32个物理寄存器不同(物理寄存器可以认为是5位地址寻址的),这些CSR是用12位地址进行寻址的,因此理论上最多可以有4096个CSR寄存器,并且地址空间是私有独立的,不同于全局地址空间。

CSR地址空间,定义如下:

CSR地址的高4bits,用于编码CSR在各个权级上的可读写性:

  • 11:10,表示该寄存器是可读写(00,01或10),还是只读(11)。
  • 9:8 ,表示允许访问该寄存器的最低权级。
    00:用户级,用户模式及以上权级(用户、监管、机器)可访问。
    01:监管级,监管模式及以上权级(监管、机器)可访问。
    10:超级监管级(扩展模式),仅在虚拟化时使用,用于访问虚拟化专用的CSR。
    11:机器级,仅机器模式可访问。
    从上图也可以看到,根据9:8的值,整个CSR地址空间被分为了4个部分。

除此之外,上图还指定了哪些CSR地址是标准用途,而哪些是自定义用途。

用于自定义的CSR地址,不会在未来标准扩展中被重新定义。

2 CSR定义

我们知道,CSR寄存器被划分为4个级别:用户级、监管级、超级监管级、机器级。

接下来,我们看看各个权级,具体定义了哪些寄存器。

2.1 用户级

用户级CSR,定义了两个部分的寄存器:

  • Unprivileged Floating-Point CSRs
  • Unprivileged Counter/Timers

以上Number列,给出了该寄存器的12位地址。

具体寄存器含义见规范手册。

2.2 监管级

监管级CSR,定义了五个部分的寄存器:

  • Supervisor Trap Setup
  • Supervisor Configuration
  • Supervisor Trap Handling
  • Supervisor Protection and Translation
  • Debug/Trace Registers

具体寄存器含义见规范手册。

2.3 超级监管级

超级监管级CSR,定义了七个部分的寄存器:

  • Hypervisor Trap Setup
  • Hypervisor Trap Handling
  • Hypervisor Configuration
  • Hypervisor Protection and Translation
  • Debug/Trace Registers
  • Hypervisor Counter/Timer Virtualization Registers
  • Virtual Supervisor Registers

具体寄存器含义见规范手册。

2.4 机器级

机器级CSR,定义了九个部分的寄存器:

  • Machine Information Registers
  • Machine Trap Setup
  • Machine Trap Handling
  • Machine Configuration
  • Machine Memory Protection
  • Machine Counter/Timers
  • Machine Counter Setup
  • Debug/Trace Registers (shared with Debug Mode)
  • Debug Mode Registers


具体寄存器含义见规范手册。

3 CSR访问

针对CSR寄存器的读写,有相应的特殊指令,这些特殊指令都被定义在RV32I中,如下所示:

真正的指令只有CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI、CSRRCI这6条,其他资料中的CSR指令,均为伪指令。

CSR指令机器码中共有12位(第20-31 位)用来指示,被"读改写"的是哪一个CSR寄存器,这里通常填写的就是前面讲过的CSR地址,比如:mtvec寄存器那就是0x305。

注意事项:

  • 试图访问一个不存在的CSR将造成一个非法指令异常(illegal instruction exception);
  • 试图在不当的权级下访问CSR,或者尝试写入一个只读寄存器也都将造成非法指令异常;
  • 可读写寄存器中也可能包含一些只读位,此时忽略对只读位的写入。

3.1 CSRRW

指令形式:csrrw rd, csr, rs1

指令功能:CSR寄存器读后写。记csr值为t,将rs1写入csr,再将t写入rd。

cpp 复制代码
t = csr
csr = rs1
rd = t

例如:csrrw t0, mstatus, t0

将 mstatus 的值与 t0 的值交换。

3.2 CSRRS

指令形式:csrrs rd, csr, rs1

指令功能:CSR寄存器读后置位。记csr值为t,将t和rs1的按位或结果写入csr,再将t 写入rd。

cpp 复制代码
t = csr
csr = t | rs1 
rd = t

3.3 CSRRC

指令形式:csrrc rd, csr, rs1

指令功能:CSR寄存器读后清位。记csr值为t,将rs1的反码和t按位与,结果写入csr,再将t写入rd。

cpp 复制代码
t = csr
csr = t & ∼rs1
rd = t

3.4 CSRRWI

指令形式:csrrwi rd, csr, zimm[4:0]

指令功能:CSR寄存器读后写立即数。将csr 的值复制到rd 中,再将5 位立即数zimm 的零扩展结果写入csr。

cpp 复制代码
rd = csr
csr = zimm

3.5 CSRRSI

指令形式:csrrsi rd, csr, zimm[4:0]

指令功能:CSR寄存器读后置位立即数。记csr 的值为t,将5 位立即数zimm 零扩展后,和t 按位或,结果写入csr,再将t 写入rd(csr 中的第5 及更高的位不变)。

cpp 复制代码
t = csr
csr = t | zimm
rd = t

3.6 CSRRCI

指令形式:csrrci rd, csr, zimm[4:0]

指令功能:CSR寄存器读后清位立即数。记csr 的值为t,将5 位立即数zimm 零扩展后的反码和t 按位与,结果写入csr,再将t 写入rd(csr 中的第5 及更高的位不变)。

cpp 复制代码
t = csr
csr = t & ∼zimm 
rd = t

此外,需要注意:

  • 若目的通用寄存器为x0,则不会执行读取操作;
  • 若源通用寄存器为x0或立即数0,也不会进行写入CSR操作。

基于以上6条指令和x0这样的特性,衍生出若干CSR伪指令,比如:csrr、csrc、csrci、csrs、csrw等。


参考文档:

  • 《riscv-spec-20191213》
  • 《riscv-privileged-20211203》
相关推荐
Eloudy9 小时前
可在开源 RISC-V 上的裸机操作系统
开源·risc-v
hai31524754318 小时前
RISC-V核E203核前向旁路的架构性顽疾
驱动开发·架构·硬件架构·硬件工程·risc-v
时光飞逝的日子1 天前
基于 RISC-V 架构的边缘 AI 推理引擎优化设计
risc-v·模型量化·推理引擎·边缘 ai·向量扩展·低功耗优化
国科安芯2 天前
基于RISC-V架构的商业航天级MCU国产化技术路径与产业生态研究
网络·分布式·单片机·嵌入式硬件·架构·risc-v·安全性测试
国科安芯2 天前
AS32S601商业航天级抗辐照MCU芯片:架构设计与技术特性研究
单片机·嵌入式硬件·算法·安全·架构·risc-v
国科安芯2 天前
AS32S601芯片抗辐照性能试验验证与空间环境适应性分析
前端·分布式·单片机·嵌入式硬件·架构·risc-v·安全性测试
国科安芯5 天前
国科安芯AS32A601芯片及ANSIC-EVB601开发平台获OneWo-zepLinux全面适配支持
网络·单片机·嵌入式硬件·risc-v·安全性测试
深圳市九鼎创展科技7 天前
九鼎创展 X7110 开发板(JH7110):国产 RISC-V 多媒体平台全解析
大数据·linux·人工智能·嵌入式硬件·ubuntu·risc-v
Eloudy8 天前
risc-v 实验简介 uboot + gem5-riscv
risc-v
Eloudy8 天前
gem5 运行 risc-v 64bit 的 U-Boot
risc-v