QEMU:一台“用软件造出来的万能计算机”

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:操作系统,本专栏为讲解各操作系统的历史脉络,以及各性能对比,以及内部工作机制,方便开发选择

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

🚀 QEMU:一台"用软件造出来的万能计算机"

想象一下这个场景:你手头没有树莓派,买不起昂贵的 ARM 开发板,却想学习嵌入式 Linux 驱动开发;或者你是个操作系统内核爱好者,想亲手写一个迷你 OS,但又不想每次测试都把电脑搞蓝屏------QEMU 就是为你量身打造的"魔法盒子"

简单来说,QEMU 是一个通用的、开源的机器模拟器与虚拟化器。它能在你当前的电脑(宿主机)上,用软件"虚拟"出另一台完全不同的电脑(客户机),比如 ARM 架构的 vexpress-a9 开发板、MIPS 架构的路由器,甚至一台完整的 x86 PC。


🧠 核心原理:软件如何"变"出硬件?

QEMU 工作的核心是 "二进制指令翻译"。它把客户机(比如 ARM 芯片)要执行的机器指令,实时翻译成宿主机(比如你的 x86 电脑)能理解的指令。

你可以这样理解:

角色 比喻
宿主机(你的电脑) 一个只会说中文的中国工程师(x86 架构)
客户机(虚拟出来的开发板) 一个只会说日语的日本工程师(ARM 架构)
QEMU 一个同声传译官,在两人之间实时翻译

当 ARM 程序说"把数据从寄存器 R0 搬到 R1"时,QEMU 听到后立刻翻译成 x86 指令"把数据从 EAX 搬到 EBX",并在你的 CPU 上执行。这个过程虽然会损失一些性能,但换来了架构无关性------一套代码,模拟万物。


🆚 模拟器 vs 虚拟机:QEMU 的"双重人格"

很多人分不清 QEMU 和 VMware/VirtualBox 的区别。实际上 QEMU 有两种工作模式,这也是它强大之处:

模式 技术原理 是否依赖硬件虚拟化(VT-x/AMD-V) 性能 典型应用场景
纯软件模拟(TCG) 指令逐条翻译,不依赖 CPU 特性 ❌ 不需要 较慢(约为原生 10%~30%) 嵌入式开发、跨平台编译测试、操作系统教学
硬件加速虚拟化(KVM) 直接让客户机指令在宿主机 CPU 上运行 ✅ 必须开启 接近原生(95%+) 云服务器(OpenStack)、运行 Windows/Linux 虚拟机

打一个形象的比方

  • 纯软件模拟 就像你用翻译软件跟外国人聊天,一句一句翻译,速度慢但有问必答。
  • KVM 加速 就像你自己学会了外语,直接跟外国人对话,几乎没有延迟。

在嵌入式开发中,我们通常使用 纯软件模拟模式,因为我们需要模拟的 ARM 芯片和你的 x86 电脑指令集完全不同。


🎯 QEMU 到底能干什么?三个核心场景

1️⃣ 嵌入式与 IoT 开发(你最关心的)

没有开发板也能写驱动、跑 RTOS。编译好的 freertos.elf 直接 qemu-system-arm -kernel 就能跑,省去了烧录 SD 卡、接串口线的繁琐流程。

对比表格:真实开发板 vs QEMU 模拟

维度 真实 Cortex-A9 开发板 QEMU vexpress-a9 模拟
硬件成本 ¥500 ~ ¥2000 免费
启动一次系统耗时 烧录+重启约 2~3 分钟 1~2 秒
调试能力 依赖 JTAG 调试器(昂贵) 内置 GDB 服务器,一键断点调试
并行开发 只能一个人用 可同时开多个 QEMU 实例
外设模拟 真实硬件,精准 模拟主流外设(UART、GIC、网卡)

2️⃣ 操作系统内核开发

Linux 内核开发者经常用 QEMU 来测试新提交的补丁,因为即使内核崩溃(Kernel Panic),也只会让 QEMU 进程退出,不会导致宿主机死机。这被称为 "安全的破坏性测试"

3️⃣ 跨平台软件测试

你可以在 x86 电脑上直接运行 ARM 版本的 Ubuntu 系统,验证你的应用程序在 ARM 服务器上是否运行正常,无需购买真实 ARM 服务器。


🔍 QEMU 的"千机变":支持的硬件生态

QEMU 几乎模拟了所有主流 CPU 架构和大量板卡:

CPU 架构 支持的开发板/机器(部分) 典型用途
ARM vexpress-a9, virt, raspi3(树莓派) 移动设备、嵌入式 Linux
x86/x86_64 pc, q35 标准 PC 虚拟机
RISC-V virt, sifive_u 开源指令集学习
MIPS malta 路由器、龙芯早期
PowerPC mac99, prep 老款 Mac 模拟

🛠️ QEMU 的"法宝":命令行参数详解

以 Makefile 中的这条命令为例:

