// 这里的退出并不一定是虚拟机关机,
// 虚拟机如果遇到 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:主要寻找下一个二进制翻译代码块,如果没有找到就请求得到下一个代码块,并且操作生成的代码块。
其中,涉及的主要几个函数如下:
| 函数 | 路径 | 注释 |
| — | — | — |
| main_loop | {/vl.c} | 很多条件的判断,如电源是否断等 |
| qemu_main_loop_start | {/cpus.c} | 分时运行 CPU 核 |
| struct CPUState | {/target-xyz/cpu.h} | CPU 状态结构体 |
| cpu_exec | {/cpu-exec.c} | 主要的执行循环 |
| struct TranslationBlock | {/exec-all.h} | TB(二进制翻译代码块) 结构体 |
| cpu_gen_code | {

最低0.47元/天 解锁文章
853

被折叠的 条评论
为什么被折叠?



