我在操作系统内核中编写了一些函数,以便在指令计数器溢出时发出性能监控中断(PMI)。它在我的机器(Intel core i5)上运行良好。但是当我使用 qemu 在 qemu 上运行它时
qemu-system-x86_64 -enable-kvm -cpu 主机 -m 256 -serial 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);
针对 0x1000 指令对 PMI 进行编程
Msr::write(Msr::IA32_PERF_GLOBAL_OVF_CTRL, 1ull << 32);
Msr::write(Msr::MSR_PERF_FIXED_CTR0, 0xFFFFEFFF | 0xFFFF00000000);
从讨论来看,您可以看到,仅当您写入 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)