从零开始学RISC:第一篇
RISC-V:缘起名校、兴于开源
RISC-V (英文读作“risk-five”) 架构主要由美国加州大学伯克利分校的众多教授于 2010 年发明。RISC-V 是一种全新的指令集架构,里面的“V”包含两层意思:一是这是加州大学伯克利分校从 RISC I 开始设计的第五代指令集架构;二是它代表了变化(variation)和向量(vector)。
经过几年的开发,加州大学伯克利分校为 RISC-V 架构开发出了完整的软件工具链以及若干开源的处理器实例,使 RISC-V 架构得到越来越多的关注。2015 年,RISC-V 基金会正式成立并开始运作。 RISC-V 基金会是一个非营利性组织,负责维护标准的 RISC-V 指令集手册与架构文档,并推动 RISC-V 架构的发展。
RISC-V 架构的发展目标如下:
- 成为一种完全开放的指令集,可以被任何学术机构或商业组织自由使用。
- 成为一种真正适合硬件实现且稳定的标准指令集。
Less is God
RISC-V 的设计理念很简单:大道至简。它力图通过架构的定义使硬件的实现足够简单。
模块化指令集
RlSC-V 的指令集使用模块化的方式进行组织。。使用整数指令子集(以字母 I 结尾),便能够实现完整的软件编译器。其他的指令集均为可选的模块,具有代表性的模块包括 M/A/F/D/C,如下表。
基本指令集 | 指令数 | 描述 |
---|---|---|
RV32I | 47 | 支持 32 位地址空间与整数指令,支持 32 个通用整数寄存器 |
RV32E | RV32I 的子集,仅支持 16 个通用整数寄存器 | |
RV64I | 59 | 支持 64 位地址空间与整数指令及一部分 32 位的整数指令 |
RV128I | 71 | 支持 128 位地址空间与整数指令及一部分 64 位和 32 位的指令 |
扩展指令集则如下表所示:
扩展指令集 | 指令数 | 描述 |
---|---|---|
M | 8 | 整数乘法与除法指令 |
A | 11 | 存储器原子(atomic)操作指令和 Load-Reserved/Store-Conditional 指令 |
F | 26 | 单精度(32 位)浮点指令 |
D | 双精度(64 位)浮点指令,必须支持 F 扩展指令集 | |
C | 46 | 压缩指令,指令长度为 16 位 |
高效的分支跳转
RISC-V 架构有两条无条件跳转(unconditional jump)指令,即jal
指令与jalr
指令。跳转链接jal
指令可用于进行子程序调用,同时将子程序返回地址存放在链接寄存器(LR,由某一个通用整数寄存器担任)中。跳转链接寄存器jalr
指令能够用于从子程序返回。通过将jal
指令所在的链接寄存器作为jalr
指令的基地址寄存器,jalr
指令可以从子程序返回。
RISC-V 架构有 6 条带条件的跳转指令,这种带条件的跳转指令与普通的运算指令一样直接使用两个整型操作数,然后对其进行比较。如果比较的条件满足,则进行跳转,因此此类指令将比较与跳转两个操作放在一条指令内完成。这种带条件的跳转指令不仅减少了指令的条数,还简化了硬件设计。
三种特权模式
RISC-V 架构定义了 3 种工作模式,又称为特权模式(privileged mode):
- 机器模式(machine mode),简称 M 模式
- 监督模式(supervisor mode) ,简称 S 模式
- 用户模式(user mode) ,简称 U 模式
RISC-V 架构定义机器模式为必选模式,另外两种为可选模式,通过不同的模式组合可以实现不同的系统。
地址可以不对齐?!
RISC-V 架构的存储器读和存储器写指令支持以一字节 (8 位)、半字(16位)、单字(32 位)为单位的存储器读写操作。64 位架构还可以支持以双字(64 位)为单位的存储器读写操作。
为了提高存储器读写的速度,RISC-V 架构推荐使用地址对齐的存储器读写操作,但是也支持地址非对齐的存储器操作 RISC-V 架构。处理器既可以选择用硬件来支持,也可以选择用软件来支持。
Load-Store架构
与 ARMv8 一样,RV32I 也是 Load-Store 架构,只有加载和存储指令访问内存,而算数指令只操作 CPU 寄存器。在RISC-V中,统一使用小端格式,字节序是按字节编址的不变量。