【RISC-V】RISC-V寄存器简介

一、通用寄存器

32位RISC-V体系结构提供32个32位的整型通用寄存器
寄存器 别名 全称 说明
X0 zero 零寄存器 可做源寄存器(rs)或目标寄存器(rd)
X1 ra 链接寄存器 保存函数返回地址
X2 sp 栈指针寄存器 指向栈的地址
X3 gp 全局寄存器 用于链接器松弛优化
X4 tp 线程寄存器 常用于在OS中保存指向进程控制块(task_struct)数据结构的指针
X5 ~ X7
X28 ~ X31
t0 ~ t6 临时寄存器
X8 s0/fp 帧指针寄存器 用于函数调用,被调用函数需保存数据
X9 s1 用于函数调用 ,被调用函数需要保存的数据
X10 ~ X17 a0 ~ a7 用于函数调用,传递参数和返回值
X18 ~ X27 s2 ~ s11 用于函数调用 ,被调用函数需要保存的数据

二、系统寄存器

系统控制状态寄存器(CSR)。

【RISC-V】RISC-V寄存器简介_第1张图片
CSR地址空间映射:

地址范围 bit[11:10] bit[9:8] bit[7:4] 访问模式 访问权限
0x000 ~ 0x0FF 00 00 xxxx U RW
0x400 ~ 0x4FF 01 00 xxxx U RW
0x800 ~ 0x8FF 10 00 xxxx U RW(用户自定义系统寄存器)
0xC00 ~ 0xC7F 11 00 0xxx U RO
0xC80 ~ 0xCBF 11 00 10xx U RO
0xCC0 ~ 0xCFF 11 00 11xx U RO
0x100 ~ 0x1FF 00 01 xxxx S RW
0x500 ~ 0x57F 01 01 0xxx S RW
0x580 ~ 0x5BF 01 01 10xx S RW
0x5C0 ~ 0x5FF 01 01 11xx S RW(用户自定义系统寄存器)
0x900 ~ 0x97F 10 01 0xxx S RW
0x980 ~ 0x9BF 10 01 10xx S RW
0x9C0 ~ 0x9FF 10 01 11xx S RW(用户自定义系统寄存器)
0xD00 ~ 0xD7F 11 01 0xxx S RO
0xD80 ~ 0xDBF 11 01 10xx S RO
0xDC0 ~ 0xDFF 11 01 11xx S RO(用户自定义系统寄存器)
0x300 ~ 0x3FF 00 11 xxxx M RW
0x700 ~ 0x77F 01 11 0xxx M RW
0x780 ~ 0x79F 10 11 100x M RW
0x7A0 ~ 0x7AF 01 11 1010 M RW(用于调试寄存器)
0x7B0 ~ 0x7BF 01 11 1011 M RW(只能用于调试寄存器)
0x7C0 ~ 0x7FF 01 11 11xx M RW(用户自定义系统寄存器)
0xB00 ~ 0xB7F 10 11 0xxx M RW
0xB80 ~ 0xBBF 10 11 10xx M RW
0xBC0 ~ 0xBFF 10 11 11xx M RW(用户自定义系统寄存器)
0xF00 ~ 0xF7F 11 11 0xxx M RO
0xF80 ~ 0xFBF 11 11 10xx M RO
0xFC0 ~ 0xFFF 11 11 11xx M RO(用户自定义系统寄存器)
  • 出发非法指令异常的行为:
    • 访问不存在或未实现的寄存器;
    • 写入RO的系统寄存器
    • 低级别处理器模式下访问高级别处理器模式的系统寄存器(模式级别:M > S > U)

2.1 U模式 系统寄存器

地址 CSR名称 属性 说明
0x001 fflags URW 浮点数累积异常(accrued exception)
0x002 frm URW 浮点数动态舍入模式(dynamic rounding mode)
0x003 fcsr URW 浮点数控制和状态寄存器
0xC00 cycle URO 读取时钟周期,映射到RDCYCLE伪指令
0xC01 time URO 读取time系统寄存器的值,映射到RDTIME伪指令
0xC02 instret URO 执行指令数目,映射到RDINSTRET伪指令
0xC03 ~ 0xC1F hpmcounter3 ~hpmcounter31 性能检测寄存器
  • 补充:
    • RDCYCLE伪指令读取cycle系统寄存器的值,返回物理处理器内核的时钟周期数(并非处理器硬件线程的始终周期数)。主要用于性能监控和调优;
    • RDTIME伪指令读取time系统寄存器的值,获取系统实际时间。系统每次启动时读取CMOS上的RTC计数值,当时钟中断到来时,更新该计数;
    • RDINSTRET伪指令读取instret系统寄存器的值,返回处理器执行线程已经执行的指令数量;
    • hpmcounter用于系统性能检测的寄存器,这些计数器的计数记录平台的事件,并通过额外的特权寄存器进行配置。

2.2 S模式 系统寄存器

地址 CSR名称 属性 说明
0x100 sstatus SRW S模式下的处理器状态寄存器
0x104 sie SRW S模式下的中断使能寄存器
0x105 stvec SRW S模式下的异常向量表入口地址寄存器
0x106 scounteren SRW S模式下的计数使能寄存器
0x10A senvcfg SRW S模式下的环境配置寄存器
0x140 scratch SRW 用于异常处理的临时寄存器
0x141 sepc SRW S模式下的异常模式程序计数器(PC)寄存器
0x142 scause SRW S模式下的异常原因寄存器
0x143 stval SRW S模式下的异常向量寄存器(记录发生异常的虚拟地址)
0x144 sip SRW S模式下的中断待定寄存器
0x180 satp SRW S模式下的地址转换与保护寄存器
0x5A8 scontext SRW S模式下的上下文寄存器(用于调试)
  • 说明:
    • scounteren用于在S模式下,使能U模式下的硬件性能检测和计数寄存器(cycle, time, instret, HPM3~31)
      scratch在从S模式返回U模式时,保存S模式时的进程控制块。

