有时,虚拟机监控程序需要在虚拟机(VM)中模拟操作。例如,VM内的软件可能尝试配置与功耗管理或缓存一致性相关的低级处理器控件。通常,您不希望将VM直接访问这些控件,因为它们可能被用于突破隔离,或影响系统中的其他VM。
trap在执行给定操作(例如读取寄存器)时引发异常。虚拟机监控程序需要能够在VM中捕获并模拟此类操作,而不影响其他VM。
架构包括用于在VM中捕获操作并模拟它们的trap控件。设置trap时,执行通常允许的特定操作会导致exception到更高的异常级别。虚拟机监控程序可以使用这些trap来在VM内模拟操作。
例如,执行Wait For Interrupt(WFI)指令通常会将CPU置于低功耗状态。通过assert TWI 位(如果 HCR_EL2.TWI==1),然后在 EL0 或 EL1 执行 WFI 将导致异常到 EL2。
【注意】:trap不仅用于虚拟化。还有由EL3和EL1控制的trap。 然而,trap对于虚拟化软件尤其有用。本指南仅讨论通常与虚拟化相关的trap。
在我们的WFI示例中,操作系统通常会在空闲循环的一部分执行WFI。对于位于VM内的Guest OS,虚拟机监控程序可以捕获此操作并调度另一个vCPU,如下图所示:
显示寄存器的虚拟值
使用trap的另一个例子是