为什么我们会选择 使用 QEMU、BusyBox 和 Linux 内核搭建一个 ARM64 (AArch64) 的模拟环境?
QEMU 是一个强大的开源虚拟化/仿真工具,支持多种 CPU 架构(如 x86、ARM、RISC-V 等)。
可以使用 qemu-system-aarch64
来模拟一个 ARM64 设备,并且可以指定不同的 SoC、内存、设备等。
允许在 x86_64 主机上运行 ARM64 架构的 Linux 系统,无需真实 ARM64 硬件。
可以编译支持 ARM64 的 Linux 内核,并将其用于 QEMU 启动。
Linux 内核提供基本的设备驱动、进程管理、文件系统支持等功能,使得模拟环境能够正常运行。
BusyBox 是一个精简的 UNIX 工具集合,适用于嵌入式系统和轻量级 Linux 发行版。
提供基本的 Shell(ash)、文件操作命令(ls、cp、mv)、进程管理(ps、kill)等工具,使得 Linux 系统可用。
由于 BusyBox 占用资源少,非常适合 QEMU 这种模拟环境。
嵌入式 Linux 开发:测试和开发 ARM64 设备的 Linux 发行版。
驱动开发:在不依赖实际 ARM64 硬件的情况下测试和调试驱动。
系统移植:在 QEMU 上搭建 ARM64 运行环境,测试软件兼容性。
教育与研究:学习 ARM64 架构、Linux 内核和嵌入式开发。
宿主机:Ubuntu 22.04 (推荐不低于Ubuntu 20.04)
软件 | 版本 | 官网 |
---|---|---|
Linux Kernel | 6.0.9 | https://kernel.org |
BusyBox | 1.35.0 | https://busybox.net |
QEMU | 7.2.0-rc1 | https://www.qemu.org |
mkdir qemu_linux_6.0.9_arm64
sudo apt-get install gcc
sudo apt-get install g++
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install g++-aarch64-linux-gnu
axel -n 100 https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.0.9.tar.xz
tar xvf linux-6.0.9.tar.xz
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build menuconfig -j16
Device Drivers > Block devices
<*> RAM block device support
(16) Default number of RAM disks (NEW)
(65536) Default RAM disk size (kbytes)
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 O=build INSTALL_PATH=build/arch/$ARCH/boot -j16
报错一:
../certs/extract-cert.c:21:10: fatal error: openssl/bio.h: 没有那个文件或目录
21 | #include
# 解决办法
sudo apt install libssl-dev
# 查看 编译后的结果
file build/arch/arm64/boot/Image
# 信息显示当前为 arm64 架构的 执行镜像, 使用小端模式
build/arch/arm64/boot/Image: Linux kernel ARM64 boot executable Image, little-endian, 4K pages
1.BusyBox 源码下载和编译
axel -n 100 https://busybox.net/downloads/busybox-1.35.0.tar.bz2
tar xvf busybox-1.35.0.tar.bz2
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig -j16
Settings
[*] Build static binary (no shared libs)
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 install -j16
file _install/bin/busybox
_install/bin/busybox: ELF 64-bit LSB executable, ARM aarch64, version 1 (GNU/Linux), statically linked, BuildID[sha1]=4070758d3e8d681e8a29b50adcaf9795f40169ec, for GNU/Linux 3.7.0, stripped
在内核编译我们选择的是initrd方式的RamDisk,编写脚本自动为我们制作根文件系统。
#!/bin/bash
MOUNT_DIR=mnt
CURR_DIR=`pwd`
rm initrd.ext4
dd if=/dev/zero of=initrd.ext4 bs=1M count=64
mkfs.ext4 initrd.ext4
mkdir -p $MOUNT_DIR
mount initrd.ext4 $MOUNT_DIR
cp -arf busybox-1.35.0/_install/* $MOUNT_DIR
cd $MOUNT_DIR
mkdir -p etc dev mnt proc sys tmp mnt etc/init.d/
echo "proc /proc proc defaults 0 0" > etc/fstab
echo "tmpfs /tmp tmpfs defaults 0 0" >> etc/fstab
echo "sysfs /sys sysfs defaults 0 0" >> etc/fstab
echo "#!/bin/sh" > etc/init.d/rcS
echo "mount -a" >> etc/init.d/rcS
echo "mount -o remount,rw /" >> etc/init.d/rcS
echo "echo -e \"Welcome to ARM64 Linux\"" >> etc/init.d/rcS
chmod 755 etc/init.d/rcS
echo "::sysinit:/etc/init.d/rcS" > etc/inittab
echo "::respawn:-/bin/sh" >> etc/inittab
echo "::askfirst:-/bin/sh" >> etc/inittab
chmod 755 etc/inittab
cd dev
mknod console c 5 1
mknod null c 1 3
mknod tty1 c 4 1
cd $CURR_DIR
umount $MOUNT_DIR
echo "make initrd ok!"
保存后添加执行权限,执行时需要使用sudo权限。
介绍一下这个脚本的实现和功能:
axel -n 100 https://download.qemu.org/qemu-7.2.0-rc1.tar.xz
tar xvf qemu-7.2.0-rc1.tar.xz
cd qemu-7.2.0-rc1
mkdir build
cd build
# 配置
../configure --target-list=aarch64-softmmu
# 编译
make -j16
# 查看编译产物
file aarch64-softmmu/qemu-system-aarch64
aarch64-softmmu/qemu-system-aarch64: symbolic link to ../qemu-system-aarch64
查看QEMU支持的machine和cpu方法如下:
cd qemu-7.2.0-rc1/build/aarch64-softmmu
./qemu-system-aarch64 -M help # 查看支持的machine
./qemu-system-aarch64 -cpu help # 查看支持的CPU
QEMU的virt machine默认CPU是cortex-a15,这是一个32位CPU。选择ARMv8的64位CPU可用cortex-a57。
前面的准备工作完成后,既可以启动虚拟机,编写脚本:
我们是ARM64位程序,选择cortex-a57架构
#!/usr/bin/sh
qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
-nographic \
-M virt \
-cpu cortex-a57 \
-smp 2 \
-m 1G \
-kernel linux-6.0.9/build/arch/arm64/boot/Image \
-append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
-initrd initrd.ext4
运行后就可以看到正常启动进入console了
说明:上面append选项用来给内核传递命令行参数,nokaslr
表示关闭地址随机化,方便gdb调试内核。
QEMU官方文档:
Welcome to QEMU’s documentation! — QEMU documentation
想退出qemu, 直接杀死即可
#!/usr/bin/sh
killall qemu-system-aarch64