【问题标题】:The difference between `ObjectClass` and `Object` in qemuqemu中`ObjectClass`和`Object`的区别
【发布时间】:2021-06-02 03:55:31
【问题描述】:

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

就我而言,像 C++Java 一样,ObjectClass 中的定义相同em> 并在实际逻辑中使用。在这种情况下,Class 看起来像是一个模板,它产生了真正的 Object 被使用。

qemu 中,一切似乎都不同了。 我们在两个struct中定义了这两个,他们有不同的properties,这就导致了ClassObject的分离.这是否意味着我可以使用一个ObjectClass 来生成许多彼此不同的Object?其次,我为什么要这样做?这种模式有什么优点吗?详细来说,ObjectClassObject 在 qemu 中分别扮演什么角色?而他们的关系呢?如果我想设计一个新设备,MyObjectClassMyObject的初始化应该怎么做?

另外,我注意到qemu会用TypeImpl初始化每个ObjectClass,而TypeInfo是由开发者定义的。

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

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

【问题讨论】:

    标签: c qemu


    【解决方案1】:

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

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

    因为我们在 C 中实现了一个面向对象的模型,所以我们必须让所有内容都明确——在 C++ 和 Java 中,因为对象模型是编译器可以在后台整理出很多内容的语言的一部分QOM 必须使用类结构和对象结构等手动管理的东西。

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

    【讨论】:

    • 是的,我已经阅读了 QOM 文档。但我认为它不能解释 qom 中的变化细节。例如,什么是属性以及它在 qom 中是如何工作的?如果 TypeImpl 生成 ObjectClass,为什么 ObjectClass 存储一个 TypeImpl? 当然我可以模仿一些设备来制作我的自己的,但不是有一个通用的概念或模式可以学习吗?
    • 正如你所说,DeviceStateDeviceClass 的对象,我可以在edu device(hw/misc/edu.c) 中看到eduPCIDevice 的子类。但是,当我检查PCIDevice 时,我发现ObjectClass 应该是PCIDeviceClass 而不是PCIDevice。这是否意味着设备的 ObjectClass(edu.c 中的EduState)包含 ObjectEduState 不应该是 ObjectClass?两种解释都没有说服我……
    • EduState is-a PCIDevice is-a DeviceState is-a Object。 EduState 没有类结构,因为它不需要一个(它将是空的); PCIDevice 的类结构是 PCIDeviceClass; DeviceState 的类结构是 DeviceClass; Object 的类结构是 ObjectClass。
    • 那为什么我们不定义EduDeviceClass 及其详细字段,现在我们在EduState 中编写并定义EduState 仅包含EduDeviceClass?换句话说,为什么我们在这里空EduDeviceClass
    • Object 的第一个成员是一个指向 ObjectClass 的指针。这是因为 Object 是基类。 DeviceState 的第一个成员不是指针,它是一个嵌入的对象。这是因为 DeviceState 是一个派生类(也就是说,您可以将 DeviceState 指针强制转换为 Object 指针)。所以 DeviceState 偏移量 0 处的东西实际上是一个指向 ObjectClass 的指针,因为这是嵌入的 Object 结构中的第一个东西。
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多