# RISC-V简介

大家会发现，在实验中会反复体到RISC-V汇编。本节将带大家大致认识一下RISC-V指令系统，方便后续实验的进行。

关于RISC-V的更多介绍，可以参考[RISC-V官网](https://riscv.org/)和[RISC-V Book](http://riscvbook.com/)，The RISC-V Instruction Set Manual ([Volume I](https://github.com/riscv/riscv-isa-manual/releases/download/isa-449cd0c/riscv-spec.pdf), [Volume II](https://github.com/riscv/riscv-isa-manual/releases/download/isa-449cd0c/riscv-privileged.pdf))也能帮你详细了解 RISC-V ISA 的各类细节。

RISC-V，读作读作 “risk-five”， 是一种开放式指令集架构 (ISA)，它是由加州大学伯克利分校开发的。RISC-V 架构的设计目标是提供一种简单、可扩展、开放的 ISA，适用于各种计算机系统和应用场景。以下是 RISC-V 架构的主要构成和指令等信息。

## RISC-V 架构构成

### 寄存器文件

RISC-V 架构包含 32 个通用寄存器，每个寄存器的位数为 32 位或 64 位。同时，它还包含了一些特殊的寄存器，如程序计数器 (PC) 和堆栈指针 (SP) 等。

例如：每个RISC-V CPU都有一组控制寄存器，内核通过向这些寄存器写入内容来告诉CPU如何处理陷阱，内核可以读取这些寄存器来明确已经发生的陷阱。RISC-V文档包含了完整的内容。

以下是最重要的一些寄存器概述：

* `stvec`：内核在这里写入其陷阱处理程序的地址；RISC-V跳转到这里处理陷阱。
* `sepc`：当发生陷阱时，RISC-V会在这里保存程序计数器`pc`（因为`pc`会被`stvec`覆盖）。
* `sret`（从陷阱返回）指令会将`sepc`复制到`pc`。内核可以写入`sepc`来控制`sret`的去向。
* `scause`： RISC-V在这里放置一个描述陷阱原因的数字。
* `sscratch`：内核在这里放置了一个值，这个值在陷阱处理程序一开始就会派上用场。
* `sstatus`：其中的**SIE**位控制设备中断是否启用。如果内核清空**SIE**，RISC-V将推迟设备中断，直到内核重新设置**SIE**。**SPP**位指示陷阱是来自用户模式还是管理模式，并控制`sret`返回的模式。

### 指令集

RISC-V 架构定义了一套完整的指令集，包括基本指令集和标准扩展指令集。基本指令集包含了最基本的计算、存储和分支等指令，而标准扩展指令集则提供了额外的指令，如乘法、除法、浮点运算等。这种模式使得RISC-V更容易支持向后兼容。 每一个RISC-V处理器可以声明支持了哪些扩展指令集，然后编译器可以根据支持的指令集来编译代码。

### 基本指令集

基本指令集包括了最基本的计算、存储和分支等指令，如下所示：

* `add`：加法指令，将两个寄存器的值相加，存储到第三个寄存器中。
* `sub`：减法指令，将两个寄存器的值相减，存储到第三个寄存器中。
* `lw`：加载字（4字节）指令，从内存中读取一个字，并存储到寄存器中。
* `sw`：存储字（4字节）指令，将寄存器中的值存储到内存中。
* `beq`：分支相等指令，如果两个寄存器的值相等，跳转到指定的位置。
* `bne`：分支不相等指令，如果两个寄存器的值不相等，跳转到指定的位置。

### 标准扩展指令集

标准扩展指令集提供了额外的指令，如乘法、除法、浮点运算等。以下是一些常见的标准扩展指令集：

* `RV32M`：乘法扩展指令集，提供了乘法和除法指令。
* `RV64M`：64位乘法扩展指令集。
* `RV32F`：浮点扩展指令集，提供了单精度浮点数的计算指令。
* `RV64F`：64位浮点扩展指令集。
* `RV32A`：原子扩展指令集，提供了原子操作的指令，用于多线程应用场景。
* `RV64A`：64位原子扩展指令集。

### 内存模型

RISC-V 架构定义了一种灵活的内存模型，可以支持各种不同的内存访问模式，包括原子操作、虚拟内存和多线程等。

### 物理地址空间

RISC-V 架构支持 32 位和 64 位的物理地址空间，可以支持各种不同的内存大小和寻址模式。

## RISC-V的特点

现在大多数电脑都运行在x86和x86-64处理器上。x86拥有一套不同的指令集，看起来与RISC-V非常相似。但事实上它们并不是如此，RISC-V中的RISC是精简指令集（Reduced Instruction Set Computer）的意思，而x86通常被称为CISC，复杂指令集（Complex Instruction Set Computer）。这两者之间有一些关键的区别：

* 简单易懂：在x86-64中，很多指令都做了不止一件事情。这些指令中的每一条都执行了一系列复杂的操作并返回结果。但RISC-V的指令集非常简单，具有固定大小的指令，使其易于解码和实现，相应的也消耗更少的CPU执行时间。所以相比之下，x86和MIPS等传统指令集架构具有更复杂的指令，这增加了处理器的复杂性和成本。
* 模块化设计：RISC-V的设计是高度模块化的，这意味着它可以根据特定的需求进行定制和优化。相比之下，x86和MIPS等传统指令集架构的设计是固定的，难以进行修改和优化。
* 开放源代码：RISC-V的指令集是市场上唯一的一款开源指令集，这意味着任何人都可以自由地使用、修改和分发它。这使得RISC-V成为一种可扩展的指令集架构，可以在各种不同的硬件上运行。
* 可扩展性：RISC-V的指令集包括基本指令集（RV32I和RV64I）、常见扩展指令集（例如乘法扩展指令集RV32M和RV64M）以及可选扩展指令集（例如向量扩展指令集RV32V和RV64V）。这使得RISC-V可以根据不同的应用需求进行定制和优化。

## 总结

RISC-V 架构是一种开放式指令集架构，其设计目标是提供一种简单、可扩展、开放的 ISA，适用于各种计算机系统和应用场景。它包含 32 个通用寄存器、一套完整的指令集、一种灵活的内存模型和支持 32 位和 64 位的物理地址空间等。同时，它还提供了多个标准扩展指令集，如乘法扩展、浮点扩展和虚拟内存扩展等，以满足不同应用场景的需求。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://scnu-os.gitbook.io/scnu-os-labs/dao-du/riscv-jian-jie.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