bash 复制代码
qemu-system-arm -M vexpress-a9 -cpu cortex-a9 -smp 1 -m 64M -kernel freertos.elf -serial stdio

我们把每个参数想象成"组装一台虚拟电脑"的过程:

参数 含义 生活类比
qemu-system-arm 选择 QEMU 的可执行文件(ARM 架构模拟器) 决定你要"造"一台 ARM 电脑
-M vexpress-a9 Machine(主板型号):选择 ARM 官方开发板 选择电脑主板(比如华硕 B660)
-cpu cortex-a9 CPU 型号:指定处理器内核 选择 CPU(比如 i5-12400)
-smp 1 Symmetric Multi-Processing:使用 1 个 CPU 核心 插几颗 CPU 到主板上
-m 64M Memory:内存大小 64 MB 插多少内存条
-kernel freertos.elf 内核镜像:加载你编译好的 ELF 文件 插入装有操作系统的硬盘并开机
-serial stdio 串口重定向:把虚拟串口接到当前终端 把开发板的调试串口线插到你电脑的 USB 上

🐞 杀手锏功能:与 GDB 无缝联调

嵌入式开发最头疼的是"抓 bug"。QEMU 内置了 GDB 调试服务器,让调试变得像写应用一样简单:

bash 复制代码
# 终端 1:启动 QEMU,暂停 CPU,并开启 GDB 服务
qemu-system-arm -M vexpress-a9 -kernel freertos.elf -S -s

# 终端 2:启动 GDB 连接上去
arm-none-eabi-gdb freertos.elf
(gdb) target remote localhost:1234
(gdb) break main          # 在 main 函数打断点
(gdb) continue            # 让 QEMU 跑起来,停在 main 处

这样你就可以像调试普通程序一样,单步查看寄存器、变量值,甚至观察任务切换的瞬间。


🧩 QEMU 的家族成员:不同架构的启动命令

你想要的模拟目标 启动命令
32 位 ARM 开发板 qemu-system-arm
64 位 ARM 服务器 qemu-system-aarch64
x86 PC(32/64位) qemu-system-x86_64
RISC-V 开发板 qemu-system-riscv64
MIPS 路由器 qemu-system-mips

⚖️ QEMU vs 其他虚拟化方案:一张表看懂差异

特性 QEMU(纯模拟) QEMU + KVM VirtualBox / VMware Docker(容器)
是否模拟不同 CPU 架构 ✅ 支持 ❌ 只能跑同架构 ❌ 只支持 x86/x64 ❌ 依赖宿主机内核
性能开销 较高(翻译损耗) 极低(接近原生) 较低 极低
是否模拟外设硬件 ✅ 非常丰富 ✅ 丰富 ⚠️ 有限(主要标准 PC) ❌ 不模拟硬件
典型场景 嵌入式开发、教学 服务器虚拟化(云计算) 桌面虚拟机(跑 Win) 微服务、应用隔离

🎬 总结:谁在用 QEMU,为什么?

  • 嵌入式工程师:在没有板子的时候验证驱动逻辑,提前 3 个月开始软件开发。
  • Linux 内核开发者:每天提交新代码前,用 QEMU 跑一遍测试套件,确保不引入严重 bug。
  • 计算机系学生:在《操作系统》课程中,用 QEMU 运行自己写的迷你内核,不用害怕把电脑搞崩。
  • 云厂商(AWS、阿里云):基于 QEMU/KVM 技术构建弹性计算服务,一台物理机开上百台虚拟机。

一句话总结:QEMU 是软件工程师的"硬件模拟器",是通往底层世界最安全、最低成本的"时光机"

相关推荐
凉、介11 天前
KVM + QEMU 虚拟化
笔记·学习·嵌入式·arm·qemu·虚拟化·kvm
牛奶咖啡131 个月前
KVM虚拟化与企业应用实践——给远端主机创建虚拟机
云原生·qemu·kvm·给远端主机创建虚拟机·创建uefi模式的虚拟机·安装openeulersp2·vnc与虚拟机环境搭建
牛奶咖啡131 个月前
KVM虚拟化与企业应用实践——通过网络介质配合ks自动应答文件实现自动安装KVM虚拟机
云原生·qemu·kvm·系统网络引导与ks自动应答环境·远程资源+ks文件安装虚拟机·通过网络介质引导自动安装虚拟机·qemu的总线类型详解
冰山一脚20131 个月前
kvm驱动学习笔记
qemu
ggaofeng1 个月前
如何通过uboot加载硬盘
linux·qemu·uboot
ScilogyHunter1 个月前
QEMU完全指南
linux·qemu
冰山一脚20131 个月前
qemu的cpu加速器分析笔记
qemu
longji2 个月前
win11 使用 QEMU11 模拟器跑龙芯系统(debian13,openKylin,openEuler,uos,Loongnix)
qemu·龙芯模拟器
冰山一脚20132 个月前
qemu的板级初始化笔记(以i4ffx为例)
qemu