2. QEMU ARM Versatile Express启动

任务说明

本案例使用QEMU模拟ARM Versatile Express(vexpress-a9)开发板,启动Linux内核并挂载根文件系统,最终进入可交互的shell。需要准备内核镜像、设备树文件与根文件系统镜像,通过QEMU命令行完成启动,并验证系统可正常执行命令。

环境准备

宿主机需安装QEMU(含ARM支持)与交叉编译工具链。以下命令在Ubuntu/Debian系统上执行:

sudo apt-get update
sudo apt-get install qemu-system-arm gcc-arm-linux-gnueabihf build-essential
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.123.tar.xz
tar -xf linux-5.15.123.tar.xz
cd linux-5.15.123

内核编译

vexpress开发板对应的默认配置为vexpress_defconfig,该配置已包含所需驱动与EXT4文件系统支持。编译命令如下:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc) zImage dtbs

编译完成后,生成的内核镜像位于arch/arm/boot/zImage,设备树文件位于arch/arm/boot/dts/vexpress-v2p-ca9.dtb。

根文件系统制作

使用BusyBox构建最小根文件系统,包含shell与基础命令:

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xf busybox-1.36.1.tar.bz2
cd busybox-1.36.1
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install

安装完成后,在_install目录中补齐必要目录与设备节点,并打包为EXT4镜像:

cd _install
mkdir -p proc sys dev etc/init.d
cat > etc/init.d/rcS << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs devtmpfs /dev
EOF
chmod +x etc/init.d/rcS
cd ..
dd if=/dev/zero of=rootfs.ext4 bs=1M count=64
mkfs.ext4 rootfs.ext4
mkdir -p /tmp/rootfs
sudo mount -o loop rootfs.ext4 /tmp/rootfs
sudo cp -a _install/* /tmp/rootfs/
sudo umount /tmp/rootfs

QEMU启动

执行以下命令启动模拟系统:

qemu-system-arm \
  -M vexpress-a9 \
  -m 512M \
  -kernel linux-5.15.123/arch/arm/boot/zImage \
  -dtb linux-5.15.123/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
  -drive file=rootfs.ext4,format=raw \
  -append "root=/dev/mmcblk0 rw console=ttyAMA0" \
  -nographic

参数说明:-M指定机器型号,-kernel加载内核镜像,-dtb加载设备树,-drive挂载根文件系统镜像,-append传递内核启动参数,-nographic将串口重定向到当前终端。

验证方法

启动后观察串口输出,内核应完成初始化并挂载根文件系统。当出现Please press Enter to activate this console提示时,按回车键进入shell。执行以下命令验证系统状态:

uname -a
cat /proc/meminfo | head -3
ls /bin

判定标准:

  1. 内核启动日志无Kernel panic或VFS: Unable to mount root fs错误;
  2. uname -a输出包含armv7l与Linux字样;
  3. /proc/meminfo显示约512MB内存;
  4. ls /bin能列出BusyBox提供的命令。
QEMU vexpress-a9 启动流程与验证观测点 宿主机编译产物 zImage (内核镜像) vexpress-v2p-ca9.dtb rootfs.ext4 (EXT4) QEMU 启动参数 -M vexpress-a9 -kernel zImage -drive rootfs.ext4 模拟硬件 Cortex-A9 MPCore 512MB RAM MMCI (SD卡控制器) 内核启动序列 1. 解压内核 自解压到RAM 2. 设备树解析 匹配硬件信息 3. 驱动初始化 MMCI/串口等 4. 挂载根文件 /dev/mmcblk0 验证观测点 观测点 A 无 Kernel panic / VFS错误 观测点 B uname -a 显示 armv7l 观测点 C /proc/meminfo ≈ 512MB

预期输出示例

启动成功后,串口终端应显示类似以下内容(具体日志因内核版本而异):

...
VFS: Mounted root (ext4 filesystem) on device 179:0.
Freeing unused kernel memory: 1024K
Run /sbin/init as init process
...
Please press Enter to activate this console
/ # uname -a
Linux (none) 5.15.123 #1 SMP ARMv7l GNU/Linux
/ #

以上输出为根据内核启动流程与给定配置可唯一推出的预期结果,实际日志以运行为准。