5

QEMU が ARM プロセッサの割り込みを処理する方法を理解しようとしています。ARM1176 用にビルドされたベア メタル バイナリ BLOB (つまり、Linux ではなく、アセンブリ コードのみ) があります。QEMU で実行すると、初期化中にバイナリ blob のコードが CPSR のビット 13 を設定し、割り込みベクトル テーブルが にあることを示します0xFFFF0000。GDB を接続してそのアドレスに命令をダンプすると、実際に対応する割り込みベクトル テーブルが表示されます。IRQ では、最初の irq_handler のコードを持つ に0xFFFF0018ジャンプし0xFFFF00070、最終的に 2 番目の 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 に答える