RISC-V体系架构

RISC-V体系架构

目录

  1. RISC-V指令集特点
  2. RISC-V指令集扩展
  3. RISC-V体系架构特点
  4. RISC-V基本概念
  5. RISC-V处理器模式
  6. SBI接口
  7. RISC-V寄存器
  8. RISC-V系统控制和状态寄存器(CSRs)

1. RISC-V指令集特点

  1. 开源免费 - 完全开放的指令集架构,无专利限制
  2. 设计简洁 - 继承了MIPS的优点,指令数量少而精
  3. 模块化设计 - 支持多种扩展指令集,按需选择
  4. 丰富的软件生态 - 拥有完整的工具链支持
  5. 可扩展性 - 支持自定义指令扩展
  6. 向后兼容 - 新版本保持对旧版本的兼容性
  7. 多宽度支持 - 支持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位(立即数)
相关推荐
玉~你还好吗3 小时前
【嵌入式电机控制#进阶10】参数辨识(一):电阻辨识
单片机·嵌入式硬件
猫头虎3 小时前
2025最新超详细FreeRTOS入门教程:第八章 FreeRTOS任务通知
stm32·单片机·嵌入式硬件·物联网·硬件架构·51单片机·硬件工程
学生董格3 小时前
[嵌入式embed]Keil5烧录后STM32不自动运行,复位才能运行
stm32·单片机·嵌入式硬件
gmmi4 小时前
ARM 基础(3)
嵌入式硬件
九章云极AladdinEdu4 小时前
AI集群全链路监控:从GPU微架构指标到业务Metric关联
人工智能·pytorch·深度学习·架构·开源·gpu算力
蒋星熠4 小时前
深入 Kubernetes:从零到生产的工程实践与原理洞察
人工智能·spring boot·微服务·云原生·容器·架构·kubernetes
即兴小索奇4 小时前
Google AI Mode 颠覆传统搜索方式,它是有很大可能的
前端·后端·架构
敲上瘾5 小时前
Docker 存储卷(Volume)核心概念、类型与操作指南
linux·服务器·数据库·docker·容器·架构
John_ToDebug5 小时前
从源码视角全面解析 Chrome UI 布局系统及 Views 框架的定制化实现方法与实践经验
c++·chrome·架构