実際にはM1 Mac上で構築したLima上のUbuntu 22.04 LTS上でのビルドの試行だけれども。QEMUでのLinuxブート環境が構築したくて、RISC-V Getting Started Guideをそのまま試してみることにした。
risc-v-getting-started-guide.readthedocs.io
RISC-Vツールチェインの準備
ベアメタルクロスコンパイラ
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git -b 2022.05.15 cd riscv-gnu-toolchain mkdir build ./configure --prefix=${RISCV} make -j$(nproc) make install
$ ~/riscv64/bin/riscv64-unknown-elf-gcc --version riscv64-unknown-elf-gcc () 11.1.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Linux用のコンパイラ
M1 Macネイティブでは全然うまく行かなかったのが、あっという間にうまく行った。素晴らしい。
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git -b 2022.05.15 cd riscv-gnu-toolchain mkdir build ./configure --prefix=${RISCV} make linux -j$(nproc) make install
$ ~/riscv64-linux/bin/riscv64-unknown-linux-gnu-gcc --version riscv64-unknown-linux-gnu-gcc (g5964b5cd727) 11.1.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
LinuxカーネルとQEMUのインストール
次に、Linuxカーネルのビルド試行がしたいので、QEMUのインストールと、Linuxカーネルをビルドする。
risc-v-getting-started-guide.readthedocs.io
QEMUのインストール
QEMUのインストールは、Gitリポジトリからはできなくなっている?v7.0.0を試行したのだが、結局公式ページからダウンロードしてビルドした。
wget https://download.qemu.org/qemu-7.0.0.tar.xz tar xvJf qemu-7.0.0.tar.xz cd qemu-7.0.0 ./configure --target-list=riscv64-softmmu make -j$(nproc) sudo make install
$ qemu-system-riscv64 --version QEMU emulator version 7.0.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
Linuxカーネルのビルド
git clone https://github.com/torvalds/linux cd linux git checkout v5.4.0 make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
BusyBoxのビルド
git clone https://git.busybox.net/busybox cd busybox CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
QEMUの立ち上げ
マニュアルに従って以下のように指定した。
sudo qemu-system-riscv64 -nographic -machine virt -kernel ../linux/arch/riscv/boot/Image -append "root=/dev/vda ro console=ttyS0" -drive file=busybox,format=raw,id=hd0 -device virtio-blk-device,drive=hd0
OpenSBI v1.0 ____ _____ ____ _____ / __ \ / ____| _ \_ _| | | | |_ __ ___ _ __ | (___ | |_) || | | | | | '_ \ / _ \ '_ \ \___ \| _ < | | | |__| | |_) | __/ | | |____) | |_) || |_ \____/| .__/ \___|_| |_|_____/|____/_____| | | |_| Platform Name : riscv-virtio,qemu Platform Features : medeleg Platform HART Count : 1 Platform IPI Device : aclint-mswi Platform Timer Device : aclint-mtimer @ 10000000Hz Platform Console Device : uart8250 Platform HSM Device : --- Platform Reboot Device : sifive_test Platform Shutdown Device : sifive_test Firmware Base : 0x80000000 Firmware Size : 252 KB Runtime SBI Version : 0.3 Domain0 Name : root Domain0 Boot HART : 0 Domain0 HARTs : 0* Domain0 Region00 : 0x0000000002000000-0x000000000200ffff (I) Domain0 Region01 : 0x0000000080000000-0x000000008003ffff () Domain0 Region02 : 0x0000000000000000-0xffffffffffffffff (R,W,X) Domain0 Next Address : 0x0000000080200000 Domain0 Next Arg1 : 0x0000000087000000 Domain0 Next Mode : S-mode Domain0 SysReset : yes Boot HART ID : 0 Boot HART Domain : root Boot HART ISA : rv64imafdcsuh Boot HART Features : scounteren,mcounteren,time Boot HART PMP Count : 16 ... [ 0.363287] [<ffffffff80004a28>] dump_backtrace+0x1c/0x24 [ 0.363425] [<ffffffff80640dda>] show_stack+0x2c/0x38 [ 0.363498] [<ffffffff80645df8>] dump_stack_lvl+0x40/0x58 [ 0.363618] [<ffffffff80645e24>] dump_stack+0x14/0x1c [ 0.363688] [<ffffffff806410e6>] panic+0x106/0x2b0 [ 0.363838] [<ffffffff80801462>] mount_block_root+0x202/0x21e [ 0.363991] [<ffffffff80801666>] mount_root+0x1e8/0x218 [ 0.364071] [<ffffffff808017d8>] prepare_namespace+0x142/0x184 [ 0.364284] [<ffffffff80800ffc>] kernel_init_freeable+0x1ee/0x20a [ 0.364366] [<ffffffff8064a20c>] kernel_init+0x1e/0x10a [ 0.364431] [<ffffffff800030b6>] ret_from_exception+0x0/0xc [ 0.364899] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(254,0) ]---
なんかがおかしいなあ。BusyBoxの作成に失敗したのか?