我在OS内核中编写了一些函数,以在指令计数器溢出时发出性能监视中断(PMI)。它在我的机器(Intel Core i5)上运行良好。但是当我使用

qemu-system-x86_64-启用-kvm -cpu主机-m 256-串行mon:stdio -cdrom var / run / hypervisor.iso

中断不会触发。
我有什么想念的吗?
是否需要任何特殊配置才能在Qemu上触发PMI?
我记得指令计数在qemu中很好用。
MSR寄存器激活PMI

Msr::write(Msr::MSR_PERF_GLOBAL_CTRL, 0x700000003);
Msr::write(Msr::MSR_PERF_FIXED_CTRL, 0xa);
Msr::write(Msr::IA32_PERFEVTSEL0, 0x004100c5);

对PMI进行编程以获取0x1000指令
Msr::write(Msr::IA32_PERF_GLOBAL_OVF_CTRL, 1ull << 32);
Msr::write(Msr::MSR_PERF_FIXED_CTR0, 0xFFFFEFFF | 0xFFFF00000000);

最佳答案

here讨论中可以看出,仅当您写入PERF_FIXED_CTR_CTRL(0x38d)时,kvm才会更新虚拟计数器。

因此,要获得pmi,最好在设置计数器值之后,将该寄存器设置在最后一个位置。

为了完整起见,必须按以下顺序发布说明:

; set counter value.
mov edx, 0xffff
mov eax, 0xffff0000
mov ecx, 0x309
wrmsr

; set counting mode
xor edx, edx
mov eax, 0xa
mov ecx, 0x38d
wrmsr

07-24 09:36