我试图了解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 处理器,并在我调用 qemu_set_irq()
并开始在那里运行代码时跳转到0xFFFF0018
。
我确定我的理解中缺少一些东西,但是有没有办法让 QEMU 跳转到中断向量表并在触发中断时在那里运行代码,例如,使用 qemu_set_irq()
?
我认为QEMU正在为ARM使用半虚拟化。 电脑上的 ARM 设备没有中断控制器。 我认为qemu_irq_handler
是一种处理中断的半虚拟化技术。 中断从何而来? 请参阅:QEMU技术文档,
2.11 硬件中断
为了更快,QEMU 不会在每个基本块上检查硬件中断是否挂起。相反,用户必须异步调用特定函数来告知中断处于挂起状态。此函数重置当前正在执行的基本块的链接。它确保执行将很快在 CPU 模拟器的主循环中返回。然后主循环可以测试中断是否挂起并处理它。
可能QEMU附带了一些代码来模拟设备。 但是,如果您想使用自己的设备,则需要执行一些自定义操作。 它不是实际的ARM处理器。 大多数虚拟化技术都存在中断问题;即使虚拟化由与目标相同的 CPU 托管。