# Install and Build QEMU simulator
environment : ubuntu-20.04.2.0-desktop-amd64
## 1. Install dependency package
```
sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev git libglib2.0-dev libfdt-dev libpixman-1-dev libncurses5-dev libncursesw5-dev
```
## 2. Make new directory
mkdir riscv-qemu && cd riscv-qemu
## 3. Build riscv-gnu-toolchain
參考[這個](https://hackmd.io/@nx1bTzFpQvaKD_yxYRmBaQ/Skpx_8tSO)
## 4. Download QEMU
在riscv-qemu的目錄下
```
wget https://download.qemu.org/qemu-5.2.0.tar.xz
tar xvJf qemu-5.2.0.tar.xz
```
## 5. Compile and install QEMU
cd qemu-5.1.0/
./configure --target-list=riscv64-softmmu,riscv64-linux-user --prefix=/home/電腦名稱/riscv-qemu/qemu
make -j $(nproc)
sudo make install
target為安裝模式 riscv64-softmmu 為system-mode,riscv64-linux-user為user-mode,記得都要裝。
## 6. Add qemu into PATH
export PATH=$PATH:/home/電腦名稱/riscv-qemu/qemu/bin
怕麻煩直接加入bashrc中。
加完後可以檢查一下是否安裝成功
```
qemu-system-riscv64 --version
```
## 7. Make linux kernel
git clone https://github.com/torvalds/linux
cd linux
## 8. Configure and Compile
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
若CROSS_COMPILE無法找到riscv64-unknown-linux-gnu-記得直接把riscv64-unknown-linux-gnu-的絕對路徑打上去,例如CROSS_COMPILE=$RISCV/bin/riscv64-unknown-linux-gnu-這樣
## 9. Make rootfs
#### 1. back to riscv-qemu
#### 2. 之後下載busybox
```
git clone https://github.com/mirror/busybox
cd busybox
```
#### 3. Setting busybox
```
CROSS_COMPILE=riscv64-unknown-linux-gnu- make menuconfig
```

進入Setting

進入Build Option中,將Build static binary (no shared libs)點開,退出並保存。
#### 4. Compile and install
CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
CROSS_COMPILE=riscv64-unknown-linux-gnu- make install
## 10. Make file system
#### 1. back to riscv-qemu
#### 2. make image
qemu-img create rootfs.img 1g
mkfs.ext4 rootfs.img
#### 3.
mkdir rootfs
sudo mount -o loop rootfs.img rootfs
cd rootfs
sudo cp -r ../busybox/_install/* .
sudo mkdir proc sys dev etc etc/init.d
#### 4. make RC file
cd etc/init.d/
sudo touch rcS
sudo vim rcS
編輯該文件的內容為下
```
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
```
#### 5. 修改rcS文件權限,以利busybox運行此文件
sudo chmod +x rcS
#### 6. 退出rootfs目錄(回到riscv-qemu)並卸載文件系統
sudo umount rootfs
## 11. Execute QEMU system-mode
qemu-system-riscv64 -M virt -m 256M -nographic -kernel linux/arch/riscv/boot/Image -drive file=rootfs.img,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"
看到此畫面代表成功

## 12. Execute QEMU user-mode
有些情況在user mode的除錯較方便,只要將C檔案編譯成ELF文件後
```
riscv64-unknown-elf-gcc filename.c -o output
```
執行
```
qemu-riscv64 output
```
便可以得到和system mode一樣的結果