2013-02-14 205 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