跳到主要内容

初识risc-v

riscv_logo

1. 模块化的指令集

risc-v指令集采用模块化的方式进行组织设计,由基本指令集和扩展指令集组成,每个模块用一个英文字母表示。

其中,整数(Integer)指令集用字母“I”表示,这是RISC-V处理器最基本也是唯一强制要求实现的指令集。

其他指令集均为可选模块,可自行选择是否支持。

risc-v指令模块描述如下:

类型指令集指令数状态描述
基本指令集RV32I47批准32位地址与整数指令
支持32个通用寄存器
RV32E47草稿RV32I的子集
支持16个通用寄存器
RV64I59批准64位地址与整数指令集及
部分32位整数指令
支持32个通用寄存器
RV128I71草稿128位地址与整数指令集及
部分64位和32位整数指令
支持32个通用寄存器
扩展指令集M8批准乘法(Multiplication)与除法指令
A11批准存储器原子(Automic)操作指令
F26批准单精度(32bit)浮点(Float)运算指令
D26批准双精度(64bit)浮点(Double)运算指令
C46批准压缩(Compressed)指令,指令长度位16bit
Zicsr6批准控制和状态寄存器访问指令
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名称说明存储者
x0zero读取时总为0,写入时不起任何效果N/A
x1ra程序返回地址Caller
x2sp栈空间指针callee
x3gp全局变量指针(基地址)/
x4tp线程变量指针(基地址)/
x5 ~ x7t0 ~ t2临时寄存器Caller
x8s0/fp保存寄存器/帧指针(配合栈指针界定函数栈)Callee
x9s1保存寄存器(被调用函数使用时需备份并在退出时恢复)Callee
x10, x11a0, a1函数参数寄存器(用于函数参数/返回值)Caller
x12 ~ x17a2 ~ a7函数参数寄存器(用于函数参数)Caller
x18 ~ x27s2 ~ s11保存寄存器(被调用函数使用时需备份并在退出时恢复)Callee
x28 ~ x31t3 ~ t6临时寄存器Caller
  • Caller:来访者,简单来说就是打电话的,即调用函数的函数,

  • Callee:被访者,简单来说就是接电话的,即被调用函数

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)
000用户/应用模式(User/Application)U
101管理员模式(Supervisor )S
210Reserved-
311机器模式(Machine)M
  • 机器模式(M),risc-v处理器在复位后自动进入机器模式(M),因此,机器模式是所有RISC-V处理器唯一必须要实现的特权模式。此模式下运行的程序权限最高,支持处理器的所有指令,可以访问处理器的全部资源。
  • 用户模式(U),该模式是可选的,权限最低。此模型下仅可访问限定的资源。
  • 管理员模式(S),该模式也是可选的,旨在支持Linux、Windows等操作系统。管理员模式可访问的资源比用户模式多,但比机器模式少。

通过不同特权模式的组合,可设计面向不同应用场景的处理器,如:

模式数量支持模式目标应用
1M简单嵌入式系统
2M,U安全嵌入式系统
3M,S,U支持Unix、Linux、Windows等操作系统