QOM 设备模型
QOM(QEMU Object Model)是 QEMU 用纯 C 实现的面向对象设备模型,是所有 CPU、设备、总线、内存区域的统一管理框架,解决了设备继承、组合、热插拔、属性暴露、生命周期管理等问题。
核心定位与价值
- 统一抽象:QEMU 里一切虚拟实体(CPU、PCI/USB 设备、总线、内存、控制器)都是QOM 对象。
- C 语言 OO:用结构体、函数指针、类型注册实现单继承 + 多接口,无 C++ 依赖QEMU。
- 设备生命周期:从创建 → realize(初始化)→ 运行 → unrealize(销毁)全流程管控。
- 动态管理:支持命令行 / Monitor 动态创建设备、热插拔、属性读写。
- 迁移友好:内置状态序列化(VMState),支撑虚拟机快照与热迁移。
核心概念与数据结构
1. 类型系统(Type)
- TypeInfo:用户定义类型的 “模板”,包含名称、父类、实例 / 类大小、构造 / 析构钩子QEMU。
- TypeImpl:内部类型实现,全局哈希表(以类型名为 key)统一管理。
- 根类型:
TYPE_OBJECT:所有对象的基类(Object/ObjectClass)。TYPE_INTERFACE:无状态多继承接口(如TYPE_HOTPLUG_HANDLER)。TYPE_DEVICE:所有设备的父类(DeviceState/DeviceClass)。
2. 类与对象(Class/Object)
- ObjectClass:类结构体,存放方法、属性、接口、类级数据。
- Object:对象实例,第一个成员是
ObjectClass *,实现 “对象 → 类” 的绑定。 - DeviceState / DeviceClass:设备专用基类,扩展了
realize/unrealize、重置、热插拔、VMState 等设备专属能力。
3. 属性(Property)
- 每个对象自带哈希表,用于动态注册 / 读写属性(如
id、addr、irq、driver)。 - 支持:整数、字符串、布尔、枚举、对象引用、内存区域等类型QEMU。
- 用途:命令行
-device xxx,prop=val、Monitorinfo qtree/qom-get/qom-set、热插拔配置。
4. QOM 树(Composition Tree)
- 所有对象按父子 / 总线挂载关系组成全局树形结构,路径形如:
/machine/i440fx/pci.0/00:01.0/virtio-net-pci - 路径可用于 Monitor 操作、属性访问、设备定位。
关键机制
1. 继承与多态
- 单继承:
TYPE_DEVICE→TYPE_SYS_BUS_DEVICE→TYPE_PCI_DEVICE→TYPE_VIRTIO_NET_PCI。 - 多接口:一个类可实现多个
Interface(如热插拔、可迁移、可重置)。 - 类型转换宏:
OBJECT_CHECK(obj, type)、OBJECT_GET_CLASS(obj)、DEVICE_CLASS(klass)。
2. 总线与设备挂载
- 总线(如 PCI、SysBus、USB)也是 QOM 对象,提供
bus->attach()接口。 - 设备通过
parent_bus挂载到总线,形成/machine/pci.0/00:01.0路径。
3. 半虚拟化(Virtio)
- Virtio 设备(
virtio-blk/virtio-net)是 QOM 设备的典型应用。 - 设备类:
TYPE_VIRTIO_DEVICE→TYPE_VIRTIO_BLK。 - 利用 QOM 管理队列、特性位、中断、MMIO,配合共享内存提升性能。
4. Monitor 操作(QMP/HMP)
# 查看 QOM 树 (qemu) info qtree # 创建设备 (qemu) device_add my-device,id=mydev0,reg0=0x5678 # 读写属性 (qemu) qom-get /machine/peripheral/mydev0 reg0 (qemu) qom-set /machine/peripheral/mydev0 reg1 0x9abc # 热移除 (qemu) device_del mydev0QOM vs 旧 Qdev
- Qdev:早期设备模型,总线 / 设备硬编码,无动态类型、无统一属性、难扩展。
- QOM:统一对象模型,支持动态类型、继承、属性、热插拔、迁移,是现代 QEMU 的基础QEMU。
QOM 设备模型的优势
统一的面向对象抽象
- 用纯 C 实现了完整 OO 机制:类、继承、多态、接口。
- CPU、设备、总线、内存区域、machine 全部都是 QOM 对象,整个系统模型统一。
良好的可扩展性与模块化
- 设备通过类型注册动态加入系统,无需修改核心代码。
- 支持动态创建设备、热插拔,适合云场景和虚拟化平台。
规范统一的设备生命周期管理
- 定义了标准生命周期:
instance_init → 属性设置 → realize → unrealize → 销毁。 - 设备初始化逻辑清晰、可控,便于调试与维护。
- 定义了标准生命周期:
统一的属性机制(Property)
- 设备参数统一通过 QOM 属性暴露。
- 支持命令行、QMP/HMP、代码内部统一读写,配置方式一致。
清晰的对象树(QOM Tree)与拓扑管理
- 所有对象形成全局树形结构,总线、设备层级关系明确。
- 可通过路径定位任意对象,便于管理、监控、调试。
支持接口(Interface)机制,实现多态能力
- 如热插拔、可重置、可迁移、PCI 等功能以接口形式抽象。
- 设备按需实现接口,代码解耦、复用性强。
为虚拟机迁移与快照提供基础
- 与 VMState 结合,统一设备状态的序列化与反序列化。
- 为热迁移、快照、暂停恢复提供稳定支撑。
替代旧 Qdev,解决历史架构问题
- 旧模型耦合高、扩展性差、无动态类型。
- QOM 让设备模型现代化,适配多架构、虚拟化、云原生需求。
统一多架构设备模型
- x86、ARM、RISC‑V 等所有架构共享同一套 QOM 框架。
- 跨架构开发设备逻辑一致,降低维护成本。
核心价值总结
- 模块化:设备独立开发、动态加载、即插即用QEMU。
- 可扩展:新增设备只需注册类型,无需修改核心代码QEMU。
- 易管理:统一命令行 / Monitor 接口,支持热插拔与在线配置QEMU。
- 跨架构一致:x86/ARM/RISC‑V 设备模型完全统一QEMU。
- 虚拟化友好:内置状态序列化,支撑 KVM 虚拟化栈的迁移与高可用。
