3

我已经开始阅读有关 VMM 的内容,并且想知道管理程序如何知道特权指令(例如,cpuid)发生在 VM 内部而不是真正的操作系统中?

假设我已经执行了cpuid,会发生陷阱并且会发生 VMEXIT ,hypevisor 怎么知道指令发生在我的常规 OS 内部或 VM 内部?

4

2 回答 2

8

First off, you are using the wrong terminology. When an OS runs on top of a hypervisor, the OS becomes the VM (virtual-machine) itself and the hypervisor is the VMM (=virtual machine monitor). A VM can also be called "guest". Thus: OS on top of hypervisor = VM = guest (these expressions mean the same thing).

Secondly, you tell the CPU that it's executing inside the VM from the moment you've executed VMLAUNCH or VMRESUME, assuming you're reading about Intel VMX. When for some reason the VM causes a hypervisor trap, we say that "a VM-exit occured" and the CPU knows it's no longer executing inside the VM. Thus:

  • Between VMLAUNCH/VMRESUME executions and VM-exits we are in the VM and CPUID will trap (causing a VM-exit)
  • Between VM-exits and VMLAUNCH/VMRESUME executions we are in the VMM (=hypervisor) and CPUID will NOT TRAP, since we already are in the hypervisor
于 2014-02-03T22:41:40.470 回答
0

特权指令在用户模式下执行时会产生异常。该异常通常是未定义的指令异常。管理程序挂钩此异常,检查正在执行的指令,然后将控制权返回给VM。当主机操作系统调用同一条指令时,它处于超级用户或提升的权限,并且在执行该指令时通常不会产生异常。所以一般来说,这些问题都是由CPU来处理的。

但是,如果处理器上没有可用的指令(例如浮点仿真),则管理程序可以为VM仿真,如果没有,则链接到 OS 处理程序。它甚至可能允许操作系统在操作系统处理虚拟用户任务的仿真。

所以一般来说,这个问题对于通用 CPU 来说是无法回答的。这取决于如何在VM中模拟指令。但是,最好的情况是管理程序不模拟任何 操作系统指令。仿真不仅会减慢虚拟机的速度,还会减慢整个CPU,包括主机操作系统中的用户进程

于 2013-04-20T21:11:55.783 回答