我正在尝试在由kvm驱动的虚拟机中运行的linux内核中添加一些代码。但是,我发现指令pushf
和popf
会导致巨大的性能开销,apache的速度最多降低5倍。我确信正是这2条指令造成了开销,因为如果我用lahf
和sahf
替换它们,开销就消失了。
现在我想知道为什么它们会带来如此多的退化,以及如何避免它们呢?我在this slide中发现了一些线索,这表明pushf和popf将被困在管理程序中。它们是否真的导致VMEXIT,并且exit_reason
是多少?最后,是否有必要配置VMCS,以使pushf
和popf
不会被困住?
答案 0 :(得分:3)
在Intel处理器上,所有可能导致VM退出或来宾中具有不同行为的指令均在SDM第25卷第3卷中进行了描述。在该章的任何地方都没有列出Pushf和popf,这意味着这些指令不会导致VM退出,并且在guest虚拟机中执行时,它们的可观察行为与在guest虚拟机中执行时相同。
popf指令不需要VM退出的原因(尽管问题中引用了幻灯片)是因为VMCS具有控件来覆盖通常由标志寄存器控制的行为。例如,在访客中时,IF标志不仅仅控制中断的传递。相反,VMCS中的标志控制是否将外部中断传递给来宾或是否发生VM退出。
考虑到所有这些因素,popf对性能的影响并不小,这并不令我感到惊讶。有关详细信息,请参见软件开发人员手册中的popf的说明。