CFBox 提供两层 QEMU 测试,验证在 ARM 嵌入式环境中的真实运行能力。
在主机上通过 QEMU 用户模式模拟器直接运行交叉编译的静态二进制,执行完整集成测试。
# 测试 AArch64 静态二进制
./scripts/qemu_user_test.sh --target aarch64 --link static
# 测试 ARMv7-A 静态二进制
./scripts/qemu_user_test.sh --target armhf --link static
# 测试所有架构
./scripts/qemu_user_test.sh --target all --link static脚本 qemu_user_test.sh 自动:
- 检测 QEMU 是否安装(
qemu-aarch64-static/qemu-arm-static) - 运行冒烟测试(
cfbox --list、cfbox echo "Hello from <arch>") - 创建透明 wrapper 脚本,运行完整集成测试套件
# Debian/Ubuntu
sudo apt-get install qemu-user-static
# Arch Linux
sudo pacman -S qemu-user-static构建最小 Linux 内核 + initramfs,在 QEMU 中完整引导,CFBox 的 init applet 作为 PID 1 运行。
cmake -B build-aarch64-static \
-DCMAKE_TOOLCHAIN_FILE=cmake/toolchain/Toolchain-aarch64.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCFBOX_OPTIMIZE_FOR_SIZE=ON \
-DCFBOX_STATIC_LINK=ON
cmake --build build-aarch64-static./scripts/build_initramfs.sh \
--arch aarch64 \
--cfbox build-aarch64-static/cfbox \
--output build/aarch64-initramfs.cpio- 创建最小目录结构(
bin/、dev/、proc/、sys/、tmp/) - 复制 CFBox 到
bin/cfbox - 运行
cfbox --list获取所有 applet 名称,创建符号链接 - 创建
/init→bin/cfbox符号链接(内核入口点) - 打包为 cpio 归档
对于交叉编译的二进制,脚本会自动使用 QEMU 来执行 cfbox --list。
cd third_party/linux
# AArch64(使用最小配置)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- allnoconfig
# 启用必要选项(见下方配置说明)
scripts/config --enable CONFIG_SERIAL_AMBA_PL011
scripts/config --enable CONFIG_SERIAL_AMBA_PL011_CONSOLE
# ... 或使用项目提供的配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
# ARMv7-A
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- vexpress_defconfig
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- -j$(nproc)./scripts/qemu_system_test.sh \
--arch aarch64 \
--kernel third_party/linux/arch/arm64/boot/Image \
--initramfs build/aarch64-initramfs.cpio \
--timeout 120- 启动 QEMU(
-nographic,串口控制台) - 实时流式输出内核日志
- 等待
ALL TESTS COMPLETE标记 - 统计通过/失败数量
init.cpp 是专用的系统初始化 applet:
- 检测是否为 PID 1(
getpid() == 1) - 若是 PID 1,自动挂载:
proc→/procsysfs→/sysdevtmpfs→/dev
- 打印内核版本和 PID 信息
- 运行冒烟测试:echo、cat /proc/version、ls /、wc -l /proc/cpuinfo
- 报告结果后调用
reboot(RB_POWER_OFF)关机
AArch64 的最小内核配置见 configs/qemu-virt-aarch64.config,关键选项:
CONFIG_ARM64=y # 架构
CONFIG_ARCH_VEXPRESS=y # QEMU virt 平台
CONFIG_SERIAL_AMBA_PL011=y # 串口控制台
CONFIG_BLK_DEV_INITRD=y # initramfs 支持
CONFIG_PROC_FS=y # /proc 文件系统
CONFIG_DEVTMPFS=y # /dev 自动挂载
CONFIG_BINFMT_ELF=y # ELF 执行