QEMU虚拟机关键源代码学习

<--- 以下是2007年做相关工作的学习笔记(留意,版本比较早了,其后可能有各种改动)。多年过去了,世事变迁,加上我的水平非常有限,现在翻出来仅供批评,勿认真,而且现在我自己也看不懂了。 大笑 --->
QEMU是一款虚拟机软件,模拟了包括CPU在内的各种硬件系统,包括:
  1. 指令解释和执行
  2. 异常、中断、时钟等CPU相关模块
  3. 内存、网卡、硬盘,显示系统,以及键盘和鼠标输入

QEMU虚拟机的初始化过程:
  1. 分配、初始化虚拟的CPU、内存等数据结构。
  2. 分配、初始化其他硬件设备
  3. 如指定了CPU状态和内存镜像则将两者加载
  4. 启动时钟系统
  5. 调用cpu_exec运行guest系统

以下分若干小节介绍具体工作流程。

指令的翻译和执行过程

Guest即被虚拟的系统,Guest的指令系统不一定跟Host机相同,比如可以在x86上虚拟出一台arm机器来。
对guest指令的翻译和执行过程如下:
  1. 根据guest的CPU状态得到当前指令指针的guest逻辑地址;
  2. 根据mmu状态得到在guest物理地址;
  3. 加上guest内存在host内存的基址得到待执行指令的host逻辑地址;
  4. 取出待执行指令,在微操作函数库中查找待执行指令的微操作函数(一小段C代码,但是已经编译为二进制)并拷贝到执行缓冲区TB;
  5. 根据指令执行流程,对下一条指令重复上面步骤,直到发现一条jump指令,或者一条修改CPU状态并无法预测结果的指令,或者发现TB满了;
  6. 给执行缓冲区TB生成一段段落结束代码,其中包含jump的跳向;
  7. 调用dyngen函数对上述生成的代码做重定位,使其能寻址到guest数据区;
  8. 执行上述生成的代码;
以上是虚拟机工作的最核心过程。

指令翻译过程的传送图


指令翻译过程的传送图

  1. Op.c文件编译为obj格式的微操作函数库。
  2. 每条guest指令对应一个微操作序列。
  3. 拷贝guest指令对应的微操作序列到TB中,形成host指令序列。

Guest和host的寻址转换关系


Guest和host的寻址转换关系

说明:
  1. Disas_insn(): 对guest代码逐条翻译,并存放在TB中。
  2. Dyngen_code(): 重定向翻译后的代码。

TB相关数据结构

  1. TB是一个数组:TranslationBlock tbs[CODE_GEN_MAX_BLOCK
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值