7.7.6. 启动流程

7.7.6.1. KVM交互

  • 获取到 KVM 句柄

  • 创建虚拟机,获取到虚拟机句柄

  • 为虚拟机映射内存,还有设备/信号处理的初始化

  • 创建 vCPU,并为 vCPU 分配内存空间

  • 创建 vCPU 个数的线程并运行虚拟机

  • 线程进入循环,并捕获虚拟机退出原因,做相应的处理

7.7.6.2. TCG 模式

  • 启动
    • main

    • cpu_init

    • qemu_init_vcpu

    • qemu_tcg_init_vcpu

    • qemu_tcg_cpu_thread_fn

  • 主函数
    • cpu_exec 处理中断异常,找到代码翻译块,执行
      • tb_find 在Hash表中查找,如果找不到则调用tb_gen_code创建一个TB
        • tb_gen_code 分配一个新的TB
          • gen_intermediate_code

          • tcg_gen_code 将TCG代码转换成主机代码。

      • cpu_loop_exec_tb
        • cpu_tb_exec 执行TB主机代码

        • tcg_qemu_tb_exec

7.7.6.3. 用户态

用户态的大部分代码都在 linux-user 目录下

  • linux-user/main.c main
    • linux-user/linuxload.c loader_exec
      • linux-user/elfload.c load_elf_binary
        • load_elf_image

        • load_elf_interp

    • linux-user/<arch>/cpu_loop.c cpu_loop

    • accel/tcg/cpu-exec.c cpu_exec