什么是“不可虚拟化”指令?

什么是“不可虚拟化”指令?

我正在对虚拟化进行一些研究,以供课堂演示之用。

我不清楚“可虚拟化指令”和“不可虚拟化指令”这两个术语。

这里有人可以解释一下吗?

答案1

简而言之:

  • 大多数处理器具有不同的特权级别;这使得操作系统可以中断、限制和终止进程,而不会让任何用户级进程影响任何其他进程。
  • 有一些指令用于处理特权级别,一些低级硬件管理。通常这些指令仅限于在最高特权级别上工作,因此操作系统必须在此级别运行
  • 如果您尝试以较低的权限运行低级操作系统代码,那些低级指令将会失败。理想情况下,故障应该触发一些“真正的低级”操作系统,它可以发挥任何必要的魔力,创造出失败的代码在裸​​机上运行的幻觉。
  • 不幸的是,在 x86 上,一些指令要么默默失败,要么触发全局失败,因此它们被称为“不可虚拟化的”。

这就是问题所在。现在给出解决方案:

  • 半虚拟化:修补操作系统,这样它就不会使用有问题的指令。而是使用对底层系统的调用。(这在 Xen PV 客户机中使用,仅适用于开放操作系统)
  • 模拟:在模拟 CPU 中运行代码,并使用解释每条指令的代码。(由 BOCHS 和其他一些模拟器使用)
  • 重新编译:不是解释每条指令,而是生成与原始代码执行相同操作的新机器代码;但具有所需的捕获功能。(由 QEMU 使用)
  • 自动修补:扫描代码,如果有任何“问题”指令,则用对底层系统的调用替换它。(由 KQEMU 和 VMWare 使用)
  • “硬件虚拟化”:英特尔和 AMD 最近都添加了一种额外的模式,为那些不可虚拟化的指令添加了所需的陷阱。(由 Xen HVM、KVM、VirtualBox 使用)

答案2

这实际上是一个 CPU 架构/指令机制问题——参见http://swtch.com/~rsc/talks/pcarch.pdf为您的研究提供一些好的材料,包括为什么某些指令不可“虚拟化”的详细信息(除非您要像 Bochs 那样模拟整个 CPU(uberslow))。

相关内容