2012-03-05 9 views
5

LinuxカーネルのzImageを解凍する前にGDBを使ってデバッグしようとしています。カーネルはARMターゲットで実行されており、GDBサーバースタブでJTAGデバッガを接続しています。ターゲットはブートローダをロードする必要があります。ブートローダは、フラッシュからカーネルイメージを読み込み、RAMに0x20008000とし、その場所に分岐します。Linuxカーネルのプリ解凍ステージをデバッグ

私は、私はそうのようなGDBのadd-symbol-fileコマンドを使用して、GDBを開始し、リモートターゲットに接続されています:私はそのアドレスにブレークポイントを設定すると

add-symbol-file arch/arm/boot/compressed/vmlinux 0x20008000 -readnow 

、それが正しい場所でトラップを行います - 右ときカーネルに分岐します。しかし、GDBは、arch/arm/boot/compressed/head.Sのソースから間違った行を表示します。それは4行遅れです。これをどうすれば解決できますか?

add-symbol-file-s section addrオプションを追加してみました。これは-s .start 0x20008000です。この結果、まったく同じ問題が発生します。

+0

まず、gccとgdbの互換性があることを確認してください。互換性があることを確認してください(同じツールチェーンバージョンのものが望ましい)。また、Linuxカーネルが-O2でコンパイルされているため、いくつかの行が最適化されることに注意してください。どこかの.alignキーワードがないと確信していますか? –

+0

デコンプレッサーコードはすべてPC相対です。ある地域から別の地域に自分自身をコピーすることもできます。ブートローダーは、解凍されたターゲットがどこにあるかを入れます。それはそれ自身を動かさなければなりません。固定記号でJTAGを使って楽しい時間を過ごすつもりはないと思う。何とかGDBに*移転できるかどうかわかりません。 –

答えて

2

低レベルデバッグでコンパイルするときに何かを印刷するアセンブラマクロがあります。マクロがあなたのボードに適していることを確認する必要があります。

linux-latest/arch/arm$ find . -name debug-macro.S | wc 
56  56 2306 

ボード用のファイルを探し、正しいシリアルポートレジスタがヒットしていることを確認します。 JTAGを使用してコードを計測することができます。これらのマクロは、解凍コードで使用されます。もちろん* CONFIG_DEBUG_LL *で設定してください。

おそらくATAGが正しくないか、または他の要件の1つです。チェックアウトマニュアル/ arm/Bootingレジスタが正しく設定されていることを確認してください。最近のカーネルではdtリストを送るための新しい要件があることに注意してください。

+0

現在のマクロは[arm include debug](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/include/debug)にあります(Jan2015 v3以降19)。参照:[compressed debug.S](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/arch/arm/boot/compressed/debug.S) –

関連する問題