虚拟化这些指令的原因是什么?

what are the reasons for virtualising these instructions?

为什么必须虚拟化以下指令。虚拟化失败怎么会导致问题。

  1. sgdt,sldt,sidt,smsw
  2. fcall,longjump,srt
  3. lar,verr,verw,lsl
  4. pushf、popf、iret

修改机器状态(段基础/限制、禁用中断等)显然是不允许的,否则来宾可能会脱离 VM 或至少挂起它。 (例如,通过 运行 禁用中断的无限循环。)

pushf/popf 有点微妙:请记住 IFcli/sti 翻转的中断启用位)是其中之一EFLAGS 中的位。

您希望物理机启用中断,而客户机禁用中断。但是您还希望来宾在 运行 所在的虚拟 x86 上禁用中断时看到 IF=0。所以你需要虚拟化 pushf 以及 popf.

当 Intel VMX 模式用于虚拟化时,这是 Intel 平台上当前虚拟化解决方案的情况,none 这些指令需要由 VMM 虚拟化,因为它们不访问或更改受保护的机器状态。

允许(但不是必需)VMM 为 sgdt、sldt、sidt 和 str 请求 VM 退出。除了这些,none 列出的指令曾经导致 VM 退出。

处理器本身对其中两条指令执行较小的虚拟化:

  • 来宾中更改了SMSW的行为,以便来宾看到 VMM 想要的值。

  • 客机中IRET指令的行为被改成清零 NMI 阻塞。