RISCV基础知识
一、ISA指令集
ISA 命名格式:RV [###] [abc…xyz]
RV:用于标识 RISC-V体系架构的前缀,既 RISC-V 的缩写。
[###] :{32, 64, 128} 用于标识处理器的字宽,也就是处理器的寄存器的宽度(单位为bit)。
[abc…xyz] :标识该处理器支持的指令集模块集合。
例子:RV32IMA,RV64GC
增量化:即下一代兼容上一代处理器的ISA
模块化:指令集的构成由1个基本整数指令集加上多个可选的扩展指令集组成,基础指令集是固定的,永远不会改变。
1.1基础整数指令集
是唯一强制要求实现的基础指令集,其他指令集都是可选的扩展模块。
1.2扩展指令集
RISC-V 允许在实现中以可选的形式实现其他标准化和非标准化的指令集扩展。
特定组合“IMAFD”被称为“通用(General)”组合,用英文字母G表示。
例子:
RV32I:最基本的 RISC-V 实现。
RV32IMAC:32位实现,支持 Integer + Multiply + Atomic + Compressed 。
RV64GC:64位实现,支持 IMAFDC 。
二、术语
2.1Hart
hardware thread 硬件线程,一个处理器有多个执行流
2.2特权级别
2.3 IALIGN
instruction-address alignment constraint the implementation enforces指令地址强制对齐,参看第三点
2.4ILEN
the maximum instruction length supported by an implementation
所支持的最大指令长度
2.5 EEI
execution environment interface执行环境接口
定义了程序的初始状态、环境中 hart 的数量和类型(包括 hart 支持的权限模式)、内存和 I/O 区域的可访问性和属性、在每个 hart 上执行的所有合法指令的行为(即 ISA 是 EEI 的一个组件), 以及处理执行过程中引发的任何中断或异常,包括环境调用。
RISC-V 里面用的是管理程序二进制接口 (SBI) supervisor binary interface
2.6分支延迟槽
为了避免流水线气泡。
假设我们在执行阶段才知道比较跳转指令beq需要跳转,那么此时已经在取指、译码的两条指令会无效,下一个时钟周期需要把它们清空,于是流水线出现两个周期的气泡,即浪费了两个clk,
那我们索性不清空取指阶段指令,让它继续执行,反正下一个指令是跳转指令,只要有个标记知道它是“多出”的指令,称为“延迟槽指令”。所以把转移指令后面的指令位置称为“延迟槽”。这样流水线就没有气泡了。
这种方法的思想其实是去延长分支指令的执行时间,因此多出来的时间可以用来填补上图分支预测失败导致的丢弃指令的操作。那么如何延长呢?其实就是通过设置延迟槽(slot),一般来说,延迟槽都是一个,且无论分支是否成功,都需要执行延迟槽中的指令。
总而言之,延迟槽的作用就是通过找与分支无关的指令(或者不影响分支运行的指令)去充分利用分支的空间,进而削弱预测分支的副作用,减少分支延迟。
2.7 RAS
return address stack返回地址堆栈,使用容量有限的硬件堆栈来存储函数调用(间接跳转)的返回地址。
三、指令集编码
3.1基本指令集编码
base insturction是32位对齐的;但是一些扩展指令是16位对齐的
IALIGN--instruction-address alignment constraint the implementation enforces
ILEN --(measured in bits) refer to the maximum instruction length supported by an implementation。他是IAIGN的倍数。对于仅支持基本指令集的实现,ILEN 为 32 位。支持较长指令的 implementations 具有更大的 ILEN 值。
3.2扩展指令集编码
标准的 RISC-V 指令长度编码约定。基本 ISA 中的所有 32 位指令的最低 2 位都设置为 11。可选的压缩 16 位指令集扩展的最低两位等于 00、01 或 10。
低16位全为0的指令是非法的;指令位全为1或0的指令也是非法的
ISA基础指令小端序和大端序都是可以的,与 内存系统的序是解耦的。
四、中断(interrupts)、异常(exceptions)与陷入(traps)
4.1 中断
是由CPU外部产生的,对CPU来说,是被动的。
当中断发生时,CPU将下一条指令,也就是接下来要执行的指令的地址压入栈作为中断服务的返回地址。
4.2陷入
是由CPU本身在执行程序过程中产生的。它是由专设的指令,如X86中的“INT n”,在程序中有意产生的,是主动的。
同中断一样,当陷入发生时,CPU将下一条指令,也就是接下来要执行的指令的地址压入栈,作为中断服务的返回地址。
4.3异常(或称fault)
是由于CPU因无法完成一些指令而产生的,如除以0、映射失败,等等。
当异常发生时,CPU将当前指令的地址(而不是下一条指令的地址)压入栈,作为异常服务的返回地址。这样,就可以在异常处理返回时完成未完成的事业。
这个特殊性是在CPU的内部电路实现的,而不需由软件干预。即是由Intel实现的,和微软没关系。
五、原子操作的概念
在RISC-V架构中,原子操作是指不可分割的操作,即在操作执行过程中不会被其他操作中断
RISC-V的内存模型定义了原子操作的顺序和一致性规则。原子操作通常具有强内存顺序语义,确保在多核或多线程环境中的正确性。为了进一步控制内存操作的顺序,RISC-V还提供了FENCE指令,用于显式地强制执行内存屏障。
本文部分 参看博客RISC-V入门(基础概念+汇编部分) 基于 汪辰老师的视频笔记_risc-v csdn-CSDN博客
如有侵权请联系删除