あなたはSWI割り込みについて話していますか?または他の1つ(FIQ、IRQ)。どちらの場合でも、問題の内容を知っていると思います。 Qemuはlinuxを実行するためのもので、バイナリはアドレス0x00000にロードされないので、エントリポイントはqemuによって例外を処理するために使用されません。
私はqemuを使用してソリューションを実装する例があります。 http://github.com/dwelch67/yagbatのqemuディレクトリに移動します。 qemuの例は実際にyagbatリポジトリのgbaに関係していないので、gbaは32ビットARMのものなので、コードを借りるのは簡単でした。
この例では、この方法でqemuを使用する方法を理解しようとしたので、具体的にあなたの質問のために書かれました。アドレス0x00000000はRAMとしてシミュレートされているように見えるので、qemu例外テーブルを書き直し、バイナリがロードされる0x10000アドレス空間に例外コール・コードを持たせることができます。
クイックで汚れた解決策は、バイナリのエントリポイント(0x10000にロードするqemu)をアドレス0x00000のベクタテーブルに似せることです。 ldr pc命令はプログラムカウンタを基準にしているため、0x10000にアドレスがロードされていることを示すかもしれませんが、実際には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を閉じてシミュレーションを停止します。
私は関連する問題に遭遇したので、まだ私のアプリケーションでこれをすべて動作させることはできませんでした: - 一度解決したら(うまくいけば)私はこの仕事をすることができますし、私はあなたの答えを受け入れるでしょう:) –
singpolyma
あなたは私の例を見ましたか?それはあなたが他のバグ、ブートアーム、Cから腕などを呼び出すことを試みています。私のコードはライブラリを使用していないので、gccコンパイラを私のものとは別のビルドで使うことができるはずです。 –
この行をCROSS_COMPILE = arm-none-eabiに変更します。使用しているコンパイラ(gcc)には、arm-linux-gnueabi –