好优化网站设计,wordpress同步到微信公众号,中国空间站合作的17个国家,精通网站建设工资多少接前一篇文章#xff1a;QEMU源码全解析17 —— QOM介绍#xff08;6#xff09; 本文内容参考#xff1a;
《趣谈Linux操作系统》 —— 刘超#xff0c;极客时间
《QEMU/KVM》源码解析与应用 —— 李强#xff0c;机械工业出版社
特此致谢#xff01; 上一回完成了对…接前一篇文章QEMU源码全解析17 —— QOM介绍6 本文内容参考
《趣谈Linux操作系统》 —— 刘超极客时间
《QEMU/KVM》源码解析与应用 —— 李强机械工业出版社
特此致谢 上一回完成了对于QOM的第二部分 —— 类型的初始化的讲解。本回继续往下讲解。
前文说过QOM整个运作包括3个部分类型的注册、类型的初始化以及对象的初始化。但是这里需要加一个部分 —— 类型的层次结构这就有点像桃花三结义后续四弟——赵云赵子龙。
从上一回讲的type_initilize函数可以看到类型初始化时会初始化父类型因此有必要对于类型的层次结构进行专门的介绍QOM通过这种层次结构实现了类似C等面向对象语言中的继承概念。
仍以前文中的edu设备为例。为了便于理解和加深印象再次贴出edu设备相关代码。在hw/misc/edu.c中
static void pci_edu_register_types(void)
{static InterfaceInfo interfaces[] {{ INTERFACE_CONVENTIONAL_PCI_DEVICE },{ },};static const TypeInfo edu_info {.name TYPE_PCI_EDU_DEVICE,.parent TYPE_PCI_DEVICE,.instance_size sizeof(EduState),.instance_init edu_instance_init,.class_init edu_class_init,.interfaces interfaces,};type_register_static(edu_info);
}
type_init(pci_edu_register_types)
在edu设备的类型信息edu_info结构中有一个parent成员这就指定了edu_info的父类型的名称。edu设备的父类型是TYPE_PCI_DEVICE表明edu设备被设计成一个PCI设备。TYPE_PCI_DEVICE的定义在include/hw/pci/pci.h中如下所示
#define TYPE_PCI_DEVICE pci-device
TYPE_PCI_DEVICE的类型信息在hw/pci/pci.c中代码如下
static const TypeInfo pci_device_type_info {.name TYPE_PCI_DEVICE,.parent TYPE_DEVICE,.instance_size sizeof(PCIDevice),.abstract true,.class_size sizeof(PCIDeviceClass),.class_init pci_device_class_init,.class_base_init pci_device_class_base_init,
};
其父类型对于edu设备类型TYPE_PCI_EDU_DEVICE来说是爷类型是TYPE_DEVICE在include/hw/qdev-core.h中定义如下
#define TYPE_DEVICE device
TYPE_DEVICE的类型信息在hw/core/qdev.c中代码如下
static const TypeInfo device_type_info {.name TYPE_DEVICE,.parent TYPE_OBJECT,.instance_size sizeof(DeviceState),.instance_init device_initfn,.instance_post_init device_post_init,.instance_finalize device_finalize,.class_base_init device_class_base_init,.class_init device_class_init,.abstract true,.class_size sizeof(DeviceClass),.interfaces (InterfaceInfo[]) {{ TYPE_VMSTATE_IF },{ TYPE_RESETTABLE_INTERFACE },{ }}
};
再往上追根溯源TYPE_DEVICE的父类型对于edu设备类型TYPE_PCI_EDU_DEVICE来说是曾祖类型是TYPE_OBJECT在include/qom/object.h中定义如下
#define TYPE_OBJECT object
TYPE_OBJECT的类型信息在qom/object.c中转回到object.c这个文件了代码如下
static const TypeInfo object_info {.name TYPE_OBJECT,.instance_size sizeof(Object),.class_init object_class_init,.abstract true,
};
TYPE_OBJECT没有父类了也就是说到TYPE_OBJECT这就到头了它是所有能够初始化实例的最终祖先。
回顾一下edu类型的层次关系为 TYPE_PCI_EDU_DEVICE - TYPE_PCI_DEVICE - TYPE_DEVICE - TYPE_OBJECT 这里我不由得想起了封神榜二郎神杨戬的师傅是玉鼎真人玉鼎真人的师傅是元始天尊元始天尊的师傅是鸿钧祖师。在封神榜里到鸿钧老祖这就到头了什么截教、阐教、道教好的坏的都是鸿钧老祖的徒子徒孙当然封神榜里还能更进一步西方教的两个教主就不属于鸿钧祖师这一支而是混鲲道人这一支也就是说真正的根是鸿钧和混鲲的师傅创始元灵。讲虚拟化愣讲出《封神榜》来了回来吧回来吧。
类似于device所有interface的祖先都是TYPE_INTERFACE在include/qom/object.h中定义如下
#define TYPE_INTERFACE interface
TYPE_INTERFACE的类型信息也在qom/object.c中就在TYPE_OBJECT上边代码如下
static const TypeInfo interface_info {.name TYPE_INTERFACE,.class_size sizeof(InterfaceClass),.abstract true,
};
还是得回到《封神榜》这个TYPE_INTERFACE就相当于西方教那一支。也就是说理论上TYPE_OBJECT和TYPE_INTERFACE还应该有一个共同的父亲即类、接口的父亲我看应该是系统。不过QEMU中就没再往上追了。
欲知后事如何且看下回分解。