我试图了解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()
?
答案 0 :(得分:1)
我认为QEMU正在使用Paravirtualization作为ARM。 PC上的ARM设备没有中断控制器。我认为qemu_irq_handler
是一种半虚拟化技术来处理中断。 中断将来自哪里?请参阅:QEMU tech document,尤其是
2.11硬件中断
为了加快速度,如果硬件中断挂起,QEMU不会检查每个基本块。相反,用户必须异步调用特定函数来告知中断正在挂起。此函数重置当前正在执行的基本块的链接。它确保执行将很快在CPU仿真器的主循环中返回。然后主循环可以测试中断是否挂起并处理它。
可能QEMU附带了一些模拟设备的代码。但是,如果您想使用自己的设备,则需要自定义。它不是实际的 ARM处理器。大多数虚拟化技术have issues有中断;即使虚拟化由与目标相同的CPU托管。