QEMU中的ARM中断处理

6
我正在尝试理解QEMU如何处理ARM处理器的中断。我有一个裸机二进制文件(即,不是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处理器并在我调用qemu_set_irq()并开始在那里运行代码时跳转到0xFFFF0018
我确定我理解上有所欠缺,但是难道没有一种方法可以让QEMU跳转到中断向量表并在触发中断时运行那里的代码,例如使用qemu_set_irq()吗?
1个回答

2
我认为QEMU对ARM使用了半虚拟化技术。PC上没有ARM设备的中断控制器。我认为qemu_irq_handler是处理中断的半虚拟化技术。那么中断将从哪里来呢?请参见:QEMU技术文档,特别是第2.11节“硬件中断”:

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

可能 QEMU 自带一些代码来模拟设备。但是,如果你想使用自己的设备,你需要做一些定制的工作。它并不是一个真正的 ARM 处理器。大多数虚拟化技术 都存在中断问题,即使虚拟化是由与目标相同的 CPU 托管。

3
实际上,调用 cpu_interrupt(&env, CPU_INTERRUPT_HARD); 似乎是我正在寻找的。这会跳转到中断向量表并从那里继续执行。 - user2071017
如果您可以更新代码以使中断发生,则此方法有效。我的答案是为了考虑您无法更新代码的情况。因此,两种方法都可能很有价值。 - artless noise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接