我开始阅读关于VMM的内容,并且自己想知道虚拟机管理程序如何知道在VM内发生的特权指令(例如,cpuid)而不是真正的操作系统?
假设我已经执行了 cpuid ,会发生陷阱并且会发生VMEXIT,该怎么办? 会知道指令发生在我的常规操作系统内或VM内吗?
答案 0 :(得分:4)
首先,您使用的是错误的术语。当操作系统在虚拟机管理程序之上运行时, 操作系统将成为虚拟机(虚拟机) , 虚拟机管理程序是VMM(=虚拟机)机器监视器) 。 VM 也可以称为“ 来宾 ”。因此:虚拟机管理程序之上的操作系统= VM =来宾(这些表达式意味着相同的事情)。
其次,从执行 VMLAUNCH 或 VMRESUME <的那一刻起,您告诉 CPU 在VM内执行 / strong>,假设您正在阅读有关英特尔VMX的信息。当由于某种原因VM导致管理程序陷阱时,我们说“ VM退出 ”并且CPU知道它不再在VM内执行。因此:
答案 1 :(得分:0)
特权指令在用户模式中执行时会生成异常。例外通常是未定义指令异常。 hypervisor 挂钩此异常,检查正在执行的指令,然后将控制权返回给 VM 。当主机 OS调用相同的指令时,它处于主管或提升的权限中,并且在执行指令时通常不会生成异常。通常,这些问题由 CPU 处理。
但是,如果处理器上没有指令(例如浮点仿真),则虚拟机管理程序可以模拟 VM 如果没有,则链到OS处理程序。可能甚至允许 OS 处理 OS 中 VM 和用户任务的仿真。< / p>
一般来说,这个问题对于通用CPU来说是无法回答的。这取决于在 VM 中如何模拟指令。但是,最好的情况是 hypervisor 不会模拟任何 OS 指令。仿真不仅会降低虚拟机的速度,还会影响整个 CPU ,包括主机 OS 中的用户进程。