void (*instance_init)(Object *obj); void (*instance_post_init)(Object *obj); void (*instance_finalize)(Object *obj); bool abstract; size_t class_size; void (*class_init)(ObjectClass *klass, void *data); void (*class_base_init)(ObjectClass *klass, void *data); void *class_data; ...
class_init在类初始化的时候调用,type_register_static过后由qom调用。在my_class_init中主要做一些实例的生成动作,比如注册实例的相关函数,等等。 static void my_class() { } static void my_class_init(ObjectClass *klass, void *data) { MyClass *dc = MY_CLASS(klass); dc->my_class = my_class; ...
.abstract = true, .class_size = sizeof(BusClass), .instance_init = qbus_initfn, .instance_finalize = qbus_finalize, .class_init = bus_class_init, }; static void bus_register_types(void) { type_register_static(&bus_info); } type_init(bus_register_types) 1. 2. 3. 4. 5. 6. ...
抽象的 X86 CPU 类型(TYPE_X86_CPU):.instance_init = x86_cpu_initfn,.class_init = x86_cpu_common_class_init host 透传的 cpu 类型(host-TYPE_X86_CPU):.class_init = host_x86_cpu_class_init,.instance_init = host_x86_cpu_initfn qemu 模拟的 cpu 类型(qemu64-TYPE_X86_CPU 等):.class_...
当Qemu命令通过-device传入参数时,device_init_func会根据参数去查找设备,并最终调用到该设备对应的类初始化函数、对象初始化函数、以及realize函数; 所以,我们的分析就是这三个入口; 4.2.1 class_init 在网卡虚拟化过程中,参数只需要指定PCI代理设备即可,也就是-device virtio-net-pci, netdev=tap0,从而会调用到...
其中需要注意的是相关的realized函数是在xxx_xxx_class_init()函数中设定的。例如, static void pci_device_class_init(ObjectClass *klass, void *data) { DeviceClass *k = DEVICE_CLASS(klass); k->realize = pci_qdev_realize; k->unrealize = pci_qdev_unrealize; ...
PCIHostBridgeClass --- PCIHostState --- pci_host_type_info nullptr --- PCIExpressHost --- pcie_host_type_info nullptr --- Q35PCIHost --- q35_host_info 其中main_system_bus 是系统总线,在pc_q35_init中初始化的q35_host是北桥芯片
主板类型定义与实例化主板类型由MachineClass定义。在QEMU内部,选择主板类型主要在主函数中完成。通过MachineClass->init函数对主板进行初始化,此过程涉及地址空间划分、CPU初始化与内存初始化等关键步骤。地址空间划分为了适应内存结构与设备访问需求,QEMU将物理地址空间划分为RAM、MMIO、BIOS等部分。RAM分为...
module_call_init(MODULE_INIT_QOM); 打开这个函数的代码可以看到如下的内容,看起来非常简单: void module_call_init(module_init_typetype) { ModuleTypeList *l; ModuleEntry *e; module_load(type);l= find_type(type); QTAILQ_FOREACH(e,l, node) {e->init(); ...
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...