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



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

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

一台机器至少有两种模式(A) 用户模式和(b) 系统模式。通常,应用程序以用户模式运行,操作系统以系统模式运行。在系统模式下,代码/程序可以不受限制地看到和操作机器。在用户模式下,代码/程序在它能做的事情上有一些限制,例如,它不能在没有获得许可的情况下访问所有的机器内存。

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

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

在虚拟化ISA时,重要的是虚拟机监视器(VMM)能够检测并顺利处理程序或客户机操作系统修改机器资源的任何尝试。它必须能够看到敏感的指令何时正在执行。为此,所有敏感指令的需要具有特权,从而在执行时捕获。当被捕获时,我们可以进入系统模式,从VMM调用代码来处理资源修改。

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

相关内容

最新更新