# 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/)。


---

# 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://liemu.wyywiki.cn/readme.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.
