qemu+opensbi+uboot+linux+busybox启动环境搭建

前置条件

qemu+工具链安装

安装好交叉编译工具链和qemu环境,参考:https://www.laumy.tech/1127.html#risc-v64_Xuantie

代码下载

  • opensbi:[version: v1.2](https://gitee.com/tinylab/qemu-opensbi \"version: v1.2\")
  • uboot: [version: v2022.04](https://gitee.com/mirrors/u-boot \"v2022.04\")
  • kernel: [version: v5.18](https://gitee.com/mirrors/linux_old1 \"version: v5.18\")
  • busybox:[ version: v1.37.0.git](https://gitee.com/mirrors/busyboxsource \" version: v1.37.0.git\")

编译opensbi

export CROSS_COMPILE=riscv64-unknown-linux-gnu-
make all PLATFORM=generic PLATFORM_RISCV_XLEN=64

bin路径:build/platform/generic/firmware/fw_jump.bin

编译uboot

export CROSS_COMPILE=riscv64-unknown-linux-gnu-
make qemu-riscv64_smode_defconfig
make -j 2

适用默认qemu自带的opensbi,引导uboot镜像

cd uboot

qemu-system-riscv64 -M virt -smp 4 -m 2G \\
 -display none -serial stdio -kernel u-boot.bin

使用自行编译的opensbi进行引导uboot,需要在OpenSBI 编译时指定 U-Boot的路径,如下:

cd ../qemu-opensbi

export CROSS_COMPILE=riscv64-unknown-linux-gnu-

make PLATFORM=generic FW_PAYLOAD_PATH=../u-boot-v2022.04/u-boot.bin

编译完成后运行

qemu-system-riscv64 -M virt -m 256M -nographic \\
 -bios qemu-opensbi/build/platform/generic/firmware/fw_payload.elf

编译linux

cd linux-5.18/
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j 48

固件生成:arch/riscv/boot/Image

编译busybox

cd busyboxsource
export CROSS_COMPILE=riscv64-unknown-linux-gnu-
make defconfig
make menuconfig
 Settings-->Build Options 
    [*] Build static binary (no shared libs) ---使能,这样就不用拷贝lib

make -j 48
make install

编译生成的命令:_install

制作根文件系统

cd ../
qemu-img create rootfs.img 1g   ---创建一个文件
mkfs.ext4 rootfs.img            ---将文件格式为ext4格式
mkdir rootfs
sudo mount -o loop rootfs.img rootfs  ---挂在文件到rootfs下,将命令等拷贝进去
cd rootfs
sudo cp -r ../busyboxsource/_install/* .
sudo mkdir proc sys dev etc etc/init.d
cd etc/init.d/
sudo touch rcS
sudo vi rcS

如果要执行要进行交叉编译把库文件拷贝进去
cp -rf Xuantie-900-gcc-linux-5.10.4-glibc-x86_64-V2.8.1/sysroot/lib* .

rcS文件内容如下:

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s
sudo chmod +x rcS
cd ~
sudo umount rootfs

启动内核

#!/bin/sh

qemu-system-riscv64 -M virt -cpu c910v -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\"

qemu虚拟机和宿主机传输文件

qemu启动参数加上下面命令

-virtfs local,path=/mnt/shared,mount_tag=host0,security_model=passthrough,id=host0
  • -virtfs选项指定了共享文件夹的参数
  • local表示共享文件夹是本地文件夹
  • path指定了共享文件夹的路径
  • mount_tag指定了共享文件夹在虚拟机中的挂载点
  • security_model”指定了安全模型
  • id是共享文件夹的标识符。

宿主机执行

mkdir -p /mnt/shared
mount -t 9p -o trans=virtio,version=9p2000.L host0 /mnt/shared

本文参考:[tinylab:YJMSTR](https://gitee.com/tinylab/riscv-linux/blob/master/articles/20220816-introduction-to-qemu-and-riscv-upstream-boot-flow.md#https://gitee.com/link?target=https%3A%2F%2Ftinylab.org%2Friscv-uefi-part1%2F \"tinylab:YJMSTR\")