qemu中`ObjectClass`和`Object`的区别
The difference between `ObjectClass` and `Object` in qemu
最近在学习qemu和qom。当我遇到ObjectClass
和Object
的概念时,我很困惑。我已经明白 ObjectClass
代表 class 而 Object
表示 class 的实例.但是,我想知道的是 ObjectClass
中应该存储什么样的信息以及 Object
.
中发生了什么
就我而言,像C++或Java,Object 与 Class 中定义的一样,用于实际逻辑。在这种情况下,Class 看起来像是一个生成 Object 真正被使用的模板。
在qemu中,一切似乎都不一样了。 我们把这两个定义在两个struct中,它们有不同的属性,这就导致了Class[的分离=58=] 和 对象 。这是否意味着我可以使用一个 ObjectClass
来生成许多彼此不同的 Object
?其次,我为什么要这样做?这种模式有什么优点吗?具体来说,ObjectClass
和Object
在qemu中分别起什么作用?而他们的关系呢?如果我想设计一个新的设备,MyObjectClass
和MyObject
的初始化应该怎么做?
此外,我注意到qemu会在TypeImpl
的每个ObjectClass
初始化,这是由开发者定义的TypeInfo
初始化的
TypeInfo => ModuleEntry => TypeImpl => ObjectClass => Object
他们当然做不同的事情。 TypeInfo
在执行main
函数之前转换为ModuleEntry
(__attribute__((constructor))
),其中包含ObjectClass
和Object
的初始函数。为什么我们需要这个机制?换句话说,如果我们只创建 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 实现的内部结构。相反,您应该查看与您的设备类似的其他设备是如何实现的,以及它们用于声明和使用新设备类型的代码模式是什么。
最近在学习qemu和qom。当我遇到ObjectClass
和Object
的概念时,我很困惑。我已经明白 ObjectClass
代表 class 而 Object
表示 class 的实例.但是,我想知道的是 ObjectClass
中应该存储什么样的信息以及 Object
.
就我而言,像C++或Java,Object 与 Class 中定义的一样,用于实际逻辑。在这种情况下,Class 看起来像是一个生成 Object 真正被使用的模板。
在qemu中,一切似乎都不一样了。 我们把这两个定义在两个struct中,它们有不同的属性,这就导致了Class[的分离=58=] 和 对象 。这是否意味着我可以使用一个 ObjectClass
来生成许多彼此不同的 Object
?其次,我为什么要这样做?这种模式有什么优点吗?具体来说,ObjectClass
和Object
在qemu中分别起什么作用?而他们的关系呢?如果我想设计一个新的设备,MyObjectClass
和MyObject
的初始化应该怎么做?
此外,我注意到qemu会在TypeImpl
的每个ObjectClass
初始化,这是由开发者定义的TypeInfo
初始化的
TypeInfo => ModuleEntry => TypeImpl => ObjectClass => Object
他们当然做不同的事情。 TypeInfo
在执行main
函数之前转换为ModuleEntry
(__attribute__((constructor))
),其中包含ObjectClass
和Object
的初始函数。为什么我们需要这个机制?换句话说,如果我们只创建 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 实现的内部结构。相反,您应该查看与您的设备类似的其他设备是如何实现的,以及它们用于声明和使用新设备类型的代码模式是什么。