虚拟化这些指令的原因是什么?
what are the reasons for virtualising these instructions?
为什么必须虚拟化以下指令。虚拟化失败怎么会导致问题。
- sgdt,sldt,sidt,smsw
- fcall,longjump,srt
- lar,verr,verw,lsl
- pushf、popf、iret
修改机器状态(段基础/限制、禁用中断等)显然是不允许的,否则来宾可能会脱离 VM 或至少挂起它。 (例如,通过 运行 禁用中断的无限循环。)
pushf
/popf
有点微妙:请记住 IF
(cli
/sti
翻转的中断启用位)是其中之一EFLAGS 中的位。
您希望物理机启用中断,而客户机禁用中断。但是您还希望来宾在 运行 所在的虚拟 x86 上禁用中断时看到 IF=0
。所以你需要虚拟化 pushf
以及 popf
.
当 Intel VMX 模式用于虚拟化时,这是 Intel 平台上当前虚拟化解决方案的情况,none 这些指令需要由 VMM 虚拟化,因为它们不访问或更改受保护的机器状态。
允许(但不是必需)VMM 为 sgdt、sldt、sidt 和 str 请求 VM 退出。除了这些,none 列出的指令曾经导致 VM 退出。
处理器本身对其中两条指令执行较小的虚拟化:
来宾中更改了SMSW的行为,以便来宾看到
VMM 想要的值。
客机中IRET指令的行为被改成清零
NMI 阻塞。
为什么必须虚拟化以下指令。虚拟化失败怎么会导致问题。
- sgdt,sldt,sidt,smsw
- fcall,longjump,srt
- lar,verr,verw,lsl
- pushf、popf、iret
修改机器状态(段基础/限制、禁用中断等)显然是不允许的,否则来宾可能会脱离 VM 或至少挂起它。 (例如,通过 运行 禁用中断的无限循环。)
pushf
/popf
有点微妙:请记住 IF
(cli
/sti
翻转的中断启用位)是其中之一EFLAGS 中的位。
您希望物理机启用中断,而客户机禁用中断。但是您还希望来宾在 运行 所在的虚拟 x86 上禁用中断时看到 IF=0
。所以你需要虚拟化 pushf
以及 popf
.
当 Intel VMX 模式用于虚拟化时,这是 Intel 平台上当前虚拟化解决方案的情况,none 这些指令需要由 VMM 虚拟化,因为它们不访问或更改受保护的机器状态。
允许(但不是必需)VMM 为 sgdt、sldt、sidt 和 str 请求 VM 退出。除了这些,none 列出的指令曾经导致 VM 退出。
处理器本身对其中两条指令执行较小的虚拟化:
来宾中更改了SMSW的行为,以便来宾看到 VMM 想要的值。
客机中IRET指令的行为被改成清零 NMI 阻塞。