1. QEMU最小系统启动
任务说明
本案例要求使用QEMU模拟x86_64架构,启动一个最小Linux内核,并通过串口控制台观察启动日志输出。核心目标是验证QEMU系统级模拟环境可用、内核镜像可引导、串口输出链路正常。
实现方案
采用“QEMU + 最小内核镜像”的轻量路径:直接使用Linux内核源码编译出的bzImage,配合QEMU的-kernel直接引导模式(无需磁盘镜像和bootloader),通过-nographic将串口重定向到当前终端。该方案依赖最少的外部组件,适合作为QEMU系统模拟的第一课。
SVG:QEMU最小系统启动拓扑
操作步骤
1. 准备内核镜像
从内核源码构建最小引导镜像(约需5分钟):
# 下载并解压内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.8.tar.xz
tar -xf linux-6.6.8.tar.xz
cd linux-6.6.8
# 生成最小配置:禁用模块、启用串口和基本驱动
make ARCH=x86_64 defconfig
scripts/config --disable MODULES
scripts/config --enable SERIAL_8250_CONSOLE
scripts/config --enable PRINTK
scripts/config --disable SOUND
scripts/config --disable USB
# 编译内核
make ARCH=x86_64 -j$(nproc) bzImage
编译完成后镜像位于arch/x86/boot/bzImage。
2. 启动QEMU
# 使用直接内核引导模式,串口重定向到终端
qemu-system-x86_64 \
-kernel arch/x86/boot/bzImage \
-append "console=ttyS0 panic=1" \
-nographic \
-m 128M \
-cpu qemu64 \
-no-reboot
3. 验证启动日志
启动后终端应立即输出内核早期引导信息,预期可观察到以下关键内容:
Linux version 6.6.8 ...
Command line: console=ttyS0 panic=1
BIOS-provided physical RAM map:
...
Kernel command line: console=ttyS0 panic=1
...
printk: bootconsole [ns16550a] enabled
...
Freeing unused kernel image (initmem) memory: ...
Kernel Offset: 0x...
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs ]---
由于未提供根文件系统,内核最终会报告VFS: Unable to mount root fs并触发panic=1重启行为(此处由-no-reboot阻止实际重启)。这属于预期结果——只要看到上述日志序列,即证明QEMU已成功引导内核并完成串口输出。
判定标准
- 通过:终端出现
Linux version行、内存映射信息、Kernel command line行以及最终的VFS错误,且日志完整无乱码。 - 失败排查:若终端无输出,检查
-nographic是否生效;若提示KVM相关错误,添加-accel tcg强制软件模拟。
关键参数说明
| 参数 | 作用 |
|---|---|
-kernel | 指定直接引导的内核镜像路径 |
-append | 向内核传递命令行参数,console=ttyS0将日志输出到串口 |
-nographic | 禁用图形窗口,将串口重定向到当前终端 |
-m 128M | 分配128MB内存,满足最小内核运行需求 |
-no-reboot | 内核panic后不自动重启,便于观察完整日志 |
本案例验证了QEMU系统级模拟的最小可用链路:内核镜像加载→CPU初始化→串口驱动注册→控制台输出。该基础环境可直接用于后续外设模拟、设备驱动调试等进阶实验。