当前位置: 首页 > news >正文

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

在这里插入图片描述

相关文章:

  • 技术分享|iTOP-RK3588开发板Ubuntu20系统旋转屏幕方案
  • 蓝桥杯 15g
  • Matlab 电机激励模型和仿真
  • Linux上位机开发实践(mcu模块的补充应用)
  • 【常用功能】下载文件和复制到剪切板
  • Flink的 RecordWriter 数据通道 详解
  • vue2 el-element中el-select选中值,数据已经改变但选择框中不显示值,需要其他输入框输入值才显示这个选择框才会显示刚才选中的值
  • 【2】安装Nodejs-Nodejs开发入门
  • 直播电商革命:东南亚市场的“人货场”重构方程式
  • GNSS静态数据处理
  • 如何将网页保存为pdf
  • 【后端开发】Spring MVC-计算器、用户登录、留言板
  • TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
  • C++ I/O 性能优化指南
  • my2sql工具恢复误删数据
  • 蓝桥杯知识总结
  • Python及Javascript的map 、 filter 、reduce类似函数的对比汇总
  • python 办公自动化------ excel文件的操作,读取、写入
  • 大模型上下文协议MCP详解(2)—核心功能
  • 2025最新版Nodejs安装及环境配置教程
  • 寿县住房与城乡建设局网站/seoul national university
  • 网站制作网站做网/百度账号管理中心
  • 厦门高端网站建设公/软件培训机构哪家好
  • 租用网站服务器价格/百度指数人群画像
  • 商业网站推广/百度收录入口在哪里查询
  • phpcms内容管理系统/西安seo霸屏