# 2019q1 Homework4 (riscv)
contributed by < `njjack` >
### riscv-emu 原始程式碼中多次出現 virtio,這樣的機制對於 host 和 guest 兩端有何作用?在閱讀 Virtio: An I/O virtualization framework for Linux 一文後,對照原始程式碼,你發現什麼?
首先粗略地比較 full virtualization 和 paravirtualization
相較於 full virtualization 中 guest 不須修改即可運行但 emulation 較複雜且沒效率,paravirtualization 提供較有效率的方法,但須修改 guest 使 guest 能在 hypervisor 上運行且合作
virtio 在 paravirtualization 中扮演的角色是提供 guset 中 front-end driver 統一的介面,以和 hypervisor 中 back-end driver 溝通
### 編譯 [kilo](https://github.com/sysprog21/kilo) 編輯器,允許在 RISC-V/Linux 模擬環境中運作
用 cross-compiler 編譯 kilo.c
```
$ /tmp/buildroot-riscv-2018-10-20/output/host/usr/bin/riscv64-buildroot-linux-gnu-gcc -o kilo kilo.c -static
```
掛載 Host 端檔案系統到 Guest 端
`~# mount -t 9p /dev/root /mnt`
執行
`/mnt/kilo # ./kilo README.md`

### 客製化 buildroot,將 kilo 編輯器加入到 build image,建立 Git repository 來追蹤你對 buildroot 做的變更,並依據 Buildroot Manual 更新套件描述和建構方式
參考[自建 buildroot package](http://vh21.github.io/linux/2016/05/07/add-customized-buildroot-package.html),建立 local package
* 在 `buildroot-riscv-2018-10-20/package` 下建立 directory `kilo`
* 在 directory `kilo` 中建立 `Config.in` 和 `kilo.mk`
* 修改 `buildroot-riscv-2018-10-20/package/Config.in` 的內容,在 `menu Text editors and viewers` 增加 `source "package/kilo/Config.in"`
參考 The Buildroot user manual [17.2](https://buildroot.org/downloads/manual/manual.html#adding-packages) , [17.5](https://buildroot.org/downloads/manual/manual.html#_infrastructure_for_packages_with_specific_build_systems) , [17.23](https://buildroot.org/downloads/manual/manual.html#_tips_and_tricks) ,以及同學 `rebvivi` [共筆](https://hackmd.io/s/S1fWAc2UV),建立 `Config.in` 和 `.mk`
`Config.in` :
```
config BR2_PACKAGE_KILO
bool "kilo"
help
Kilo is a small text editor in less than 1K lines of code (counted with cloc).
https://github.com/sysprog21/kilo
```
`kilo.mk` :
```
KILO_VERSION = af3919d68cb2e70a3d9a2309596cf290cf6bc1ac
KILO_SITE = $(call github,sysprog21,kilo,$(KILO_VERSION))
LIBFOO_LICENSE = BSD 2-Clause
define KILO_BUILD_CMDS
$(MAKE) $(TARGET_CONFIGURE_OPTS) -C $(@D) all
endef
define KILO_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/kilo $(TARGET_DIR)/usr/bin
endef
$(eval $(generic-package))
```
`make menuconfig` 時可以在 `Target packages ---> Text editors and viewer` 找到上述步驟加入的新的 source `kilo`

選取之後編譯,就能在 guest 環境中執行 kilo
```
[root@localhost bin]# ./kilo
Usage: kilo <filename>
```