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

时间:2017-12-05 01:26:23

标签: x86 virtualization

为什么以下说明必须虚拟化。如何无法虚拟化这可能会导致问题。

  1. SGDT,SLDT,SIDT,SMSW
  2. fcall,longjump,srt
  3. LAR,VERR,VERW,LSL
  4. pushf,popf,iret

2 个答案:

答案 0 :(得分:2)

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

允许VMM(但不是必需)为sgdt,sldt,sidt和str请求VM出口。除此之外,列出的任何指令都不会导致VM退出。

处理器本身对其中两条指令执行次要虚拟化:

  • 在访客中更改了SMSW的行为,以便访客看到 VMM想要它的价值。

  • 在guest虚拟机中更改IRET指令的行为以清除 NMI阻止。

答案 1 :(得分:0)

显然不允许修改机器状态(段基数/限制,禁用中断等),或者客户机可能会突破VM或至少挂起它。 (例如,通过运行无限循环并禁用中断。)

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

您希望物理计算机在guest虚拟机禁用中断时启用中断。但是,您还希望guest虚拟机在运行的虚拟x86上禁用中断时查看IF=0。因此,您需要虚拟化pushf以及popf