owned this note
owned this note
Published
Linked with GitHub
# 2019q1 Homework4 (riscv)
contributed by < `JulianATA` >
## 實驗
### 排除錯誤
```bash
checking whether /usr/bin/gcc accepts -g... configure: error: C++ compiler missing or inoperational
```
#### 因為缺少 C++ Compiler 造成 buildroot make 的時候,產生錯誤。
```bash
ERROR: No hash found for glibc-2.26.tar.xz
```
加入以下 sha256 key
```bash
sha256 e54e0a934cd2bc94429be79da5e9385898d2306b9eaf3c92d5a77af96190f6bd glibc-2.26.tar.xz
```
#### 開頭選擇 glibc-2.26 造成須要手動新增。
```bash
Applying 0001-sem-init-libs.patch using patch:
patching file MCONFIG.in
Reversed (or previously applied) patch detected! Skipping patch.
1 out of 1 hunk ignored -- saving rejects to file MCONFIG.in.rej
Patch failed! Please fix 0001-sem-init-libs.patch!
package/pkg-generic.mk:159: recipe for target '/home/julian/buildroot-riscv-2018-10-20/output/build/host-e2fsprogs-1.44.5/.stamp_patched' failed
make[1]: *** [/home/julian/buildroot-riscv-2018-10-20/output/build/host-e2fsprogs-1.44.5/.stamp_patched] Error 1
Makefile:36: recipe for target '_all' failed
make: *** [_all] Error 2
```
手動刪除 0001-sem-init-libs.patch 後繼續, buildroot 就自動下載新套件了。
#### tmp目錄問題
在實作透過 VirtFS 掛載 Host 端檔案系統到 Guest 端的時候,輸出的檔案一直不是預期的目錄。
> 嚇得我手忙腳亂,卡了好久。
> [name=Julian Fang]
檢查一下 ` root_9p-riscv64.cfg ` 。
```
/* VM configuration file */
{
version: 1,
machine: "riscv64",
memory_size: 128,
bios: "bbl64.bin",
kernel: "kernel-riscv64.bin",
cmdline: "console=hvc0 root=/dev/vda rw",
drive0: { file: "root-riscv64.bin" },
/* Also access to the /tmp directory. Use
mount -t 9p /dev/root /mnt
to access it. */
fs0: { tag: "/dev/root", file: "/tmp" },
eth0: { driver: "user" },
}
```
發現我所實驗的目錄 `tmp` 並非這個 `tmp` 。
此 ` tmp ` 為我的系統根目錄中的 ` tmp ` , 就是 `/tmp` 。
而我所實驗的目錄為 `/home/julian/tmp/` ,因此修改 ` root_9p-riscv64.cfg `。
```
fs0: { tag: "/dev/root", file: "/tmp" },
```
改為
```
fs0: { tag: "/dev/root", file: "/home/julian/tmp" },
```
測試
```bash
~# mount -t 9p /dev/root /mnt
~# ls /mnt
buildroot-riscv-2018-10-20 diskimage-linux-riscv-2018-09-23
buildroot-riscv-2018-10-20.tar.gz diskimage-linux-riscv-2018-09-23.tar.gz
```
### Kilo
## 自我檢查清單
* [riscv-emu](https://github.com/sysprog21/riscv-emu) 原始程式碼中多次出現 [virtio](https://www.linux-kvm.org/page/Virtio),這樣的機制對於 host 和 guest 兩端有何作用?在閱讀 [Virtio: An I/O virtualization framework for Linux](https://www.ibm.com/developerworks/library/l-virtio/index.html) 一文後,對照原始程式碼,你發現什麼?
* 透過 `$ temu root-riscv64.cfg`, 我們在 RISCV/Linux 模擬環境中,可執行 `gcc` 並輸出對應的執行檔,而之後我們則執行 `riscv64-buildroot-linux-gnu-gcc`,這兩者有何不同? (提示: cross-compiler, 複習 [你所不知道的 C 語言: 編譯器和最佳化原理篇](https://hackmd.io/s/Hy72937Me)
* 在 Guest 端透過 `$ dmesg | grep 9pnet` 命令,我們可發現 `9P2000` 字樣,這和上述 [VirtFS](https://wiki.qemu.org/Documentation/9psetup) 有何關聯?請解釋運作原理並設計實驗
* 在 [TinyEMU System Emulator by Fabrice Bellard](https://bellard.org/tinyemu/readme.txt) 提到 "Network block device",你能否依據說明,嘗試讓 guest 端透過 host 存取到網際網路呢?
* tap, bridge, NAT, iptables
* 最初實驗輸入 `$ temu https://bellard.org/jslinux/buildroot-riscv64.cfg`,然後就能載入 RISC-V/Linux 系統,背後的原理是什麼呢?請以 VirtIO 9P 檔案系統和 [riscv-emu](https://github.com/sysprog21/riscv-emu) 對應的原始程式碼來解說
> TinyEMU supports the VirtIO 9P filesystem to access local or remote filesystems. For remote filesystems, it does HTTP requests to download the files.
> The protocol is compatible with the vfsync utility. In the "mount" command, "/dev/rootN" must be used as device name where N is the index of the filesystem. When N=0 it is omitted.
* [riscv-emu](https://github.com/sysprog21/riscv-emu) 內建浮點運算模擬器,使用到 [SoftFP Library](https://bellard.org/softfp/),請以 `sqrt` 為例,解說 `sqrt_sf32`, `sqrt_sf64`, `sqrt_sf128` 的運作機制,以及如何對應到 RISC-V CPU 模擬器中
* 在 `root-riscv64.cfg` 設定檔中,有 `bios: "bbl64.bin"` 描述,這用意為何?提示:參閱 [Booting a RISC-V Linux Kernel](https://www.sifive.com/blog/all-aboard-part-6-booting-a-risc-v-linux-kernel)
* 能否用 buildroot 編譯 Linux 核心呢?請務必參閱 [Buildroot Manual](https://buildroot.org/downloads/manual/manual.html)
* `BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="/tmp/diskimage-linux-riscv-2018-09-23/patches/config_linux_riscv64"`
* 核心啟動的參數 `console=hvc0 root=/dev/vda rw` 代表什麼意思呢?這對應到模擬器內部設計的哪些部分?
* `$ cat /proc/loadavg` 的輸出意義為何?能否對應到 Linux 核心原始碼去解釋呢? (提示: 熟悉的 fixed-point 操作)
* 為何需要在 host 端準備 e2fsprogs 工具呢?具體作用為何呢?
* root file system 在 Linux 核心的存在意義為何?而 [initramfs](http://blog.linux.org.tw/~jserv/archives/001954.html) 的存在的考量為何?
* busybox 這樣的工具有何作用?請搭配原始程式碼解說 (提示: 參見 [取得 GNU/Linux 行程的執行檔路徑](http://blog.linux.org.tw/~jserv/archives/002041.html))
###### tags: `Cprogramming`