KVM 用户空间来宾超时

Timeout for KVM userspace guest

我正在构建一个自定义 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 日志条目,它可以贵点。