5

我试图了解 QEMU 如何处理 ARM 处理器的中断。我有一个为 ARM1176 构建的裸机二进制 blob(即,不是 linux——只是一些汇编代码)。在 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()?

4

1 回答 1

1

我认为 QEMU 正在为 ARM使用准虚拟化。PC 上的 ARM 设备没有中断控制器。我认为这qemu_irq_handler是一种处理中断的半虚拟化技术。中断将来自哪里?请参阅:特别是QEMU 技术文档,

2.11 硬件中断

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

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

于 2013-02-15T15:47:27.613 回答