我正在构建一个自定义VMM,并且我正在尝试在不使用信号的情况下实现超时(这是"发送"的信号)。(我不打算使用线程)。
现在,一个想法是实现LAPIC,在执行客户代码之前,我们可以编程LAPIC TIMER,使其在特定时间后触发。它应该有一个相当不错的超时与此。然而,这个解决方案对于简单的超时行为来说是相当痛苦的。
有没有其他更好的方法让KVM在一定时间后中断自己?我真的很希望有一个参数给KVM_RUN或者别的什么,真的。
从标题中可以清楚地看出,客户机大多数时间都在用户空间执行。内核层非常薄。除非万不得已,我可不想装LAPIC。想法吗?
将KVM_CREATE_IRQCHIP与KVM_SET_LAPIC结合使用,我们可以利用模拟的LVT定时器来获得KVM上的每个线程执行超时,而不会有任何麻烦。调用KVM_SET_LAPIC的代价很高,但是为了避免将msr和设备暴露给客户机,这是必要的。
我尝试使用KVM API编写msr,但即使这样也不可能(我猜没有适当的CPUID位)。无论哪种方式,无论您在客户机中禁用了多少特性,LAPIC计时器都可以工作。
KVM_SET_LAPIC在我的机器上花费大约3微秒(这是极端的),所以我仍然在寻找替代方案。我推测,如果您信任内核中的ring-0,只编写x2APIC TIMER和INITCNT msr可能会更便宜。
要记住的一件事是同时设置CURRENTCNT寄存器,因为KVM_SET_LAPIC是显式的,如果你最终使用CURRENTCNT>INITCNT将得到一个dmesg日志条目,这可能会很昂贵。