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
启动界面如下所示