SWI割り込みについて話しているのですか?または他のいずれか (FIQ、IRQ)。いずれにせよ、私は問題が何であるかを知っていると思います。Qemu は Linux を実行するためのものです。バイナリはアドレス 0x00000 にロードされないため、エントリ ポイントは qemu によって例外処理に使用されません。
qemu を使用してソリューションを実装する例があります。http://github.com/dwelch67/yagbatの qemu ディレクトリに移動します。qemu の例は、yagbat リポジトリの gba とはあまり関係がありません。gba は 32 ビット ARM のものなので、簡単にコードを借りることができたので、そこに貼り付けました。
この例は、この方法でqemuを使用する方法を理解しようとしたときに、あなたの質問のために特別に書かれました. アドレス 0x00000000 空間が RAM としてシミュレートされているように見えるため、qemu 例外テーブルを書き直して、バイナリがロードする 0x10000 アドレス空間でコードを例外に呼び出すことができます。
手っ取り早い解決策は、バイナリのエントリ ポイント (qemu が 0x10000 にロードする) をアドレス 0x00000 のベクトル テーブルのようにすることです。ldr pc 命令はプログラム カウンターに対して相対的であり、逆アセンブリは 0x10000 のアドレスをロードしていることを示す場合がありますが、実際には pc に対して相対的であり、逆アセンブラーはリンクされたアドレスが使用されていると想定して pc を使用しました。
.globl _start
_start:
ldr pc,start_vector_add
ldr pc,undef_vector_add
ldr pc,swi_vector_add
start_vector_add: .word start_vector
undef_vector_add: .word undef_vector
swi_vector_add: .word swi_vector
次に、割り込みを発生させる前に、例では swi 命令を使用して swi 割り込みを発生させます。0x10000 から 0x00000 までのコードを十分にコピーして、例外テーブルと PC に読み込まれるアドレスのリストを含めます。プログラムを 0x10000 にリンクすると、これらのアドレスは 0x10000 の範囲になります。割り込みが発生すると、変更した例外ハンドラーが 0x10000 ベースのアドレスを PC にロードし、0x10000 範囲のハンドラーが呼び出されます。
このコマンドラインを使用して、私の例でバイナリを実行します
qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin
次に、ctrl-alt-3 (F3 ではなく 3) を押すとシリアル コンソールに切り替わり、出力が表示されます。そのウィンドウを閉じて qemu を終了し、シミュレーションを停止します。