1. CSR的作用与分类
CSR(Control and Status Registers)是RISC-V体系结构中的一组特殊寄存器,主要用于控制处理器状态、管理中断与异常、以及提供性能监控等功能。CSR被分为以下三种模式级别:
- 用户模式(u-mode)
- 超级模式(s-mode)
- 机器模式(m-mode)
CSR的地址空间使用统一的12位编码,具有特定的访问权限:
- u(用户态)
- s(超级用户态)
- 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
说明
- 代码中的
csrr、csrw是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
详见请参考文档:实验环境搭建。