KVM如何虚拟化性能计数器(PMC)?

时间:2017-04-14 05:53:52

标签: virtual-machine kvm

我在Intel平台上使用 KVM-QEMU 。 我想知道 PMC / PMU 如何在 KVM中虚拟化

我对vPMC的理解如下。

由于PMU是共享物理资源,因此管理程序应在VMExit / VMEnter期间上下文保存/恢复PMC配置和计数器。

但在我的测试中,我感到困惑。

 (In my host Linux, the MSR of IA32_PERF_FIXed_CTRL is set to 0xb0)

首先,在已启动的VM中,

'wrmsr IA32_PERF_FIXed_CTRL 0x0b',在VM中启用FIXed_CTR0。 然后,我在VMExit上记录了IA32_PERF_FIXed_CTRL的MSR,发现FIXed_CTR0未启用。

我认为这是因为当VMExit发生时,它已经在主机上下文中,因此IA32_PERF_FIXed_CTRL的MSR是主机的MSR,而不是主机。

但问题是VM的MSR保存在主机中的位置,以及在VMEnter期间VM的MSR何时何地恢复到CPU

希望我的问题很明确。

谢谢,

1 个答案:

答案 0 :(得分:2)

KVM实现了一个虚拟PMU,它利用Linux的perf子系统进行核心PMU操作。它不会将主机PMU直接暴露给访客。

执行wrmsr IA32_PERF_FIXed_CTRL 0x0b时,您没有写入硬件MSR(特定于模型的寄存器),KVM会捕获MSR写入并更新其虚拟PMU的表示形式。在[{1}}中查找kvm_set_msr_common(),这最终会在x86.c中调用intel_pmu_set_msr()来实现真正的魔力。另请查看pmu_intel.c,这是KVM对PMU的表示。

MSR不需要像典型的VMCS字段那样进行恢复,因为KVM会根据struct kvm_pmu()每个vCPU(struct kvm_pmu())保存来宾特定的PMU设置。