RISC-V体系架构
目录
- RISC-V指令集特点
- RISC-V指令集扩展
- RISC-V体系架构特点
- RISC-V基本概念
- RISC-V处理器模式
- SBI接口
- RISC-V寄存器
- RISC-V系统控制和状态寄存器(CSRs)
- 8.1 系统寄存器分类
- 8.2 CSR指令编码
- 8.3 12位CSR编码空间分组
- 8.4 非法指令异常触发条件
- 8.5 M模式系统控制和状态寄存器
- 8.5.1 mstatus寄存器(机器状态寄存器)
- 8.6 S模式系统控制和状态寄存器
- 8.6.1 sstatus寄存器字段详细说明
- 8.6.2 satp寄存器(特权地址转换和保护寄存器)
- 8.8.9 CSR访问指令
- 8.8.9.1 基本CSR指令
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)
- 0b11: 只读寄存器
- 其他值: 可读写寄存器
访问权限(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位(立即数) |