2013-02-14 51 views
5

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

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

我确定我的理解有些问题,但是在没有办法让QEMU跳转到中断向量表并在触发中断时运行代码,例如qemu_set_irq()

回答

1

我认为QEMU使用ARM的Paravirtualization。对于PC上的ARM设备,没有中断控制器。我认为qemu_irq_handler是一个准虚拟化技术来处理中断。 中断会从哪里来?请参阅:QEMU tech document尤其是,

2.11硬件中断

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

很可能QEMU带有一些代码来模拟设备。但是,如果您想使用自己的设备,则需要进行自定义操作。它不是实际的 ARM处理器。大多数虚拟化技术have issues与中断;即使虚拟化由与目标相同的CPU托管也是如此。

+2

实际上,调用'cpu_interrupt(&env,CPU_INTERRUPT_HARD)'是我看到的。它跳转到中断向量表并继续从那里执行。 – user2071017 2013-02-25 04:45:31