主講人: jserv / 課程討論區: 2019 年系統軟體課程
:mega: 返回「Linux 核心設計」課程進度表
以下操作均在 GNU/Linux 環境中進行,在模擬器內執行 RISC-V/Linux,反應時間可能會大幅增加,請保持耐心
命令標示方式:
$
開頭表示在 Host 端 GNU/Linux 輸入的命令,也就是你平常的作業環境~#
開頭表示在 riscv-emu 模擬環境中的 RISCV/Linux 命令環境中輸入的命令。這樣的模擬環境簡稱 Guest 端請耐心等待,過程中程式會自上述網址下載對應的檔案。
預期會看到以下輸出:
當看到上方 [root@localhost ~]#
命令提示訊息時,就可以輸入 GNU/Linux 常見命令,如 uname -a
和 ps
用 ls
觀察,可發現 /root
目錄下已有 readme.txt
檔案,請用 cat readme.txt
觀察並作配合的實驗。
例如計算圓周率:
甚至可在 risc64 模擬環境中模擬 riscv128:
預期輸出結果:
當要離開 riscv-emu 時,先按下 Ctrl-A
組合鍵,「放開後再按」 x
鍵
假設目前目錄為 $HOME/riscv-emu
,我們設定 $PATH
環境變數,讓之後方便使用:
接著取得預先準備好的 diskimage:
切換到解開的 diskimage 目錄並啟動模擬器:
預期將看到以下輸出:
檢查處理器架構和核心資訊:
預期輸出為:
繼續輸入以下命令,觀察輸出結果:
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/cmdline
cat /proc/devices
cat /proc/interrupts
cat /proc/loadavg
先離開模擬器 (按下 Ctrl-A
組合鍵,放開後再按 x
鍵),編輯檔案 root_9p-riscv64.cfg
,確保內容如下:
也就是新增 kernel: "kernel-riscv64.bin"
這行。
啟動模擬器:
當看到 ~ #
命令提示訊息時,輸入以下命令:
上述命令是透過 VirtFS 掛載 Host 端檔案系統到 Guest 端,驗證方式:
觀察輸出的內容,不難發現存在 diskimage-linux-riscv-2018-09-23
目錄,也就是之前我們自壓縮檔案解開的目錄,我們的模擬器也從中載入映像檔案。有這樣的檔案分享機制,你就可以很方便地在模擬器中實驗。
詳細閱讀 TinyEMU System Emulator by Fabrice Bellard
注意檔案 .config
是我們要透過 buildroot 工具去建構 kernel image + root file system 的設定檔案,我們可透過 $ make menuconfig
去調整。在這之前,確保已經安裝必要的開發套件:
接著變更設定:
預期會看到下方輸出:
可嘗試用方向鍵瀏覽,觀看個別設定內容。記錄你發現有趣的選項 (乍看不懂沒關係,保持好奇心)。
由於 buildroot 裡頭 e2fsprogs 套件較舊,可能在新版 GNU/Linux 發行套件彙編譯失敗,於是我們著手更新:
package/e2fsprogs/e2fsprogs.mk
,更改 E2FSPROGS_VERSION =
後面的字串從 1.43.1
到 1.44.5
package/e2fsprogs/e2fsprogs.hash
, 新增以下
package/e2fsprogs/0002-fuse2fs-might-need-librt.patch
接著終於要使用 buildroot 來建構 root file system,過程要等上一陣子。
如果沒有遭遇到困難 (就算遇到也別急著 Google 搜尋,嘗試自己排除),應該可在 output
目錄發現 buildroot 幫我們建構的檔案,其中 output/host
是必要的開發工具,如:
檢查上述輸出中,是否包含以下字串:
--target=riscv64-buildroot-linux-gnu
Thread model: posix
gcc version 7.3.0
透過 buildroot 產生的 GNU Toolchain 也置放於 output/host
目錄。
建立一個小程式,檔名為 hello.c
:
先在 Host 端進行 cross-compile:
之後啟動 riscv-emu,需要透過 VirtFS 掛載 Host 端檔案系統到 Guest 端的方式: (自行透過 cd
切換到對應的目錄)
在 Guest 中執行以下命令:
應該可見 Hello!
字串輸出。
透過 buildroot 建立的 root filesystem 位於 output/images/rootfs.ext2
,用 file 檢查:
預期會看到 output/images/rootfs.ext2: Linux rev 1.0 ext2 filesystem data
的輸出,注意到 ext2
字串。
回到 diskimage-linux-riscv-2018-09-23
目錄,建立以下檔案:
相較之前的設定檔案,變更了 drive0
這項,接著啟動模擬器:
預期會看到以下訊息
輸入 root
,不用密碼即可登入系統。
在 Guest 中輸入以下命令:
注意看 BusyBox v1.24.2
旁邊的字串,應該會有 2019-03-26
或更晚的時間,表示你透過 buildroot 編譯的 Busybox 工具。
做完實驗記得在 Guest 端關機: (不要傻到在 Host 端輸入)
kilo 是個極小的程式碼編輯器,支援語法高亮度提示和常見的編輯功能,原始程式碼約 1000 行。
預期執行畫面:
功能按鍵:
Ctrl-Q
: 離開編輯器Ctrl-F
: 尋找特定字串Ctrl-E
: 刪去目前所在列Ctrl-J
: 移動游標到列首Ctrk-K
: 移動游標到列尾riscv-emu 原始程式碼中多次出現 virtio,這樣的機制對於 host 和 guest 兩端有何作用?在閱讀 Virtio: An I/O virtualization framework for Linux 一文後,對照原始程式碼,你發現什麼?
透過 $ temu root-riscv64.cfg
, 我們在 RISCV/Linux 模擬環境中,可執行 gcc
並輸出對應的執行檔,而之後我們則執行 riscv64-buildroot-linux-gnu-gcc
,這兩者有何不同? (提示: cross-compiler, 複習 你所不知道的 C 語言: 編譯器和最佳化原理篇
在 Guest 端透過 $ dmesg | grep 9pnet
命令,我們可發現 9P2000
字樣,這和上述 VirtFS 有何關聯?請解釋運作原理並設計實驗
在 TinyEMU System Emulator by Fabrice Bellard 提到 "Network block device",你能否依據說明,嘗試讓 guest 端透過 host 存取到網際網路呢?
最初實驗輸入 $ temu https://bellard.org/jslinux/buildroot-riscv64.cfg
,然後就能載入 RISC-V/Linux 系統,背後的原理是什麼呢?請以 VirtIO 9P 檔案系統和 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 內建浮點運算模擬器,使用到 SoftFP Library,請以 sqrt
為例,解說 sqrt_sf32
, sqrt_sf64
, sqrt_sf128
的運作機制,以及如何對應到 RISC-V CPU 模擬器中
在 root-riscv64.cfg
設定檔中,有 bios: "bbl64.bin"
描述,這用意為何?提示:參閱 Booting a RISC-V Linux Kernel
能否用 buildroot 編譯 Linux 核心呢?請務必參閱 Buildroot Manual
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 的存在的考量為何?
busybox 這樣的工具有何作用?請搭配原始程式碼解說 (提示: 參見 取得 GNU/Linux 行程的執行檔路徑)
$ make menuconfig
調整核心選項開始,當然要能開機才有效益編輯 Homework4 作業區共筆,將你的觀察、上述要求的解說和改善過程,紀錄於新建立的共筆
Apr 12, 2019 (含) 之前