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
判定标准:
- 内核启动日志无
Kernel panic或VFS: Unable to mount root fs错误; uname -a输出包含armv7l与Linux字样;/proc/meminfo显示约512MB内存;ls /bin能列出BusyBox提供的命令。
预期输出示例
启动成功后,串口终端应显示类似以下内容(具体日志因内核版本而异):
...
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
/ #
以上输出为根据内核启动流程与给定配置可唯一推出的预期结果,实际日志以运行为准。