Skip to main content

1. CSR的作用与分类

CSR(Control and Status Registers)是RISC-V体系结构中的一组特殊寄存器,主要用于控制处理器状态、管理中断与异常、以及提供性能监控等功能。CSR被分为以下三种模式级别:

  1. 用户模式(u-mode)
  2. 超级模式(s-mode)
  3. 机器模式(m-mode)

CSR的地址空间使用统一的12位编码,具有特定的访问权限:

  1. u(用户态)
  2. s(超级用户态)
  3. m(机器态)

2. 用户模式(User Mode)CSR

用户模式是运行非超级用户应用的最低级别。以下是用户模式常用的CSR:

ustatus(0x000)

用户态状态寄存器,用于指示中断启用等状态

位域说明:

  • UIE:全局中断使能位

  • UPIE:中断之前的全局中断使能状态

uie(0x004)

用户态中断启用寄存器,用于单独控制用户态中断源

utvec(0x005)

用户态中断向量基地址寄存器。通常存储用户模式的异常处理程序入口地址

3. 超级模式(Supervisor Mode)CSR

超级模式用于运行操作系统及其内核服务

sstatus(0x100)

超级用户态状态寄存器,存储系统级全局状态

位域说明:

  • SIE:超级用户态中断使能位

  • SPIE:中断之前的超级用户态中断状态

  • SPP:中断返回时的超级用户模式

sie(0x104)

超级用户态中断启用寄存器,控制特定中断源

stvec(0x105)

超级用户态中断向量基地址寄存器,保存异常和中断处理程序入口

scounteren(0x106)

用户态计数器访问控制寄存器,用于限制用户模式对计数器的访问

sscratch(0x140)

临时保存寄存器,通常用于保存异常处理相关的数据

sepc(0x141)

超级用户态异常程序计数器,保存异常发生时的程序计数器值

scause(0x142)

超级用户态异常原因寄存器,指出异常的来源和性质

stval(0x143)

超级用户态异常值寄存器,存储与异常相关的数据

sip(0x144)

超级用户态中断挂起寄存器,指示未决中断

4. 机器模式(Machine Mode)CSR

机器模式是RISC-V中最高权限的模式,负责初始化、配置和管理处理器

mstatus(0x300)

机器态状态寄存器,提供全局状态信息

位域说明:

  • MIE:机器态中断使能位

  • MPIE:中断之前的机器态中断状态

  • MPP:中断返回时的超级用户级别

mie(0x304)

机器态中断启用寄存器,用于启用机器级别的中断

mtvec(0x305)

机器态中断向量基地址寄存器,指示异常或中断的处理程序地址

mscratch(0x340)

临时保存寄存器,通常在异常处理期间使用

mepc(0x341)

机器态异常程序计数器,存储异常发生时的PC值

mcause(0x342)

机器态异常原因寄存器,指示异常或中断的原因

mtval(0x343)

机器态异常值寄存器,提供与异常相关的附加信息

mip(0x344)

机器态中断挂起寄存器,指示未决的中断源

5. 性能监控CSR

RISC-V提供性能监控相关的CSR,用于分析程序性能

mcycle(0xB00)

机器态周期计数器,记录自处理器启动以来的时钟周期数

minstret(0xB02)

指令退休计数器,记录完成执行的指令数量

mhpmcounter3-31(0xB03-0xB1F)

性能监控计数器,可编程用于统计特定的硬件事件(如缓存命中次数)

mhpmcounter3h-31h(0xB83-0xB9F)

64位架构中性能监控计数器的高位部分

6. 用户可访问的CSR

某些CSR即使在用户模式下也可以访问,主要包括以下内容:

cycle(0xC00)

周期计数器,用户可读

time(0xC01)

时间计数器,基于RTC的全局时间

instret(0xC02)

指令退休计数器,用户可读

hpmcounter3-31(0xC03-0xC1F)

用户模式下的性能监控计数器

7. 示例

读取CSR的值

使用RISC-V的内联汇编指令可以直接读取CSR寄存器的值。以下是一个读取sscratch寄存器的示例:

csrr a0, sscratch

写入CSR的值

某些CSR允许写入,例如sscratch。以下代码示例展示如何将值写入sscratch寄存器:

csrw mscratch, a0

说明

  • 代码中的csrrcsrw是RISC-V的汇编指令,分别用于读取和写入CSR寄存器。
  • 不同处理器实现可能对CSR支持有所差异,需要确保目标平台支持这些寄存器。
  • 如果需要对CSR进行更多操作,建议参考RISC-V特权架构规范

7.1 进入示例

下载测试代码

下载解压并进入示例目录

7.2 编译

make
```
## 7.3 **运行**
```
make run

运行后LOG如下

qemu-system-riscv64 -nographic -machine virt -m 128M -bios m_mode.bin -device loader,file=s_mode.bin,addr=0x80200000 -kernel s_mode.elf
_____ ____ _____
/ ____| _ \_ _|
| (___ | |_) || |
\ \___ \| _ < | |
____) | |_) || |_
|_|_____/|____/_____|

sscratch value: 0x0
sscratch value: 0xaabbccdd11223344

详见请参考文档:实验环境搭建。