x86 架构中的 "non-virtualizable" 指令是什么?

What are "non-virtualizable" instructions in x86 architecture?

在硬件辅助虚拟化出现之前,有些指令由于各种原因无法虚拟化。有人可以解释一下这些指令是什么以及为什么它们不能被虚拟化吗?

要虚拟化 ISA,必须满足某些要求。 Popek and Goldberg 使用了如下内容:

一台机器至少有两种模式 (a) 用户模式 和 (b) 系统模式。通常,应用程序 运行 处于 用户模式 ​​,操作系统 运行 处于 系统模式 。在系统模式下,code/program可以不受限制地查看和操作机器。在 用户模式 ​​ 中,code/program 在其功能上有一些限制,例如如果不先获得许可,它不能访问机器的所有内存。

指令是 (a) 特权 或 (b) 非特权特权指令陷阱用户模式下执行。陷阱意味着机器被强制进入系统模式,从而执行操作系统的一些代码来处理这种情况。从某种意义上说,它们会在执行时提醒操作系统。

说明也可以是 (a) 敏感 或 (b) 不敏感敏感 指令修改机器的部分资源,或者根据它们是在用户模式还是系统模式下执行而表现出不同的行为.

虚拟化 ISA 时,虚拟机监视器 (VMM) 能够检测并顺利处理程序或客户操作系统修改计算机资源的任何尝试非常重要。它必须能够看到 sensitive 指令何时被执行。为此,sensitive 指令中的 all 需要 privileged 并因此在执行时陷入陷阱。当被困时,我们可以进入系统模式并从VMM调用代码来处理资源修改。

问题在于并非所有 X86 的 sensitive 指令都是 privileged 指令。这意味着资源修改可以在 VMM 不可见和处理的情况下发生,这可能很危险。或者,它可能意味着在 用户模式 ​​ 下在客户操作系统中执行一条指令,并看到与在 系统模式 下执行指令不同的效果。根据 this paper,x86 中有 17 条指令是 敏感 非特权。一个例子是 POPF,它根据机器的模式具有不同的语义。