整个调用流程大概是通过-M参数指定当前的machine,qemu执行qemu_init_board对板子进行初始化,对应的machine在class_init阶段将具体的初始化函数赋值给了mc->init,如下mc->init = mpc8544ds_init staticvoidmpc8544ds_machine_class_init(ObjectClass*oc,void*data){MachineClass*mc=MACHINE_CLASS(oc);PPCE500MachineCla...
/* serial_info.parent = TYPE_DEVICE,对应device字符串*/.instance_size=sizeof(SerialState),.class_init=serial_class_init,/* serial_info.class_init指向函数serial_class_init的首地址** 后面可使用xxxx->class_init来调用该函数,和e->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 |-kvm_type_init //初始化注册kvm类...
staticvoid__attribute__((constructor))do_qemu_init_ ##function(void)\{\register_module_init(function,type);\} 这里我们主要关心这个__attribute__((constructor))这是一个gcc的扩展,意味着这个函数在main函数调用之前就会被调用,这样看来,如果传入的function函数名为kvm_accel_class_init,这个宏的作用就是...
很显然,创建哪种虚拟机也是交由用户选择的,当然用户如果没有指定机器类型就创建默认的虚拟机。由此可见同一架构下的虚拟机也是有不同的类型的,QEMU定义了一种基础QOM类型-机器类型(MachineClass),用来代表不同类型的虚拟机。用户使用-machine参数来指定创建的虚拟机类型。
当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...
main()//vl.ccpu_exec_init_all()//exec.cmemory_map_init()//exec.caddress_space_init()//memory.cmachine_run_board_init()//hw/core/machine.cmachine_class->init()//pc_init1, hw/i386/pc_piix.cpc_cpus_init()//hw/i386/pc.cpc_memory_init()//hw/i386/pc.cmemory_region_allocate_sy...
main_impl()//vl.cmachine_class->init()::pc_init1()//pc_piix.cpc_new_cpu()//pc_piix.cx86_cpu_realizefn()//cpu.cqemu_init_vcpu()//cpus.cqemu_hax_start_vcpu()//cpus.cqemu_hax_cpu_thread_fn()//cpus.chax_init_vcpu()//hax-all.chax_vcpu_creat()//hax-all.chax_host_create...
kvm_init主要代码如下: staticint kvm_init(MachineState *ms){MachineClass *mc = MACHINE_GET_CLASS(ms);...KVMState *s; ...s = KVM_STATE(ms->accelerator);...s->fd = qemu_open_old("/dev/kvm", O_RDWR);...ret = kvm_ioctl(s, KVM_GET_API_VERSION,0);...kvm_immediate_exit = ...