RISC-V体系架构
目录
- RISC-V指令集特点
- RISC-V指令集扩展
- RISC-V体系架构特点
- RISC-V基本概念
- RISC-V处理器模式
- SBI接口
- RISC-V寄存器
- RISC-V系统控制和状态寄存器(CSRs)
1. RISC-V指令集特点
- 开源免费 - 完全开放的指令集架构,无专利限制
- 设计简洁 - 继承了MIPS的优点,指令数量少而精
- 模块化设计 - 支持多种扩展指令集,按需选择
- 丰富的软件生态 - 拥有完整的工具链支持
- 可扩展性 - 支持自定义指令扩展
- 向后兼容 - 新版本保持对旧版本的兼容性
- 多宽度支持 - 支持32位、64位、128位等多种位宽
2. RISC-V指令集扩展
2.1 基础指令集
- RV32I: 32位整型最小指令集合(40条指令)
- RV64I: 64位整型最小指令集合(在RV32I基础上增加64位操作)
- RV32E: 32位嵌入式指令集(16个寄存器版本)
- RV128I: 128位整型指令集合(实验性)
2.2 基础指令类型
- 算术运算: ADD, SUB, MUL, DIV等
- 逻辑运算: AND, OR, XOR, NOT等
- 移位运算: SLL, SRL, SRA等
- 比较运算: SLT, SLTU等
- 分支跳转: BEQ, BNE, JAL, JALR等
- 内存访问: LB, LH, LW, SB, SH, SW等
- 系统调用: ECALL, EBREAK等
2.3 扩展指令集
扩展 |
名称 |
描述 |
M |
整型乘除法 |
整型乘法和除法扩展指令集 |
G |
通用扩展 |
表示IMAFD,即最小整型指令集合+整型乘除法+原子操作+单精度浮点+双精度浮点 |
F |
单精度浮点 |
单精度浮点数扩展指令 |
D |
双精度浮点 |
双精度浮点数扩展指令 |
Q |
四倍精度浮点 |
四倍精度浮点数扩展指令 |
C |
压缩指令 |
压缩指令编码,提高代码密度 |
A |
原子操作 |
原子操作指令 |
B |
位操作 |
位操作指令 |
E |
嵌入式 |
为嵌入式设计的整型操作指令 |
H |
虚拟化 |
虚拟化扩展 |
K |
密码运算 |
密码运算扩展 |
V |
矢量扩展 |
可伸缩矢量扩展 |
P |
打包SIMD |
打包SIMD扩展(Packed-SIMD) |
J |
动态翻译 |
动态翻译扩展 |
T |
事务内存 |
事务内存扩展 |
N |
用户态中断 |
用户态中断扩展 |
注意: 实现最小指令集合和M扩展即可运行一个小型操作系统
3. RISC-V体系架构特点
- 完全开放 - 一个完全开放的指令集架构
- 硬件友好 - 真正适合硬件实现的架构,而不是模拟或二进制翻译的指令集架构
- 通用设计 - 通用的指令集架构,而不是针对某个特定微架构的实现
- 教学友好 - 最小集合的整数指令集可用作教学,在此基础上可实现众多扩展指令集
- 标准兼容 - 支持IEEE-754浮点标准
- 模块化 - 支持众多扩展指令集
- 多地址空间 - 支持32位和64位地址空间
- 多核支持 - 支持多核与异构
- 代码优化 - 支持可选的压缩指令编码,提高性能、能源效率和优化静态代码大小
- 虚拟化 - 支持虚拟化扩展
- 矢量计算 - 支持可伸缩矢量指令扩展
4. RISC-V基本概念
4.1 执行环境(EEI)
- 执行环境接口(Execution Environment Interface):定义软件与硬件之间的接口规范
4.2 哈特(Hart)
- 定义: 表示一个CPU硬件执行单元
- 类比:
- X86架构:超线程(Simultaneous Multithread SMT)
- ARMv8架构:处理机(Processing Element PE)
5. RISC-V处理器模式
5.1 三种基本模式
- 机器模式(M): 运行SBI固件,为操作系统提供服务
- 特权模式(S): 运行操作系统内核,为应用程序提供服务
- 用户模式(U): 运行应用程序
5.2 特权级别配置
特权级别个数 |
支持的特权级别 |
使用场景 |
1 |
M |
嵌入式系统 |
2 |
M和U |
具有安全特性的嵌入式系统 |
3 |
M、S、U |
通用操作系统 |
5.3 虚拟化扩展
虚拟化扩展新增以下模式:
- HS模式: 主机特权模式
- VS模式: 虚拟特权模式
- VU模式: 虚拟用户模式
6. SBI接口
6.1 定义
- Supervisor Binary Interface: 对所有RISC-V硬件平台中共性的功能做了抽象,为运行在S模式下的操作系统和HS模式下的虚拟化管理软件提供统一的接口
- 类比: 类似操作系统中的系统调用层或者X86的BIOS
6.2 OpenSBI实现
RISC-V有一个通用的SBI实现:OpenSBI
主要功能:
- 为运行在低级别的处理器模式提供访问M模式硬件资源的抽象接口
- 保证系统稳定和安全
- 提供良好的可移植性
7. RISC-V寄存器
7.1 寄存器配置
- 64位RISC-V: 提供32个通用寄存器(x0-x31)
- 浮点寄存器: 提供32个浮点通用寄存器(f0-f31)
7.2 通用寄存器功能分配
寄存器 |
名称 |
功能 |
x0/zero |
零寄存器 |
恒为0,常用于比较和清零操作 |
x1/ra |
链接寄存器 |
存储函数返回地址 |
x2/sp |
栈指针寄存器 |
指向当前栈顶 |
x3/gp |
全局指针寄存器 |
指向全局数据区 |
x4/tp |
线程指针寄存器 |
指向线程本地存储 |
x5-x7, x28-x31 |
临时寄存器(t0-t6) |
临时存储,调用者保存 |
x8-x9, x18-x27 |
保存寄存器(s0-s11) |
被调函数需要保存 |
x10-x17 |
参数寄存器(a0-a7) |
传递参数和返回结果 |
8. RISC-V系统控制和状态寄存器(CSRs)
8.1 系统寄存器分类
RISC-V支持3类系统寄存器:
- M模式系统寄存器 - 机器模式专用
- S模式系统寄存器 - 特权模式专用
- U模式系统寄存器 - 用户模式专用
8.2 CSR指令编码
软件通过CSR指令访问系统寄存器(如CSRRW),在CSR指令编码中预留了12位编码空间用于索引系统控制寄存器:
位域 |
字段 |
描述 |
bit31-bit20 |
CSR |
系统控制寄存器索引 |
bit19-bit15 |
源操作数 rs1 |
源寄存器 |
bit14-bit12 |
功能码 funct3 |
操作类型 |
bit11-bit7 |
目标寄存器 rd |
目标寄存器 |
bit6-bit0 |
指令操作码 opcode |
指令操作码 |
8.3 12位CSR编码空间分组
读写控制(bit11-bit10)
访问权限(bit9-bit8)
- 0b00: U模式访问
- 0b01: S模式访问
- 0b10: M模式访问
- 0b11: HS/VS模式访问
8.4 非法指令异常触发条件
- 访问不存在或未实现的寄存器
- 尝试写入具有只读属性的寄存器
- 在低级别模式下访问高级别处理器模式的系统寄存器
8.5 M模式系统控制和状态寄存器
地址 |
CSR名称 |
属性 |
说明 |
0xF11 |
mvendorid |
MRO |
机器厂商ID寄存器 |
0xF12 |
marchid |
MRO |
架构编号寄存器 |
0xF13 |
mimpid |
MRO |
实现编号寄存器 |
0xF14 |
mhartid |
MRO |
处理器硬件线程编号寄存器 |
0xF15 |
mconfigptr |
MRO |
配置数据结构寄存器 |
0x300 |
mstatus |
MRW |
M模式处理器状态寄存器 |
0x301 |
misa |
MRW |
指令集架构和扩展寄存器 |
0x302 |
medeleg |
MRW |
M模式异常委托寄存器 |
0x303 |
mideleg |
MRW |
M模式中断委托寄存器 |
0x304 |
mie |
MRW |
M模式中断使能寄存器 |
0x305 |
mtvec |
MRW |
M模式的异常向量入口地址寄存器 |
0x306 |
mcounteren |
MRW |
M模式的计数使能寄存器 |
0x340 |
mscratch |
MRW |
用于异常处理的临时寄存器 |
0x341 |
mepc |
MRW |
M模式异常模式程序计数器(PC)寄存器 |
0x342 |
mcause |
MRW |
M模式的异常原因寄存器 |
0x343 |
mtval |
MRW |
M模式的异常向量寄存器 |
0x344 |
mip |
MRW |
M模式中断待定寄存器 |
0x34A |
mtinst |
MRW |
M模式陷入指令(用于虚拟化) |
0x34B |
mtval2 |
MRW |
M模式的异常向量寄存器(用于虚拟化) |
8.5.1 mstatus寄存器(机器状态寄存器)
字段 |
位段 |
说明 |
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 |
Bit[10:9] |
用来使能可伸缩矢量扩展(RVV) |
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:加载和存储指令根据当前处理器模式执行地址转换和内存保护 1:加载和存储指令根据MPP字段中存储的处理器模式特权执行内存保护检查 |
SUM |
Bit[18] |
S模式是否允许访问U模式内存。0:S模式访问U模式内存将触发异常 1:S模式可以访问U模式内存 |
MXR |
Bit[19] |
内存访问权限。0:可以加载只读页面 1:可以加载可读和可执行页面 |
TVM |
Bit[20] |
支持捕获S模式虚拟内存管理操作。0:在S模式下,satp系统寄存器可以正常访问,或可以执行SFENCE.VMA/SINVAL.VMA指令 1:在S模式下,访问satp系统寄存器或执行SFENCE.VMA/SINVAL.VMA指令将触发非法指令异常 |
TW |
Bit[21] |
支持捕获WFI(等待中断)指令。0:WFI指令可以在低特权模式下执行 1:如果在任何低特权模式下执行WFI且未在特定实现指定的有限时间内完成,WFI指令将触发非法指令异常 |
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:大端模式 |
SD |
Bit[63] |
用来指示VS、FS和XS中任何字段已被设置 |
8.6 S模式系统控制和状态寄存器
CSR地址 |
寄存器名称 |
功能描述 |
访问权限 |
0x100 |
sstatus |
特权状态寄存器 |
读写 |
0x104 |
sie |
特权中断使能寄存器 |
读写 |
0x105 |
stvec |
特权异常向量基址寄存器 |
读写 |
0x106 |
scounteren |
用来使能U模式下的硬件性能检测和计数寄存器 |
读写 |
0x10a |
senvcfg |
特权环境配置寄存器 |
读写 |
0x140 |
sscratch |
特权模式暂存寄存器,当处理器运行在S模式时保存U模式下的进程控制块地址 |
读写 |
0x141 |
sepc |
特权异常程序计数器 |
读写 |
0x142 |
scause |
特权异常原因寄存器 |
读写 |
0x143 |
stval |
特权异常值寄存器 |
读写 |
0x144 |
sip |
特权中断挂起寄存器 |
读写 |
0x180 |
satp |
特权地址转换和保护寄存器 |
读写 |
0x58a |
scontext |
特权上下文寄存器 |
读写 |
8.6.1 sstatus寄存器字段详细说明
字段 |
位域 |
访问权限 |
描述 |
SD |
[31] |
只读 |
当US、FS或XS字段不为0时,SD位被设置为1 |
UXL |
[33:32] |
读写 |
U模式XLEN位,控制U模式下的寄存器长度,00=32位,01=64位,10=128位 |
WPRI |
[30:16] |
保留 |
保留位,未来扩展使用 |
MXR |
[19] |
读写 |
访问内存的权限,0可加载只读页面,1可加载可读可执行页面 |
SUM |
[18] |
读写 |
允许用户内存访问位,当SUM为1时,S模式下能访问U模式下的内存,为0访问时会触发异常 |
US |
[16:15] |
读写 |
用来使能U模式下其他扩展 |
FS |
[14:13] |
读写 |
用于使能浮点数运算单元 |
VS |
[10:9] |
读写 |
用来使能可伸缩矢量扩展 |
SPP |
[8] |
读写 |
特权模式前一个特权级别,保存进入S模式前的特权级别 |
UBE |
[6] |
读写 |
用来控制U模式下的内存访问大小端模式,0小端模式,1大端模式 |
SPIE |
[5] |
读写 |
S模式前一个中断使能位,保存进入S模式前的中断使能状态 |
SIE |
[1] |
读写 |
特权中断使能位,控制S模式中断使能 |
8.6.2 satp寄存器(特权地址转换和保护寄存器)
位域 |
字段名 |
描述 |
[63:60] |
MODE |
地址转换模式 |
[59:44] |
ASID |
地址空间标识符 |
[43:0] |
PPN |
页表物理页号 |
8.8.9 CSR访问指令
8.8.9.1 基本CSR指令
指令 |
格式 |
功能 |
描述 |
CSRRW |
csrrw rd, csr, rs1 |
rd = csr; csr = rs1 |
原子性读写CSR |
CSRRS |
csrrs rd, csr, rs1 |
rd = csr; csr = csr | rs1 |
原子性读并设置CSR位 |
CSRRC |
csrrc rd, csr, rs1 |
rd = csr; csr = csr & ~rs1 |
原子性读并清除CSR位 |
CSRRWI |
csrrwi rd, csr, imm |
rd = csr; csr = imm |
原子性读写CSR(立即数) |
CSRRSI |
csrrsi rd, csr, imm |
rd = csr; csr = csr | imm |
原子性读并设置CSR位(立即数) |
CSRRCI |
csrrci rd, csr, imm |
rd = csr; csr = csr & ~imm |
原子性读并清除CSR位(立即数) |