当前位置: 首页 > 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

在这里插入图片描述


http://www.mrgr.cn/news/98010.html

相关文章:

  • minio改成https+域名访问
  • 【C++初学】C++核心编程技术详解(二):类与继承
  • Android 自己的智能指针
  • 数据仓库标准库模型架构相关概念浅讲
  • C语言--求n以内的素数(质数)
  • 5️⃣ Coze+AI应用基础教学(2025年全新版本)
  • 自动化测试常用函数
  • Java习题:合并两个有序数组
  • MySQL 进阶 - 2 ( 12000 字详解)
  • C语言超详细指针知识(一)
  • 【学习笔记】头文件中定义函数出现重复定义报错
  • MySQL学习笔记7【InnoDB】
  • 【数据结构】排序
  • <C#> 详细介绍.NET 依赖注入
  • AD9253 LVDS 高速ADC驱动开发
  • ViewModel vs AndroidViewModel:核心区别与使用场景详解
  • TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
  • Shell 编程之条件语句
  • Windows下编译SALOME
  • AI大模型学习六:‌小米8闲置,通过Termux安装ubuntu做个随身服务器