初识risc-v
1. 模块化的指令集
risc-v指令集采用模块化的方式进行组织设计,由基本指令集和扩展指令集组成,每个模块用一个英文字母表示。
其中,整数(Integer)指令集用字母“I”表示,这是RISC-V处理器最基本也是唯一强制要求实现的指令集。
其他指令集均为可选模块,可自行选择是否支持。
risc-v指令模块描述如下:
类型 | 指令集 | 指令数 | 状态 | 描述 |
基本指令集 | RV32I | 47 | 批准 | 32位地址与整数指令 支持32个通用寄存器 |
RV32E | 47 | 草稿 | RV32I的子集 支持16个通用寄存器 | |
RV64I | 59 | 批准 | 64位地址与整数指令集及 部分32位整数指令 支持32个通用寄存器 | |
RV128I | 71 | 草稿 | 128位地址与整数指令集及 部分64位和32位整数指令 支持32个通用寄存器 | |
扩展指令集 | M | 8 | 批准 | 乘法(Multiplication)与除法指令 |
A | 11 | 批准 | 存储器原子(Automic)操作指令 | |
F | 26 | 批准 | 单精度(32bit)浮点(Float)运算指令 | |
D | 26 | 批准 | 双精度(64bit)浮点(Double)运算指令 | |
C | 46 | 批准 | 压缩(Compressed)指令,指令长度位16bit | |
Zicsr | 6 | 批准 | 控制和状态寄存器访问指令 |
tip
以上指令集描述基于20191213版非特权指令集规范手册,最新指令模块说明参考官网指令集规范手册
info
通常把模块“I”、“M”、“A”、“F”和“D”的特定组合“IMAFD”称为通用组合(General),用字母“G”表示。如用RV32G表示RV32IMAFD。
2. 可配置的寄存器
RV32I支持32个通用寄存器x0~x31,每个寄存器长度均为32位,其中寄存器x0恒为0,剩余31个为任意读/写的通用寄存器。
为了增加汇编程序的阅读性,汇编编程时通常采用应用程序二进制接口协议(Application Binary Interface,ABI)定义的寄存器名称。
RV32I通用寄存器如下:
寄存器名称 | ABI名称 | 说明 | 存储者 |
---|---|---|---|
x0 | zero | 读取时总为0,写入时不起任何效果 | N/A |
x1 | ra | 程序返回地址 | Caller |
x2 | sp | 栈空间指针 | callee |
x3 | gp | 全局变量指针(基地址) | / |
x4 | tp | 线程变量指针(基地址) | / |
x5 ~ x7 | t0 ~ t2 | 临时寄存器 | Caller |
x8 | s0/fp | 保存寄存器/帧指针(配合栈指针界定函数栈) | Callee |
x9 | s1 | 保存寄存器(被调用函数使用时需备份并在退出时恢复) | Callee |
x10, x11 | a0, a1 | 函数参数寄存器(用于函数参数/返回值) | Caller |
x12 ~ x17 | a2 ~ a7 | 函数参数寄存器(用于函数参数) | Caller |
x18 ~ x27 | s2 ~ s11 | 保存寄存器(被调用函数使用时需备份并在退出时恢复) | Callee |
x28 ~ x31 | t3 ~ t6 | 临时寄存器 | Caller |
Caller:来访者,简单来说就是打电话的,即调用函数的函数,
Callee:被访者,简单来说就是接电话的,即被调用函数
寄存器的宽度由ISA指定,如RV32的通用寄存器宽度为32位,RV64的通用寄存器宽度为64位。
如果支持浮点指令,则需额外支持32个浮点(Float Point)寄存器
不同于arm,risc-v中PC指针不占用通过寄存器,而是独立的,程序执行中自动变化,无法通过通用寄存器访问和修改PC值。
note
此外,risc-v还定义了一组控制和状态寄存器(Control and Status Registers,CSR),用于记录内核运行状态。
详情参考特权指令集规范
3. 特权级别
risc-v规定如下四个特权级别(privilege level):
等级(Level) | 编码(Encoding) | 名称(Name) | 缩写(Abbreviation) |
---|---|---|---|
0 | 00 | 用户/应用模式(User/Application) | U |
1 | 01 | 管理员模式(Supervisor ) | S |
2 | 10 | Reserved | - |
3 | 11 | 机器模式(Machine) | M |
- 机器模式(M),risc-v处理器在复位后自动进入机器模式(M),因此,机器模式是所有RISC-V处理器唯一必须要实现的特权模式。此模式下运行的程序权限最高,支持处理器的所有指令,可以访问处理器的全部资源。
- 用户模式(U),该模式是可选的,权限最低。此模型下仅可访问限定的资源。
- 管理员模式(S),该模式也是可选的,旨在支持Linux、Windows等操作系统。管理员模式可访问的资源比用户模式多,但比机器模式少。
通过不同特权模式的组合,可设计面向不同应用场景的处理器,如:
模式数量 | 支持模式 | 目标应用 |
---|---|---|
1 | M | 简单嵌入式系统 |
2 | M,U | 安全嵌入式系统 |
3 | M,S,U | 支持Unix、Linux、Windows等操作系统 |