系列文章 : [gem5] 從零開始的 gem5 學習筆記
在這一篇裡,我們希望可以在 gem5 上開機 linux kernel,並紀錄下每一個過程中使用的指令。
從 github 上,把寫好的 gem5 configuration script 抓下來。
git clone https://github.com/TommyWu-fdgkhdkgh/gem5-boot-riscv-linux.git
cd ./gem5-boot-riscv-linux
git clone git@github.com:buildroot/buildroot.git
cd buildroot
git checkout 56c6862bc81ef41c0fe012677eafa24381b1f76c
# use default configuration for RISC-V 64-bit virt QEMU/gem5
make qemu_riscv64_virt_defconfig
使用 menuconfig 去進行設定,在這邊我們希望可以輸出 ext4 檔案。
# enable ext4 filesystem
make menuconfig
Filesystem images --->
ext2/3/4 variant (ext4) --->
ext4
關掉網路介面,加速開機速度
# Build the root filesystem
make -j$(nproc)
# (Optional) Hack to bypass the network "waiting for eth0" delay during boot
sed -i 's/^auto eth0/#auto eth0/' output/target/etc/network/interfaces
make -j$(nproc)
在這一步,我們可以直接使用 buildroot 的 toolchain。
git clone --depth 1 -b v6.8 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
# generate default RISC-V configuration
make ARCH=riscv CROSS_COMPILE=$(realpath ../buildroot/output/host/bin)/riscv64-buildroot-linux-gnu- defconfig
# Compile both the vmlinux ELF (needed for debugging) and the Image (used as payload)
make ARCH=riscv CROSS_COMPILE=$(realpath ../buildroot/output/host/bin)/riscv64-buildroot-linux-gnu- vmlinux Image -j$(nproc)
在這一步,我們一樣可以直接使用 buildroot 的 toolchain。
因為 OpenSBI 會把 linux kernel 當作 payload,所以在編譯 OpenSBI 之前,需要先編譯 linux kernel。
git clone https://github.com/riscv-software-src/opensbi.git
cd opensbi
git checkout 0b041e58c0787f76325da5081e41a13bf304d328
make CROSS_COMPILE=$(realpath ../buildroot/output/host/bin)/riscv64-buildroot-linux-gnu- PLATFORM=generic FW_PAYLOAD_PATH=$(realpath ../linux/arch/riscv/boot/Image) -j$(nproc)
git clone git@github.com:gem5/gem5.git
cd gem5
git checkout 7a2b0e413d06c5ce7097104abef3b1d9eaabca91
# Build the RISC-V gem5 binary
scons build/RISCV/gem5.opt -j$(nproc)
終於可以開始進行模擬了 !
./gem5/build/RISCV/gem5.opt ./run_riscv.py --cpu-type=minor
然後可以再另外一個視窗,進入 gem5 裡 guest OS 的 shell
./gem5/util/term/gem5term 3456
在這個 repo ( https://github.com/TommyWu-fdgkhdkgh/gem5-boot-riscv-linux ) 裡面,已經有把所有需要用到的指令整理成 Makefile 了! 所以想要復現的話,可以用下變得指令簡單達成。
# 編譯 buildroot
make buildroot/build
# 編譯 linux kernel
make linux/build
# 編譯 OpenSBI
make opensbi/build
# 編譯 gem5
make gem5/build
# 運行 gem5
make gem5/run
# 進入 gem5 的 terminal
make gem5/term