我在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是主机,而不是主机 .
但问题是VM的MSR保存在主机中的位置,以及在VMEnter期间VM的MSR何时何地恢复到CPU?
希望我的问题很清楚 .
谢谢,
1 回答
KVM实现了一个虚拟PMU,它利用Linux的perf子系统进行核心PMU操作 . 它不会将主机PMU直接暴露给guest虚拟机 .
当您执行“wrmsr IA32_PERF_FIXed_CTRL 0x0b”时,您没有写入硬件msr,KVM捕获msr写入并在其虚拟pmu的表示中进行更新 . 在x86.c中查找kvm_set_msr_common(),这将最终调用pmu_intel.c中的intel_pmu_set_msr()来实现真正的魔力 . 另请参阅struct kvm_pmu(),它是KVM对PMU的表示 .
MSR不需要像典型的VMCS字段那样进行恢复,因为KVM在每个vcpu(struct kvm_vcpu)的struct kvm_pmu()中保存了客户特定的pmu设置 .