> For the complete documentation index, see [llms.txt](https://liemu.wyywiki.cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://liemu.wyywiki.cn/readme.md).

# liemu简介以及实验须知

## 什么是 `liemu`

`liemu`(读作 理-emu) 是一个简易的 RISC-V 模拟器，支持简单的 `RV32I` 指令，用于南京理工大学计算机科学与工程学院的《计算机组成原理》课程的教学。

`liemu` 的设计参考了南京大学 [ICS](https://www.bilibili.com/video/BV11BpFe4EmM/) 课程中的 [nemu](https://github.com/NJU-ProjectN/nemu)，不过 `liemu` 的功能较简易，且针对课程内容定制了实验内容。

## 什么是模拟器

模拟器是一种深度的“虚拟化”，可以模拟硬件机制，使得原本运行在其他硬件平台的程序可以在模拟器上运行。最为著名的模拟器当属 [qemu](https://www.qemu.org/)。

和模拟器类似的一种软件就是虚拟机，虚拟机有也能够模拟一台计算机，使得你可以在其中安装操作系统，运行程序。但是虚拟机通常只能模拟和其运行的计算机同样硬件架构的设备，不支持跨架构的虚拟化。

模拟器的应用十分广泛。常见的就是安卓模拟器，可以运行安卓平台应用，在有些场景中便于使用键盘和鼠标来操作手机游戏。又例如各种怀旧风格的红白机模拟器、GBA模拟器等等，可以运行卡带游戏，比如口袋妖怪系列。

## 实验简介

`liemu` 的主线实验内容，就是不断完善 `liemu` 模拟器程序，逐步实现更多功能。

实验需要在 Linux 环境下进行，同学们在 Linux 系统（绝大部分应该是 `x86_64` 架构的）中编写代码，运行 `liemu` 程序，`liemu` 中会运行一个简单的 RISC-V 程序。如下图所示，这是一个套娃。

```shell
+--------------+
|              |
|RISC-V program|
|              |
+--------------+
|              |
|    liemu     |
|              |
+--------------+
|              |
|    Linux     |
|              |
+--------------+
|              |
|x86_64 device |
|              |
+--------------+
```

考虑到大部分同学不会在自己的物理机上安装 Linux 系统，而是选择在 Windows 系统中安装 VMware Workstation 或者 VirtualBox 虚拟机软件，然后在虚拟机中安装 Linux 系统。所以套娃更深了：

```shell
+--------------+
|              |
|RISC-V program|
|              |
+--------------+
|              |
|    liemu     |
|              |
+--------------+
|              |
|    Linux     |
|              |
+--------------+
|              |
|     vm       |
|              |
+--------------+
|              |
|   Windows    |
|              |
+--------------+
|              |
|x86_64 device |
|              |
+--------------+
```

## 实验生存指南

### 提问的智慧

请牢记 **STFW**, **RTFM**, **RTFSC**, **ATFAI** 提问四连，即在你向他人提问之前，先自己尝试这 4 个步骤解决问题。

* STFW(Search The Friendly Web): 你遇到的问题，很可能已经有人遇到过了，所以先尝试搜索引擎搜索一下。
* RTFM(Read The Friendly Manual): 你遇到的问题，很可能在相关的文档里早就写清楚了，所以先尝试阅读一下相关文档。
* RTFSC(Read The Friendly Source Code): 你遇到的问题，看一下相关的源代码实现就明白了，所以先尝试阅读一下相关源代码。
* ATFAI(Ask The Friendly AI): 好时代来临了，大模型的出现给大家解决问题提供了新的途径，这是最 Friendly 的一集。

以上 4 个步骤一般要从上到下依次尝试，不要一开始就向人工智能提一些愚蠢问题，你的提问质量越高，它的回答质量就越高。当然你可以用 AI 辅助你进行前 3 个步骤，例如找文档，帮你分析代码等等。

在实验过程中，助教不会回答一些可以轻易通过上述步骤解决的问题，所以请在提问之前先自己尝试解决问题。学会提问的最高境界就是最后不需要提问。

### 其他提醒

* `liemu` 由 C++ 编写，同时掺杂了一些老旧 C 语言的习惯，以及少量现代 C++ 特性。如果你觉得某些用法很陌生，请 `STFW` 或者 `RTFM`。
* 实验要求你对 RISC-V 指令集有一定的了解，如果你对 RISC-V 指令集不熟悉，请先阅读相关资料。好在大家都学过 MIPS32 汇编，RISC-V 的32位整数指令集 和 MIPS32 指令集相似程度在 90% 以上。
* 不要抄袭代码，我们将对代码进行查重。
* 热门提问将更新在 `FAQ`。

## 参考资料

* RISC-V 相关可以参考大家的《计算机组成原理》课本，或者这本著名的《RISC-V 开放架构设计之道》，或者参看最权威的 [RISC-V 官方文档](https://riscv.org/technical/specifications/)。
* C++ 相关可以参考 [C++ 官方文档 cppreference](https://zh.cppreference.com/)。
