2

ARMv6 ベア メタル アプリケーションでユーザー モードと SVC を使用しようとしていますが、そのためには、ARMv6 割り込みベクトル テーブルの SVC エントリを設定して、割り込みハンドラに分岐する必要があります。しかし、これを行う方法の良い例を見つけることができません (つまり、どのメモリアドレスを正確に設定する必要があるのか​​、何に設定する必要があるのか​​)。私は過去に同様のことをしましたが、常により包括的なブートローダー (RedBoot) を使用して、これらの一部をセットアップしました。どんな助けでも大歓迎です。

以下を使用してアプリケーションをテストしています。

 qemu-system-arm -M versatilepb -cpu arm1176
4

1 に答える 1

3

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 を終了し、シミュレーションを停止します。

于 2012-01-20T03:00:19.343 に答える