2.3 M模式 系统寄存器

2.3.1 总览表

地址 CSR名称 属性 说明
0xF11 mvendorid MRO 机器厂商ID寄存器
0xF12 marchid MRO 处理器体系结构ID寄存器
0xF13 mimpid MRO 处理器实现版本编号寄存器
0xF14 mhartid MRO 处理器硬件线程(hart)ID寄存器
0xF15 mconfigptr MRO 配置数据结构寄存器
0x300 mstatus MRW M模式下的处理器状态寄存器
0x301 misa MRW 指令集体系结构和扩展寄存器
0x302 medeleg MRW M模式下的异常委托寄存器,把异常委托到S模式下处理
0x303 mideleg MRW M模式下的中断委托寄存器,把中断委托到S模式下处理
0x304 mie MRW M模式下的中断使能寄存器
0x305 mtvec MRW M模式下的异常向量入口地址寄存器
0x306 mcounteren MRW M模式下的计数使能寄存器。用于使能S模式或U模式下的硬件性能检测和计数寄存器。
0x340 mscratch MRW 用于异常处理的临时寄存器
0x341 mepc MRW M模式下的异常模式PC寄存器。处理器陷入M模式时,保存中断或遇到的异常的指令的虚拟地址
0x342 mcause MRW M模式下的异常原因寄存器
0x343 mtval MRW M模式下的异常向量寄存器。处理器陷入M模式时,mtval记录发生异常的虚拟地址。
0x344 mip MRW M模式下的中断待定寄存器。表示哪些中断处与待定状态。
0x34A mtinst MRW M模式下的陷入指令(用于虚拟化)
0x34B mtval2 MRW M模式下的异常向量寄存器(用于虚拟化)

2.3.2 补充

2.3.2.1 misa寄存器

  • misa:表示处理器支持的体系结构和扩展
    • Extensions(bit[25:0]):表示处理器支持的扩展
    • MXL(bit[63:62):表示M模式下寄存器长度
      • 1:32位
      • 2:64位
      • 3:128位
名称 说明
0 A 原子操作扩展
1 B 位操作扩展
2 C 压缩指令扩展
3 D 双精度浮点数扩展
4 E RV32E指令集扩展
5 F 单精度浮点数扩展
6 G 保留
7 H 虚拟化扩展
8 I RV32I/RV64I/RV128I基础指令集扩展
9 J 动态翻译语言扩展
10 K 保留
11 L 保留
12 M 整数乘/除扩展
13 N 用户中断扩展
14 O 保留
15 P SIMD扩展
16 Q 4倍精度浮点数扩展
17 R 保留
18 S 支持S模式
19 T 保留
20 U 支持U模式
21 V 可伸缩矢量扩展
22 W 保留
23 X 非标准扩展
24 Y 保留
25 Z 保留

2.3.2.2 mstatus寄存器

字段 尾段 说明
UIE bit[0]
SIE bit[1] 中断使能位,用于使能和关闭S模式下所有的中断
MIE bit[3] 中断使能位,用于使能和关闭M模式下所有的中断
SPIE bit[5] 中断使能保存位。当一个异常陷入S模式时,SIE的值保存到SPIE中,SIE设置为0。当调用SRET指令返回时,从SPIE中恢复SIE,然后SPIE设置为1
UBE bit[6] 控制U模式下加载和存储指令访问内存的大小端模式。
0:小端。
1:大端。
MPIE bit[7] 中断使能保存位。当一个异常陷入M模式时,MIE的值保存到MPIE中,MIE设置为0。当调用MRET指令返回时,从MPIE中恢复MIE,然后MPIE设置为1
SPP bit[8] 陷入S模式之前的CPU处理模式。
0:从U模式陷入到S模式。
1:在S模式触发的异常。
VS bir[10:9] 使能可伸缩矢量扩展
MPP bit[12:11] 陷入M模式之前CPU的处理模式。
0:从U模式陷入到M模式。
1:从S模式陷入到M模式
2:在M模式触发的异常。
FS bit[14:13] 使能浮点数单元
XS bit[16:15 使能U模式下扩展的其他状态
MPRV bit[17] 修改有效特权模式:
0:加载和存储指令按照当前的处理器模式进行地址转换和内存保护。
加载和存储指令按照MPP字段中存储的处理器模式的权限进行内存保护与检查
SUM bit[18] 指定在S模式下是否允许访问U模式的内存。
0:在S模式下访问U模式下的内存是会触发异常。
1:在S模式下可以访问U模式下的内存
MXR bit[19] 指定访问内存的权限。
0:可以加载只读页面。
1:可以加载可读和可执行的页面
TVM bit[20] 支持拦截S模式下的虚拟内存管理操作
TW bit[21] 支持拦截WFI指令。
0:WFI指令可以在低权限模式下执行。
1:
TSR bit[22] 支持拦截SRET指令。
0:在S模式下正常执行SRET指令。
1:在S模式下执行SRET指令会触发非法指令异常。
UXL bit[33:32] U模式下寄存器长度
SXL bit[35:34] S模式下寄存器长度
SBE bit[36] 控制S模式下加载和内存访问的大小端模式。
0:小端。
1:大端。
MBE bit[37] 控制M模式下加载和内存访问的大小端模式。
0:小端。
1:大端。

你可能感兴趣的:(RISC-V体系结构编程与实践,risc-v)