Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
QEMU中的ARM中断处理_Arm_Qemu_Interrupt Handling - Fatal编程技术网

QEMU中的ARM中断处理

QEMU中的ARM中断处理,arm,qemu,interrupt-handling,Arm,Qemu,Interrupt Handling,我试图理解QEMU如何处理ARM处理器的中断。我有一个裸机二进制blob(即,不是linux——只是一些汇编代码),它是为ARM1176构建的。在QEMU中运行时,在初始化过程中,二进制blob中的代码设置CPSR的第13位,指示中断向量表位于0xFFFF0000。连接GDB并在该地址转储指令,我确实可以看到相应的中断向量表。在IRQ上,它跳转到0xFFFF0018,它只跳转到0xFFFF00070,其中包含第一个IRQ\u处理程序的代码,并最终跳转到第二个IRQ\u处理程序 这很好,但当我查看

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

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


我确信我的理解中缺少了一些东西,但是否有某种方法可以让QEMU跳转到中断向量表,并在触发中断时在那里运行代码,例如,使用
QEMU\u set\u irq()

我认为QEMU用于ARM。PC上的ARM设备没有中断控制器。我认为
qemu\u irq\u处理器
是一种半虚拟化技术来处理中断。中断将从何而来?看:特别是,

2.11硬件中断

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


QEMU可能附带了一些代码来模拟设备。然而,如果你想使用自己的设备,你需要做一些定制的事情。它不是一个真正的ARM处理器。大多数具有中断的虚拟化技术;即使虚拟化由与目标相同的CPU托管。

实际上,调用
CPU\u中断(&env,CPU\u interrupt\u HARD)就是我刚才看到的。它跳转到中断向量表并从那里继续执行。