QEMU中的ARM中断处理

use*_*017 5 arm qemu interrupt-handling

我试图了解QEMU如何处理ARM处理器的中断.我有一个裸机二进制blob(即,不是linux - 只是一些汇编代码),它是为ARM1176构建的.当在QEMU中运行时,在初始化期间,二进制blob中的代码设置CPSR的第13位,指示中断向量表位于0xFFFF0000.连接GDB并将指令转储到该地址,我确实可以看到相应的中断向量表.在一个IRQ上,它跳转到0xFFFF0018,只是跳转到0xFFFF00070,它有第一个irq_handler的代码,最终跳转到第二个irq_handler.

这很好,但当我看到在QEMU中挂断中断时,我发现每个引用都挂起了我自己的irq_handler.如果你分配一个irq,我需要提供一个qemu_irq_handler在IRQ被触发时被调用的东西.但在这种情况下,我不希望自己的处理程序被调用.我假设QEMU会模拟ARM处理器并跳转到0xFFFF0018我,例如,调用qemu_set_irq()并开始在那里运行代码.

我确信我的理解中缺少某些东西,但是没有办法让QEMU跳转到中断向量表并在触发中断时运行代码,例如,用qemu_set_irq()

art*_*ise 2

我认为 QEMU 正在为 ARM使用半虚拟化。PC 上的 ARM 设备没有中断控制器。我认为这qemu_irq_handler是一种处理中断的半虚拟化技术。中断从哪里来?特别参见:QEMU 技术文档,

2.11 硬件中断

为了更快,QEMU 不会在每个基本块中检查硬件中断是否挂起。相反,用户必须异步调用特定函数来告知中断正在挂起。该函数重置当前执行的基本块的链接。它确保CPU模拟器的主循环中的执行很快返回。然后主循环可以测试中断是否待处理并处理它。

QEMU 可能附带了一些模拟设备的代码。但是,如果您想使用自己的设备,则需要进行一些自定义操作。它不是真正的ARM 处理器。大多数虚拟化技术都存在中断问题;即使虚拟化由与目标相同的 CPU 托管也是如此。

  • 实际上,似乎调用 `cpu_interrupt(&env, CPU_INTERRUPT_HARD);` 就是我正在寻找的。它跳转到中断向量表并从那里继续执行。 (3认同)