上面代码的class_init(以serial.c为例的话,对应具体执行的函数是下面的这个serial_class_init),class_init仅仅是函数函数赋值的过程,包括.realize和.unrealize两个成员函数 //serial.cstaticvoidserial_class_init(ObjectClass*klass,void*data){DeviceClass*dc=DEVICE_CLASS(klass);/* internal device for serialio/...
structTypeInfo{constchar*name;constchar*parent;size_tinstance_size;size_tinstance_align;void(*instance_init)(Object*obj);void(*instance_post_init)(Object*obj);void(*instance_finalize)(Object*obj);boolabstract;size_tclass_size;void(*class_init)(ObjectClass*klass,void*data);void(*class_base_ini...
它调用type_initialize,在其中调用parent的class_base_init进行初始化,最后调用自己class_init进行初始化。 其次调用object_init_with_type函数首先判断ti是否有parent(即type->parent != NULL),有parent就会递归调用object_init_with_type,最终就是调用ti->instance_init函数。 所以,再接着是 >>nuclei_machine_instan...
staticvoid__attribute__((constructor))do_qemu_init_ ##function(void)\{\register_module_init(function,type);\} 这里我们主要关心这个__attribute__((constructor))这是一个gcc的扩展,意味着这个函数在main函数调用之前就会被调用,这样看来,如果传入的function函数名为kvm_accel_class_init,这个宏的作用就是...
1.QOM模型,先执行class_init初始化函数,类似C++中构造函数,在new对象的时候调用 2.QOM模型,instance_finalize实例化函数,本类的具体实现 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 主线程kvm初始化 |-qemu_init |-module_call_init(MODULE_INIT_QOM); //vl.c ...
当Qemu命令通过-device传入参数时,device_init_func会根据参数去查找设备,并最终调用到该设备对应的类初始化函数、对象初始化函数、以及realize函数; 所以,我们的分析就是这三个入口; 4.2.1 class_init 在网卡虚拟化过程中,参数只需要指定PCI代理设备即可,也就是-device virtio-net-pci, netdev=tap0,从而会调用到...
7. 会首先调用DeviceClass的realize函数即virtio_pci_dc_realize。该函数是在virtio_pci_class_init中设置的。 image 8. 父类的realize函数会一次调用子类的realize函数。接着会调用PCIDeviceClass的realize函数即pci_qdev_realize。 9. 然后依次调用VirtioPCIClass、VirtioBalloonPCIClass的realize函数。从而实现了Virtio...
DEVICE类型开始,向上扩展到TYPE_DEVICE,最终到达能实例化的顶层TYPE_OBJECT。在QOM模型中,type_register_static和type_initialize扮演重要角色。在qemu_init启动虚拟机时,会选择特定的machine,这个过程会调用type_initialize函数。其实现细节包含在具体的TypeImpl结构中,负责初始化对象的生命周期。
所有的硬件设备都在/hw/ 目录下面,所有的设备都有独自的文件,包括总线,串口,网卡,鼠标等等。它们通过设备模块串在一起,在vl.c中的machine _init中初始化。这里就不讲每种设备是怎么实现的了。 (3)目标机器 现在QEMU模拟的CPU架构有:Alpha, ARM, Cris, i386, M68K, PPC, Sparc, Mips, MicroBlaze, S390X ...
staticconstTypeInfo kvm_accel_type = {.name = TYPE_KVM_ACCEL,.parent = TYPE_ACCEL,.instance_init = kvm_accel_instance_init,.class_init = kvm_accel_class_init,.instance_size =sizeof(KVMState),}; kvm_init主要代码如下: staticint kvm_init(MachineState *ms){MachineClass *mc = MACHINE_GET...