qemu+opensbi+uboot+linux+busybox启动环境搭建
- RISC-V
- 2024-05-14
- 371热度
- 0评论
前置条件
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\")