case KVM_EXIT_IO: /* … */
case KVM_EXIT_HLT: /* … */
}
}
// 这里的退出并不一定是虚拟机关机,
// 虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会退出执行,
// 退出执行可以理解为将 CPU 执行上下文返回到 Qemu。
Qemu 源码结构#
Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。
所以,从宏观上看,源码结构主要包含以下几个部分:
-
/vl.c:最主要的模拟循环,虚拟机环境初始化,和 CPU 的执行。
-
/target-arch/translate.c:将 guest 代码翻译成不同架构的 TCG 操作码。
-
/tcg/tcg.c:主要的 TCG 代码。
-
/tcg/arch/tcg-target.c:将 TCG 代码转化生成主机代码。
-
/cpu-exec.c:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。
其中,涉及的主要几个函数如