859 字
4 分钟
QEMU 的双重状态保存机制
非常好的问题!让我为您详细调查一下 QEMU 虚拟机的状态保存机制,看看是否所有硬件状态都通过 VMStateDescription 保存。
[4 tools called]
很好的观察!其实答案是:不是所有硬件状态都通过 VMStateDescription 保存。QEMU 实际上有两套状态保存机制!
[1 tool called]
🎯 QEMU 的双重状态保存机制
从代码分析可以看出,QEMU 实际上使用两套并行的状态保存机制:
1️⃣ VMStateDescription - 静态状态保存
用途: 保存相对静态的、结构化的状态
- ✅ CPU 架构状态: 寄存器、控制状态、特权状态
- ✅ 设备配置: 设备寄存器、配置参数
- ✅ 系统状态: 中断控制器、定时器等
2️⃣ SaveVMHandlers - 动态状态保存
用途: 保存复杂的、需要特殊处理的动态状态
- ✅ 内存状态: RAM 内容(通过 ram. c)
- ✅ 存储状态: 块设备、磁盘镜像(通过 block. c)
- ✅ 网络状态: SLIRP 网络栈(通过 slirp. c)
- ✅ 直通设备: VFIO 设备状态(通过 vfio/migration. c)
🔍 在 qemu_savevm_state_setup () 中的双重处理
让我们看看保存设置阶段是如何同时处理两种机制的:
void qemu_savevm_state_setup(QEMUFile *f)
{
QTAILQ_FOREACH(se, &savevm_state.handlers, entry) {
// 🎯 方式1:VMStateDescription保存
if (se->vmsd && se->vmsd->early_setup) {
ret = vmstate_save(f, se, ms->vmdesc); // ← 架构特定CPU状态在这里
// 示例:保存vmstate_riscv_cpu、vmstate_x86_cpu等
}
// 🎯 方式2:SaveVMHandlers保存
if (!se->ops || !se->ops->save_setup) {
continue;
}
ret = se->ops->save_setup(f, se->opaque); // ← RAM、块设备等在这里
// 示例:ram_save_setup(), block_save_setup()等
}
}
📊 具体的保存对象分类
通过 VMStateDescription 保存:
// CPU状态
vmstate_riscv_cpu → 保存RISC-V寄存器、CSR等
vmstate_x86_cpu → 保存x86寄存器、段寄存器、FPU等
vmstate_arm_cpu → 保存ARM寄存器、协处理器等
// 设备状态
vmstate_pci_device → 保存PCI配置空间
vmstate_serial → 保存串口设备状态
vmstate_rtl8139 → 保存网卡设备状态
通过 SaveVMHandlers 保存:
// 内存和存储
savevm_ram_handlers → RAM内容迁移
savevm_block_handlers → 块设备迁移
savevm_dirty_bitmap_handlers → 脏位图迁移
// 特殊设备
savevm_vfio_handlers → VFIO直通设备
savevm_slirp_state → SLIRP网络栈
savevm_tod → S390时钟设备
🔄 为什么需要两套机制?
VMStateDescription 适合:
- 📦 静态结构化数据: 寄存器值、配置参数
- 🎯 一次性保存: 数据相对固定,保存一次即可
- 🔧 版本控制: 需要精确的版本兼容性管理
SaveVMHandlers 适合:
- 💾 大量动态数据: RAM 内容可能有几 GB
- 🔄 迭代传输: 需要多轮传输,支持脏页跟踪
- ⚡ 自定义逻辑: 需要复杂的传输优化(压缩、增量等)
🎭 两套机制的协同工作
在实际迁移中,两套机制并行工作:
迁移开始
↓
Setup阶段:
├─ VMState保存: CPU寄存器、设备配置
└─ Handlers设置: RAM/块设备准备
Iterate阶段:
├─ VMState: (大部分在Setup已完成)
└─ Handlers迭代: RAM脏页、块设备数据
Complete阶段:
├─ VMState完成: 最终设备状态
└─ Handlers完成: 剩余RAM、块设备数据
✅ 总结
虚拟机的硬件状态保存是混合机制:
- 🏗️ 架构和设备状态: 主要通过 VMStateDescription
- 💾 内存和存储数据: 主要通过 SaveVMHandlers
- 🔄 协同工作: 两套机制在迁移的不同阶段并行运行
- 🎯 优化策略: 根据数据特点选择最适合的保存方式
这种设计既保证了静态状态的精确性,又实现了动态数据的高效传输!
[1 tool called]
QEMU 的双重状态保存机制
https://scudays.github.io/posts/icsas/qemu-的双重状态保存机制/