我正在构建一个项目,我必须在其中提取运行在 qemu-kvm 之上的虚拟机的脏页面。我下载了 qemu 源代码,但由于源代码非常大,因此无法正确理解。所以请给我有关处理源代码和获取脏页的指南。
2 回答
我同意 QEMU 源代码太庞大且太耗时而无法理解。下面的链接简要介绍了 QEMU 如何运行以及 QEMU 的基本块是什么。
在此链接中,此人对 QEMU 功能、QEMU 结构、流程进行了详细研究。附有详细说明的 PDF。他谈到了vl.c(主文件),目标代码,TCG,动态翻译,代码库,执行开始等。非常有见地。
编辑:文件中的一些要点:
开始执行: / 中对研究很重要的主要 C 文件是 ; /vl.c,/cpus.c,/execall.c,/exec.c,/cpu-exec.c。开始执行的“main”函数在/vl.c 中定义。该文件中的函数根据给定的虚拟机规格(如内存大小、可用设备、CPU 数量等)设置虚拟机环境。在主函数中,设置虚拟机后,通过文件分支执行例如/cpus.c、/exec-all.c、/exec.c、/cpu-exec.c。
模拟硬件: 模拟虚拟机中所有虚拟硬件的代码可以在 /hw/ 中找到。QEMU 模拟了相当多的硬件,但在本研究中不需要详细了解硬件是如何模拟的。
客户(目标)特定: 当前在 QEMU 中模拟的处理器架构是;Alpha、ARM、Cris、i386、M68K、PPC、Sparc、Mips、MicroBlaze、S390X 和 SH4。将 TB 转换为 TCG 操作所需的特定于这些架构的代码在 /target-xyz/ 中可用,其中 xyz 可以是上述任何给定的架构名称。因此,特定于 i386 的代码可以在 /target-i386/ 中找到。这部分可以称为TCG的前端。
主机 (TCG) 特定: 用于从 TCG 操作生成主机代码的主机特定代码放置在 /tcg/ 中。在 TCG 中可以找到 /xyz/ ,其中 xyz 可以是 i386 、sparc 等,其中包含将 TCG 操作转换为体系结构特定代码的代码。这部分可以称为TCG的后端。
/vl.c :主仿真器循环,设置虚拟机并执行 CPU。
/target-xyz/translate.c :提取的客户代码(客户特定的 ISA)被转换为与架构无关的 TCG 操作
/tcg/tcg.c : TCG 的主要代码。
/tcg/*/tcg-target.c :将 TCG 操作转换为主机代码(主机特定 ISA)的代码。
/cpu-exec.c : /cpu-exec.c中的函数 cpu-exec() 找到下一个翻译块 (TB),如果没有找到,则调用生成下一个 TB 并最终执行生成的代码。