qemu code

来源:互联网 发布:网络剧呆头呆脑电视剧 编辑:程序博客网 时间:2024/06/07 06:45

qemu init 


主代码流程


main -- G:\code\qemu-1.6.1\vl.c    module_call_init(MODULE_INIT_QOM); -- 设备驱动初始化和注册#define type_init(function) module_init(function, MODULE_INIT_QOM)type_init(x86_cpu_register_types) -- cpu 创建module_call_init(MODULE_INIT_MACHINE); -- 机器类型注册初始化pc_machine_init    bdrv_init_with_whitelist(); -- 磁盘类型初始化bdrv_initqemu_init_main_loopinit_clocksinit_timer_alarmqemu_signal_initcpudef_init -- not very importantsocket_init -- not very importantconfigure_accelerator -- tcg类型的初始化,也就是翻译机的种类的初始化kvm_inits->fd = qemu_open("/dev/kvm", O_RDWR);s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);kvm_arch_init(s);kvm_irqchip_create(s);qemu_init_cpu_loopcpu_exec_init_allmemory_map_initmemory_region_initaddress_space_initio_mem_initmemory_region_init_ioblk_mig_initqdev_machine_init -- qemu 本身设备初始化 ?machine->init(&args); -- 机器类型初始化qemu_register_machine(&pc_i440fx_machine_v1_6);qemu_register_machine(&pc_i440fx_machine_v1_5);qemu_register_machine(&pc_i440fx_machine_v1_4);qemu_register_machine(&pc_machine_v1_3);qemu_register_machine(&pc_machine_v1_2);qemu_register_machine(&pc_machine_v1_1);qemu_register_machine(&pc_machine_v1_0);qemu_register_machine(&pc_machine_v0_15);qemu_register_machine(&pc_machine_v0_14);qemu_register_machine(&pc_machine_v0_13);qemu_register_machine(&pc_machine_v0_12);qemu_register_machine(&pc_machine_v0_11);qemu_register_machine(&pc_machine_v0_10);qemu_register_machine(&isapc_machine);init_displaystate -- qemu 本身的display init


cpu设备注册创建

cpu设备类型创建type_init(x86_cpu_register_types)x86_cpu_type_infox86_cpu_common_class_initx86_cpu_realizefnqemu_init_vcpuqemu_kvm_start_vcpu -- kvm_enabledqemu_thread_createqemu_kvm_cpu_thread_fnkvm_init_vcpukvm_cpu_execkvm_vcpu_ioctl(cpu, KVM_RUN, 0);switch (run->exit_reason) {#define KVM_EXIT_UNKNOWN          0#define KVM_EXIT_EXCEPTION        1#define KVM_EXIT_IO               2#define KVM_EXIT_HYPERCALL        3#define KVM_EXIT_DEBUG            4#define KVM_EXIT_HLT              5#define KVM_EXIT_MMIO             6......}qemu_kvm_wait_io_eventqemu_tcg_init_vcpu -- tcg_enabledqemu_thread_create -- G:\code\qemu-1.6.1\cpus.cqemu_tcg_cpu_thread_fntcg_exec_alltcg_cpu_execcpu_exec -- G:\code\qemu-1.6.1\cpu-exec.c

机器类型注册创建

main.c -- G:\code\qemu-1.6.1\vl.c    module_call_init(MODULE_INIT_MACHINE);machine_init(pc_machine_init); -- G:\code\qemu-1.6.1\hw\i386\pc_piix.cqemu_register_machine(&pc_machine_v1_0);pc_init_pcipc_init1pc_cpus_initpc_new_cpucpu_x86_createX86_CPUcpu_x86_registerkvm_pc_setup_irq_routing -- if kvm_irqchip_in_kernel()kvm_i8259_initpc_vga_initpc_nic_initpci_piix3_ide_initpc_cmos_initpc_pci_device_init ......


磁盘类型创建 and qemu-img

main -- G:\code\qemu-1.6.1\qemu-img.cqemu_init_main_loopbdrv_initmodule_call_init(MODULE_INIT_BLOCK);#define block_init(function) module_init(function, MODULE_INIT_BLOCK)img_cmds#include "qemu-img-cmds.hx"




pc_piix.c (G:\code\qemu-1.6.1\hw\i386):machine_init(pc_machine_init);machine_init(pc_machine_init);pc_machine_initpc_i440fx_machine_v1_6pc_init_pci_1_6pc_init_pcipc_init1pc_cpus_initpc_new_cpucpu_x86_createG:\code\qemu-1.6.1\target-i386\cpu.ctype_init(x86_cpu_register_types)x86_cpu_type_infox86_cpu_common_class_initx86_cpu_realizefnqemu_init_vcpukvm_enabled --> qemu_kvm_start_vcpu    qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu,  QEMU_THREAD_JOINABLE);kvm_init_vcpukvm_cpu_exec(cpu)kvm_vcpu_ioctl(cpu, KVM_RUN, 0);