Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在qemu-kvm上获取多个性能监视中断_Assembly_Intel_Qemu_Kvm_Interrupt Handling - Fatal编程技术网

Assembly 在qemu-kvm上获取多个性能监视中断

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

我遵循给出的步骤和指示,现在可以得到计数器溢出中断一次。但我无法多次得到它。无论我做了什么,Iterrupt都不会再启动了。尽管我负责清除中断掩码。

没有任何代码很难判断,但如果您已经收到第一个PMI,那么计数器寄存器设置正确,问题可能在于上层1

我想检查一下:

  • 已将文件发送至LAPIC。

    我假设您使用固定向量配置了本地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之间的切换导致内核重新编程计数器