RISC-V 基础知识
RISC-V 是一套开放的指令集架构(ISA)标准;它规定软件可见的机器接口,不等于某一款处理器芯片。
一句话: RISC-V 是一套开放的指令集架构(ISA)标准;它规定软件可见的机器接口,不等于某一款处理器芯片。
本章导航#
ISA 是什么 · RISC 与 CISC · CPU 怎样执行程序 · RISC-V 的组成 · 扩展命名 · 学习路径
学习目标#
- 区分 ISA、微架构、汇编和机器码。
- 说清一条指令从取指到更新 PC 的基本过程。
- 理解 RISC-V 基础整数寄存器、指令格式与扩展字母的作用。
1. ISA 是什么#
**ISA(Instruction Set Architecture,指令集架构)**是硬件与低层软件之间的契约。它定义指令的编码和语义、可见寄存器、内存访问规则、异常/特权行为等。编译器按 ISA 生成指令,处理器实现这些规则。
C / Rust 等源程序 ↓ 编译器汇编助记符(便于人阅读) ↓ 汇编器机器码(指令的二进制编码) ↓ 处理器实现 ISA执行结果例如,a = b + c 可能变成 add x5, x6, x7,再由汇编器编码成机器字。微架构则说明某个具体 CPU 内部如何实现这些规则(流水线、缓存、预测器等);不同微架构可以实现同一 ISA。
易混点: ISA 不规定 C 语言的所有类型、编译器优化策略或 CPU 内部电路布局。
2. RISC 与 CISC#
RISC(精简指令集)与 CISC(复杂指令集)是历史设计理念的概括,不是“指令少就一定快”的性能结论。
| 维度 | 常见 RISC 风格 | 常见 CISC 风格 |
|---|---|---|
| 设计倾向 | 指令语义较规整、便于流水化 | 提供较复杂或更密集的指令编码 |
| 内存运算 | 常采用 load/store:先读寄存器,再运算 | 部分指令可直接把内存作为操作数 |
| 编码 | 基础指令常规整;扩展可能改变长度 | 常见可变长度编码 |
| 例子 | RISC-V、AArch64 | x86-64 |
现代实现都可能采用复杂的内部优化。判断性能要看程序、编译器、微架构和工作负载,而不是只看 ISA 标签。
3. CPU 怎样执行程序#
把处理器想成“根据 PC 找到下一条指令、解释它、完成操作”的机器:
- 取指: 从程序计数器(PC)指出的位置取出指令。
- 译码: 解析操作码、寄存器编号和立即数。
- 执行: ALU 计算、访存、比较或跳转。
- 提交结果并更新 PC: 顺序执行时 PC 前进;分支/跳转时 PC 改为目标地址。
例如 add x5, x6, x7 表示把 x6 与 x7 的值相加并写入 x5。基础 RV32I/RV64I 指令通常为 32 位;启用压缩扩展 C 后,也会有 16 位指令,所以不能一概说“所有 RISC-V 指令都是 4 字节”。
4. RISC-V 的组成#
RISC-V 采用开放标准 ISA。规范开放不等于所有实现的许可条件都相同;实现芯片时还要考虑具体标准、专利和许可要求。
基础整数 ISA 提供 32 个整数寄存器 x0–x31(具体 ABI 名称见寄存器章),以及独立的 PC。RV32 的整数寄存器宽度为 32 位,RV64 为 64 位。RISC-V 采用 load/store 思路:算术通常在寄存器之间进行,load/store 指令负责寄存器与内存之间的数据传输。
常见指令格式#
| 格式 | 常见用途 | 示例 |
|---|---|---|
| R | 两个寄存器参与运算 | add x5, x6, x7 |
| I | 立即数运算、load、间接跳转 | addi x5, x6, 12 |
| S | store | sw x5, 0(x6) |
| B | 条件分支 | beq x5, x6, label |
| U | 构造较大的立即数 | lui x5, 0x12345 |
| J | PC 相对跳转并可保存返回地址 | jal x1, label |
这些是编码布局的类别,不是六种互不相关的“语言”;汇编器还会提供伪指令,让常见操作更容易书写。
5. 基础集与扩展#
RISC-V 由基础整数 ISA 和可组合扩展构成。常见单字母扩展包括:
| 字母 | 含义(简写) |
|---|---|
| I | 基础整数指令集 |
| M | 整数乘除 |
| A | 原子操作 |
| F / D | 单精度 / 双精度浮点 |
| C | 压缩指令 |
| V | 向量指令 |
例如 RV64GC 通常表示 RV64 基础整数 ISA 加上通用应用处理器常用扩展组合(其中 G 是 IMAFD 的简写,另含 C)。具体可用指令仍应查看目标平台、编译器的 -march 设置和官方规格书。
6. 学习路径#
- 先掌握二进制、补码与基本计算机组成。
- 学寄存器、寻址方式、分支和函数调用。
- 用编译器生成汇编,再用反汇编核对机器码。
- 用 QEMU 与 GDB观察寄存器、PC、栈和内存。
- 读 xv6:先启动,再追踪进程、页表、系统调用、文件系统。
核心结论: 先把 ISA 当作“软件与处理器之间可验证的契约”,再学习一条条指令;不要把 ISA、处理器实现和某个汇编器混为一谈。
下一篇: 01 · 计算机组成原理 → 02 · 二进制与补码