C++ / a working model

162 / 163   ·   C11   ·   约 8 分钟

虚拟机

先记住这句话

虚拟机监视器在硬件与操作系统之间插入透明抽象层,让多个客户操作系统同时运行并各自以为独占机器。本附录讲解其历史背景、当代用途以及CPU虚拟化的关键机制。

本篇内容
  1. 在操作系统下方再造一层幻觉
  2. 虚拟化再度流行的原因
  3. 用有限直接执行虚拟化CPU
  4. 拦截特权指令与系统调用
  5. 运行示例
  6. 动手练习

官方章节 PDF

在操作系统下方再造一层幻觉

操作系统已经让应用程序误以为拥有私有CPU和巨大虚拟内存。虚拟机监视器必须对操作系统重复同样的把戏:每个客户操作系统都认为自己直接掌控物理硬件,而监视器在暗中复用真实资源。监视器相当于操作系统的操作系统,却必须保持完全透明,客户代码无需任何改动。

虚拟化再度流行的原因

许多服务器上运行着不同操作系统或版本,但利用率很低。虚拟化把这些负载合并到更少的物理机器上,既节省成本又简化管理。桌面用户可在一台机器上同时使用多个操作系统以运行原生应用。开发人员也能在单一硬件上测试软件在各种操作系统版本上的行为。

用有限直接执行虚拟化CPU

启动一个客户操作系统时,监视器只需跳转到其第一条指令即可开始执行。在多个虚拟机之间切换时,监视器必须保存完整机器状态(普通寄存器、程序计数器以及所有特权硬件状态),再恢复目标虚拟机的状态。大多数普通指令直接在真实CPU上运行,只有特权操作才会被拦截。

拦截特权指令与系统调用

客户操作系统或应用程序一旦尝试执行特权指令,就会陷入监视器。监视器在客户操作系统启动时记下其陷阱处理程序的位置。用户进程发出系统调用时,陷阱首先到达监视器,监视器再把控制权转交给客户操作系统的处理程序。客户操作系统执行返回指令时同样会再次陷入监视器,由监视器完成真正的模式切换。

常见误区

  • 以为客户操作系统可以直接执行特权指令而不被监视器拦截
  • 虚拟机切换时遗漏保存特权硬件状态,导致恢复后行为错误

运行一个例子

这一章用官方 PDF 讲清概念;本页不附带可运行程序。

CHECK YOUR UNDERSTANDING

合上答案,试着解释。

运行在客户操作系统上的进程发出系统调用时,虚拟机监视器如何既让调用正确完成又不失去对硬件的控制?

查看参考答案

硬件陷阱首先进入监视器(因为它安装了真正的陷阱处理程序)。监视器把控制权交给先前记录的客户操作系统陷阱处理程序。客户操作系统处理完毕并执行返回指令时,该指令再次陷入监视器,监视器随后执行真正的返回到用户模式。

继续查证

标准草案与官方章节会更新;版本标记只说明示例最低要求。

回到目录