QEMU学习之路(6)— RISC-V 启动Linux
QEMU学习之路(6)— RISC-V 启动Linux
一、前言
参考:QEMU 启动方式分析(1):QEMU 及 RISC-V 启动流程简介
QEMU 启动方式分析(2): QEMU virt 平台下通过 OpenSBI + U-Boot 引导 RISCV64 Linux Kernel
二、QEMU安装
可以通过如下命令安装QEMU
1、获取安装包
wget https://download.qemu.org/qemu-7.0.0.tar.xz
2、解压
tar xvJf qemu-7.0.0.tar.xz
3、编译
cd qemu-7.0.0
./configure --target-list="riscv32-softmmu,riscv64-softmmu" --prefix=/home/softs/qemu/7.0.0
make -j $(nproc)
4、安装
make install
三、构建OpenSBI
1、获取opensbi源码
git clone https://gitee.com/tinylab/qemu-opensbi.git
2、进入目录,设置环境变量
cd qemu-opensbi/
export CROSS_COMPILE=riscv64-linux-gnu-
3、编译
make all PLATFORM=generic PLATFORM_RISCV_XLEN=64
其中 PLATFORM 设置 qemu_virt 所需的 generic 平台
四、构建Linux内核
1、获取Linux源码
git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v5.18 linux-5.18
2、配置内核
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
3、编译内核
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j $(nproc)
编译出的 kernel image 位于 arch/riscv/boot/Image
五、构建busybox
1、获取busybox 源码
git clone https://gitee.com/mirrors/busyboxsource -b 1_35_0 busybox-1.35.0
2、设置环境变量
export CROSS_COMPILE=riscv64-linux-gnu-
3、使用默认配置
make defconfig
4、配置静态编译
使用如下命令进入配置界面
make menuconfig
使用以下选项,选择静态方式编译busybox,目的是将程序的所有依赖库直接打包进二进制文件,避免了Linux系统运行时依赖动态库。
Settings --->[*] Build static binary (no shared libs)
5、编译busybox
make -j $(nproc)
6、安装
使用如下命令会将busybox默认安装到_install
目录下
make install
六、构建根文件目录
创建一个rootfs.img
镜像
qemu-img create rootfs.img 1g
mkfs.ext4 rootfs.img
新建rootfs
文件夹,并将镜像挂载到该文件夹
mkdir rootfs
sudo mount -o loop rootfs.img rootfs
将busybox文件复制到rootfs目录下
sudo cp -r busybox-1.35.0/_install/* rootfs/
进入rootfs目录,新建如下目录
cd rootfs
sudo mkdir proc sys dev etc etc/init.d
进入etc/init.d/
目录,新建一个启动脚本rcS
cd etc/init.d/
sudo touch rcS
编辑内容如下
#!/bin/sh
echo "Hello Linux(RISC-V)"
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
设置可执行权限
sudo chmod +x rcS
取消镜像挂载
sudo umount rootfs
七、启动QEMU
编写启动脚本内容如下,
/home/softs/qemu/7.0.0/bin/qemu-system-riscv64 \-M virt -m 256M -nographic \-kernel linux-5.18/arch/riscv/boot/Image \-drive file=rootfs.img,format=raw,id=hd0 \-device virtio-blk-device,drive=hd0 \-append "root=/dev/vda rw console=ttyS0"
当没有 -bios 这一启动参数时,QEMU 将会加载自带的 OpenSBI firmware,可以看到OpenSBI 版本为v1.0
使用我们自己编译的 OpenSBI 引导内核启动脚本内容如下,
/home/softs/qemu/7.0.0/bin/qemu-system-riscv64 \-M virt -m 256M -nographic \-bios qemu-opensbi/build/platform/generic/firmware/fw_jump.bin \-kernel linux-5.18/arch/riscv/boot/Image \-drive file=rootfs.img,format=raw,id=hd0 \-device virtio-blk-device,drive=hd0 \-append "root=/dev/vda rw console=ttyS0"
可以看到OpenSBI 版本为v1.2-105-g2868f26
八、构建U-Boot
1、获取uboot源码
git clone https://gitee.com/mirrors/u-boot.git -b v2022.04 u-boot_2022.04
2、设置环境变量
export CROSS_COMPILE=riscv64-linux-gnu-
3、配置编译选项
make qemu-riscv64_smode_defconfig
4、编译uboot
make -j $(nproc)
5、将uboot加入镜像文件
挂载镜像文件
sudo mount -o loop rootfs.img rootfs
将Image
拷贝到rootfs文件夹下
sudo cp linux-5.18/arch/riscv/boot/Image rootfs
取消镜像挂载
sudo umount rootfs
九、使用U-Boot启动Linux
编写启动脚本内容如下,
qemu-system-riscv64 -M virt -m 256M -nographic \-bios qemu-opensbi/build/platform/generic/firmware/fw_jump.bin \-kernel u-boot_2022.04/u-boot-nodtb.bin \-drive file=rootfs.img,format=raw,id=hd0 \-device virtio-blk-device,drive=hd0 \-append "root=/dev/vda rw console=ttyS0"
启动U-Boot如下所示
输入如下命令将Image
加载到内存地址0x80200000
中
load virtio 0 0x80200000 Image
输入如下命令启动内核
booti 0x80200000 - $fdtcontroladdr