我正在使用 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)
首先,在启动的虚拟机中,
我
'wrmsr IA32_PERF_FIXed_CTRL 0x0b
', 启用 FIXed_CTR0
在虚拟机中。然后,我在VMExit 记录IA32_PERF_FIXed_CTRL 的MSR,发现FIXed_CTR0 未启用。
我想是因为VMExit发生时,它已经在host上下文中了,所以IA32_PERF_FIXed_CTRL的MSR是host之一,而不是host。
但问题是,VM 的 MSR 保存在主机中的何处,以及 VMEnter 期间 VM 的 MSR 何时何地恢复到 CPU?
希望我的问题很清楚。
谢谢,
最佳答案
KVM 实现了一个虚拟 PMU,它利用 Linux 的 perf 子系统进行核心 PMU 操作。它不会将主机 PMU 直接暴露给 guest 。
当您这样做时wrmsr IA32_PERF_FIXed_CTRL 0x0b
,您没有写入硬件 MSR(特定于模型的寄存器),KVM 会捕获 MSR 写入并在其虚拟 PMU 的表示中进行更新。寻找 kvm_set_msr_common()
在 x86.c
,这最终会调用 intel_pmu_set_msr()
在 pmu_intel.c
这才是真正的魔法。还看struct kvm_pmu()
这是 KVM 对 PMU 的表示。
MSR 不需要像典型的 VMCS 字段一样恢复,因为 KVM 将客户特定的 PMU 设置保存在 struct kvm_pmu()
中。每个 vCPU ( struct kvm_vcpu
)。
关于virtual-machine - KVM 如何虚拟化性能计数器 (PMC)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43405962/