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_init
qemu_init_main_loop
init_clocks
init_timer_alarm
qemu_signal_init
cpudef_init -- not very important
socket_init -- not very important
configure_accelerator -- tcg类型的初始化,也就是翻译机的种类的初始化
kvm_init
s->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_loop
cpu_exec_init_all
memory_map_init
memory_region_init
address_space_init
io_mem_init
memory_region_init_io
blk_mig_init
qdev_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_info
x86_cpu_common_class_init
x86_cpu_realizefn
qemu_init_vcpu
qemu_kvm_start_vcpu -- kvm_enabled
qemu_thread_create
qemu_kvm_cpu_thread_fn
kvm_init_vcpu
kvm_cpu_exec
kvm_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_event
qemu_tcg_init_vcpu -- tcg_enabled
qemu_thread_create -- G:\code\qemu-1.6.1\cpus.c
qemu_tcg_cpu_thread_fn
tcg_exec_all
tcg_cpu_exec
cpu_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.c
qemu_register_machine(&pc_machine_v1_0);
pc_init_pci
pc_init1
pc_cpus_init
pc_new_cpu
cpu_x86_create
X86_CPU
cpu_x86_register
kvm_pc_setup_irq_routing -- if kvm_irqchip_in_kernel()
kvm_i8259_init
pc_vga_init
pc_nic_init
pci_piix3_ide_init
pc_cmos_init
pc_pci_device_init
...
...
磁盘类型创建 and qemu-img
main -- G:\code\qemu-1.6.1\qemu-img.c
qemu_init_main_loop
bdrv_init
module_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_init
pc_i440fx_machine_v1_6
pc_init_pci_1_6
pc_init_pci
pc_init1
pc_cpus_init
pc_new_cpu
cpu_x86_create
G:\code\qemu-1.6.1\target-i386\cpu.c
type_init(x86_cpu_register_types)
x86_cpu_type_info
x86_cpu_common_class_init
x86_cpu_realizefn
qemu_init_vcpu
kvm_enabled --> qemu_kvm_start_vcpu
qemu_thread_create(cpu->thread, qemu_kvm_cpu_thread_fn, cpu, QEMU_THREAD_JOINABLE);
kvm_init_vcpu
kvm_cpu_exec(cpu)
kvm_vcpu_ioctl(cpu, KVM_RUN, 0);