我在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
希望我的问题很明确。
谢谢,
答案 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设置。