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

QEMU学习之路(7)— ARM64 启动Linux

QEMU学习之路(7)— ARM64 启动Linux

一、前言

二、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="arm-softmmu,aarch64-softmmu" --prefix=/home/softs/qemu/7.0.0
make -j $(nproc)

4、安装

make install

三、构建Linux内核

1、获取Linux源码

git clone https://mirrors.tuna.tsinghua.edu.cn/git/linux.git -b v6.14 linux-6.14

2、配置内核

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

3、编译内核

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j $(nproc)

编译出的 kernel image 位于 arch/arm64/boot/Image

四、构建busybox

1、获取busybox 源码

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2

2、设置环境变量

export CROSS_COMPILE=aarch64-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

五、构建initramfs

新建initramfs目录,将busybox安装到该目录下

mkdir ../initramfs
make install CONFIG_PREFIX=../initramfs

initramfs(Initial RAM File System)是 Linux 系统启动过程中使用的 临时根文件系统,它存储在内存中,用于在内核加载后、挂载真实根文件系统前完成关键初始化任务。
使用如下命令构造目录结构与设备节点

mkdir -p ../initramfs/{bin,dev,proc,sys}
cd ../initramfs
sudo mknod dev/console c 5 1
sudo mknod dev/null c 1 3
sudo chown root:root dev/{console,null}

在initramfs目录新建init文件,它作为Linux 启动镜像(initramfs)中的 首个用户态进程(PID 1),由内核直接启动,承担着从内核过渡到用户空间的关键桥梁作用,主要任务是为后续系统启动准备必要的运行环境。输入内容如下:

#!/bin/sh
/bin/echo "Hello Linux(Arm64)"
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t devtmpfs devtmpfs /dev
exec /bin/sh

使用chmod +x init命令添加可执行权限
在这里插入图片描述
然后将其打包到initramfs.img镜像文件中。

find . | cpio -H newc -o | gzip > ../initramfs.img

使用如下命令检查打包结果

file ../initramfs.img

在这里插入图片描述

六、启动QEMU

编写启动脚本内容如下,

qemu-system-aarch64                                 \
    -M virt -cpu cortex-a53 -m 512M -nographic      \
    -kernel linux-6.14/arch/arm64/boot/Image        \
    -initrd initramfs.img                           \
    -append "root=/dev/vda rw console=ttyAMA0"

启动界面如下
在这里插入图片描述

七、构建U-Boot

1、获取uboot源码

git clone https://gitee.com/mirrors/u-boot.git -b v2022.04 u-boot_2022.04

2、设置环境变量

export CROSS_COMPILE=aarch64-linux-gnu-

3、配置编译选项

make qemu_arm64_defconfig

4、编译uboot

make -j $(nproc)

八、构建根文件系统

创建一个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.36.1/_install/*  rootfs/

新建boot目录,将Image 复制到该目录下

sudo mkdir rootfs/boot
sudo cp linux-6.14/arch/arm64/boot/Image rootfs/boot/

进入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(Arm64)"
mount -t proc none /proc
mount -t sysfs none /sys
/sbin/mdev -s

设置可执行权限

sudo chmod +x rcS

回到镜像目录,取消镜像挂载

cd ../../..
sudo umount rootfs

九、使用U-Boot启动Linux

编写启动脚本内容如下,

qemu-system-aarch64 -M virt -cpu cortex-a53 -m 512M -nographic 	\
    -bios u-boot_2022.04/u-boot.bin                             \
    -drive file=rootfs.img,format=raw,id=hd0,if=none            \
    -device virtio-blk-device,drive=hd0

启动界面如下所示
在这里插入图片描述
在u-boot命令行输入如下命令,将Image加载到内存中

load virtio 0 0x40200000 boot/Image

设置启动参数如下

setenv bootargs "root=/dev/vda rw"

setenv bootargs "root=/dev/vda rw console=ttyAMA0,115200 init=/linuxrc"

使用如下命令启动

booti 0x40200000 - $fdtcontroladdr

启动界面如下所示
在这里插入图片描述
在这里插入图片描述

相关文章:

  • 每天学一个 Linux 命令(16):mkdir
  • 【寻找Linux的奥秘】第四章:基础开发工具(下)
  • 信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G
  • Ubuntu 各个常见长期支持历史版本与代号
  • 低资源需求的大模型训练项目---3、综合对比与选型建议
  • 计算机基础复习资料整理
  • AI数字消费第一股,重构商业版图的新物种
  • oracle怎么查看是否走了索引
  • 系统设计面试总结:高性能相关:CDN(内容分发网络)、什么是静态资源、负载均衡(Nginx)、canal、主从复制
  • MPC控制基础解析与代码示例:赛车控制
  • 深度学习总结(10)
  • 开源实时语音交互大模型Ultravox-cn
  • zynq7020 u-boot 速通
  • 发送加密信息的简单实现【Java】
  • Linux下python虚拟环境搭建及使用
  • k8s 部署spring项目+动态启动pod
  • 【漫话机器学习系列】199.过拟合 vs 欠拟合(Overfit vs Underfit)
  • 常见的归一化(Normalization)方法
  • 【高并发内存池】从零到一的项目:项目介绍、内存池及定长内存池的设计
  • 关于MOS的二十个问题
  • 上海平台网站建设/竞价运营是做什么的
  • 网站备案号如何查询/如何制作付费视频网站
  • 柳州学校网站建设/比较好网站制作公司
  • 有做公司网站/新开传奇网站
  • 家政网站怎么做/网络平台推广运营有哪些平台
  • 做哪个网站有效果/seo搜索引擎优化是通过优化答案