Assembly 在qemu-kvm上获取多个性能监视中断
我遵循给出的步骤和指示,现在可以得到计数器溢出中断一次。但我无法多次得到它。无论我做了什么,Iterrupt都不会再启动了。尽管我负责清除中断掩码。没有任何代码很难判断,但如果您已经收到第一个PMI,那么计数器寄存器设置正确,问题可能在于上层1 我想检查一下:Assembly 在qemu-kvm上获取多个性能监视中断,assembly,intel,qemu,kvm,interrupt-handling,Assembly,Intel,Qemu,Kvm,Interrupt Handling,我遵循给出的步骤和指示,现在可以得到计数器溢出中断一次。但我无法多次得到它。无论我做了什么,Iterrupt都不会再启动了。尽管我负责清除中断掩码。没有任何代码很难判断,但如果您已经收到第一个PMI,那么计数器寄存器设置正确,问题可能在于上层1 我想检查一下: 已将文件发送至LAPIC。 我假设您使用固定向量配置了本地APIC的PMI寄存器。 在这种情况下,您必须向EOI注册表发送EOI。 引用英特尔(第3卷第10.8.5章) 对于所有中断,除了与NMI、SMI、INIT、EXIT、启动或IN
我假设您使用固定向量配置了本地APIC的PMI寄存器。
在这种情况下,您必须向EOI注册表发送EOI。
引用英特尔(第3卷第10.8.5章) 对于所有中断,除了与NMI、SMI、INIT、EXIT、启动或INIT Deassert交付一起交付的中断 模式下,中断处理程序必须包括对中断结束(EOI)寄存器的写入 示例代码:
mov DWORD [APIC_BASE+0xb0], eax
对于未重新定位的LAPIC,有效地址为
0xfee000b0
写入值不相关,我选择了一个寄存器来保持指令的编码简短。
当然,您必须根据您的上下文正确访问LAPIC。
IF
标志
清除
IF
标志不太可能是一个假设,但也很容易排除。由于中断门(而非陷阱门)清除了
IF
,请确保您选择的退出ISR的方式正确恢复IF
1如果我没记错的话,PMI不需要重新武装 这篇文章讨论了这个问题,他们发现这是内核中的一个bug。但是,您可以通过以下方式绕过它: 在需要重新编程msr msr_PERF_FIXED_CTR0(0x38d)的任何位置,放置以下行:
Msr::write(Msr::MSR_PERF_FIXED_CTR0, 0xfffffffffff0ull);
Msr::write(Msr::MSR_PERF_FIXED_CTRL, 0x0);
Msr::write(Msr::MSR_PERF_FIXED_CTR0, 0xfffffffffff0ull);
Msr::write(Msr::MSR_PERF_FIXED_CTRL, 0xa);
值0x0和0xa之间的切换导致内核重新编程计数器