本文编写于 322 天前,最后修改于 322 天前,其中某些信息可能已经过时。
RISC(reduced instruction set computer)表示精简指令集计算机。V表示第五代。risc-v指令集具有设计简洁、模块化、开源、软件生态丰富等优点。
risc-v针对32位处理器的最小指令集是RV32I,表示32位基础整型指令集,大概包含40条指令,可以实现一个完整的软件栈。RV64I是针对64位处理器的最小指令集,表示64位基础整型指令集。它在RV32I的基础上添加了对word、double word和long的指令支持,并且将所有的寄存器扩展到了64位。
基本概念
-
EEI(execution environment interface 执行环境接口):包括程序的初始状态、CPU的类型和数量、支持的S模式、内存和I/O区域的可访问性与属性、在每个CPU上执行指令的行为以及异常的处理。常见的EEI包括以下接口:
- ABI(application binary interface 应用程序二进制接口)
- SBI(supervisor binary interface 管理员二进制接口):对riscv硬件平台中共性的功能做抽象,为运行在S模式的操作系统或运行在HS模式的虚拟化管理软件提供了统一的服务接口。
IMG_0521.jpeg -
特权级别:
- 机器模式M:M模式具有对机器实现的全部访问权限,通常用于管理安全执行环境,运行SBI固件,为操作系统提供服务
- 特权模式S:S模式通常用于运行操作系统的内核,为应用程序提供服务
- 用户模式U:U模式特权级别最低,通常运行应用程序
- HS模式:由原有的S模式扩展而来,用来运行虚拟化管理程序
- VS模式:运行虚拟机操作系统内核
- VU模式:运行虚拟机操作系统中的应用程序
-
模拟器:在主机上模拟riscv的用户模式以及特权模式的执行环境
-
硬件线程:一个处理器执行线程,在执行环境中自主获取和执行riscv指令资源的硬件单元。SMT技术让同一个处理器内核上的多个线程同步执行并共享处理器的执行资源。
riscv寄存器
通用寄存器
64位的riscv体系结构提供32个64位的整型通用寄存器,分别是x0~x31。对于浮点数运算也提供了32个浮点数通用寄存器,分别是f0~f31。
riscv的通用寄存器通常具有别名和特殊用途:
- x0别名zero:寄存器内容为全0。
- x1别名ra:链接寄存器,用于保存函数返回地址
- x2别名sp:栈指针寄存器,指向栈的地址
- x3别名gp:全局寄存器,用于链接器松弛优化
- x4别名tp:线程寄存器通常用于在操作系统中保存只想进程控制块的指针
- x5~x7 以及 x28~x31为临时寄存器,别名t0~t6
- x8~x9以及x18~x27寄存器的别名分别是s0~s11。在函数调用的过程中使用这些寄存器,需要保存到栈里。s0寄存器还可用作栈指针(frame pointer fp)
- x10~x17寄存器别名a0~a7,在函数调用时传递参数和返回值
在书写汇编指令时可以直接使用别名
系统控制与状态寄存器CSR
通过访问和设置CSR(control and status register)寄存器完成对处理器不同功能的配置。具体分为以下三类CSR(暂时不考虑虚拟化):
- M模式CSR
- S模式CSR
- U模式CSR
以下行为会触发非法指令异常:
- 访问不存在或者未实现的CSR
- 尝试写入只读属性的CSR
- 在低级别模式下访问高级别的CSR