pushf和popf会在x86平台上的虚拟机中导致VMEXIT吗



我正在尝试在kvm支持的虚拟机中运行的linux内核中添加一些代码。然而,我发现指令pushfpopf会造成巨大的性能开销,apache的速度最多会降低5倍。我确信是这两条指令造成了开销,因为如果我用lahfsahf替换它们,开销就消失了。

现在我想知道为什么它们会带来如此多的退化,以及如何避免它们?我在这张幻灯片中发现了一些线索,这表明pushf和popf将被困在hypervisor中。它们真的会导致VMEXIT吗?exit_reason的数字是多少?最后,是否要配置VMCS,使pushfpopf不会被捕获?

在英特尔处理器上,SDM第3卷第25章介绍了所有可能导致虚拟机退出或在来宾中具有不同行为的指令。Pushf和popf在该章中没有列出,这意味着这些指令不会导致VM退出,并且它们在来宾中执行时的可观察行为与在来宾外部执行时相同。

popf指令不需要VM退出的原因(尽管问题中引用了幻灯片)是VMCS具有覆盖通常由标志寄存器控制的行为的控件。例如,在guest中,IF标志并不仅仅控制中断的传递;相反,VMCS中的标志控制是否将外部中断传递给访客或者是否发生VM退出。

考虑到popf所做的一切,它对性能的影响并不是微不足道的,这并不让我感到惊讶。有关详细信息,请参阅软件开发人员手册中对popf的描述。

最新更新