我试图了解QEMU如何处理ARM处理器的中断 . 我有一个裸机二进制blob(即,不是linux - 只是一些汇编代码),它是为ARM1176构建的 . 在QEMU中运行时,在初始化期间,二进制blob中的代码设置CPSR的第13位,指示中断向量表位于 0xFFFF0000
. 连接GDB并将指令转储到该地址,我确实可以看到相应的中断向量表 . 在一个IRQ上,它跳转到 0xFFFF0018
,它只是跳转到 0xFFFF00070
,它有第一个irq_handler的代码,最终跳转到第二个irq_handler .
这很好,但当我看到在QEMU中挂断中断时,我发现每个引用都挂起了我自己的irq_handler . 如果你分配一个irq,我需要提供一个在触发IRQ时被调用的 qemu_irq_handler
. 但在这种情况下,我不希望自己的处理程序被调用 . 我假设QEMU将模拟ARM处理器并跳转到 0xFFFF0018
,例如,当我调用 qemu_set_irq()
并开始在那里运行代码时 .
我确信我的理解中缺少某些东西,但是有没有办法让QEMU跳转到中断向量表并在触发中断时运行代码,例如 qemu_set_irq()
?
1 回答
我认为QEMU正在使用Paravirtualization作为ARM . PC上的ARM设备没有 interrupt controller . 我认为
qemu_irq_handler
是一种处理中断的技术 . interrupts 将来自哪里?见:QEMU tech document特别是,可能QEMU附带了一些模拟设备的代码 . 但是,如果您想使用自己的设备,则需要自定义 . 它不是一个真正的ARM处理器 . 大多数技术都有中断;即使虚拟化由与目标相同的CPU托管 .