qemu中`ObjectClass`和`Object`的区别

The difference between `ObjectClass` and `Object` in qemu

最近在学习qemu和qom。当我遇到ObjectClassObject的概念时,我很困惑。我已经明白 ObjectClass 代表 classObject 表示 class 的实例.但是,我想知道的是 ObjectClass 中应该存储什么样的信息以及 Object.

中发生了什么

就我而言,像C++JavaObjectClass 中定义的一样,用于实际逻辑。在这种情况下,Class 看起来像是一个生成 Object 真正被使用的模板。

qemu中,一切似乎都不一样了。 我们把这两个定义在两个struct中,它们有不同的属性,这就导致了Class[的分离=58=] 和 对象 。这是否意味着我可以使用一个 ObjectClass 来生成许多彼此不同的 Object?其次,我为什么要这样做?这种模式有什么优点吗?具体来说,ObjectClassObject在qemu中分别起什么作用?而他们的关系呢?如果我想设计一个新的设备,MyObjectClassMyObject的初始化应该怎么做?

此外,我注意到qemu会在TypeImpl的每个ObjectClass初始化,这是由开发者定义的TypeInfo初始化的

TypeInfo => ModuleEntry => TypeImpl => ObjectClass => Object

他们当然做不同的事情。 TypeInfo在执行main函数之前转换为ModuleEntry(__attribute__((constructor))),其中包含ObjectClassObject的初始函数。为什么我们需要这个机制?换句话说,如果我们只创建 ObjectClass 而不是创建 TypeImpl 并在之后创建 ObjectClass 会怎么样?有什么优势吗?

这是 QEMU 对象模型 (QOM) 的一部分,记录在案 in the developer section of the documentation。您应该阅读它,并查看 include/qom/object.h 以了解对象模型的更多详细信息。

在 QOM 中,对于任何 class 都有一个 class 结构——对于基本对象类型,class 结构是 ObjectClass。然后在运行时创建了多个对象,每个对象都是一个struct Object。这也适用于对象的子类型,例如 DeviceState,其 class 结构是 DeviceClass。 class 结构包含该对象类型的每个实例共有的字段,特别是包括与方法等效的函数指针。对象结构包含每个实例的所有字段。因为每个 Object 都包含指向相应 ObjectClass 的指针,所以您始终可以从指向对象实例的指针获取其 class 信息。

因为我们在 C 中实现面向对象的模型,所以我们必须让一切都明确 -- 在 C++ 和 Java 中,因为对象模型是编译器可以整理的语言的一部分在幕后,QOM 必须使用 class 结构和对象结构等手动管理很多事情。

更一般地说,如果您的目标是“编写新设备”,我建议您不要花任何时间研究 QOM 实现的内部结构。相反,您应该查看与您的设备类似的其他设备是如何实现的,以及它们用于声明和使用新设备类型的代码模式是什么。