2009-05-28 5 views
3

を殺す:おっと:悪いエリアのカーネルへのアクセス、SIG:11 - - 「スワッパ」私はいくつかの時間後に、次のカーネルパニックを取得(PowerPCで2.4.25をカスタマイズした)組み込みLinux環境での割り込みハンドラ

Oops: kernel access of bad area, sig: 11 
NIP: C9471C7C XER: 20000000 LR: C0018C74 SP: C0198E20 REGS: c0198d70 TRAP: 0800 Not tainted 
MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11 
DEAR: C9876FFF, ESR: 00000000 
TASK = c0197020[0] 'swapper' Last syscall: 120 
last math 00000000 last altivec 00000000 
PLB0: bear= 0x48041040 acr= 0x00000000 besr= 0x00000000 
PLB0 to OPB: bear= 0x00cc1000 besr0= 0x00000000 besr1= 0x00000000 

GPR00: 00000000 C0198E20 C0197020 00000000 C016E494 000000C2 C01D0000 00000000 
GPR08: C98701F0 C9876FFF 00008000 C768AE0F 24004022 1001B120 07FC9500 00000000 
GPR16: 00000001 00000001 FFFFFFFF 007FFE00 00001032 00198EE0 00000000 C0004780 
GPR24: C01D2F68 C01E0000 C0170000 C0170000 C01B0000 C9473870 00000000 C9473864 
Call backtrace: 
00000001 C0018C74 C0018A1C C0005E14 C0004780 C0022724 C0005D4C 
C0005D60 C0002430 C01AE5BC C0002328 
Kernel panic: Aiee, killing interrupt handler! 
In interrupt handler - not syncing 
<0>Rebooting in 1 seconds... 

猫の/ proc /モジュール:

CustomModule1   10556 4 
CustomModule2   5488 0 
CustomModule3   10240 1 
fuse     35576 4 
usb-storage   28468 0 (unused) 
keybdev     3076 0 (unused) 
mousedev    6116 0 (unused) 
hid     17968 0 (unused) 
input     6192 0 [keybdev mouse 

ksymsには-m:

Address Symbol     Defined by 
c9471000 (11k)     [CustomModule1] 
c9471b74 functionA    [CustomModule1] 
c947358c functionB    [CustomModule1] 
c9473580 functionC    [CustomModule1] 
... 

は、私は助けをグーグルが、私はsomethinのを見つけることができませんでした有用である。 Aはバックトレースをデコードしたいと思っていましたが、どういうわけか理解できません。アドレスはSystem.mapのアドレスに対応していません。誰も私のエラーを見つける方法を教えてくれる?

おかげで、 クリス

+0

@shodanexのコメントはすばらしい最初のステップですが、平均時間で 'cat/proc/modules'の出力を得るのも便利です – ctuffli

+0

出力を追加しましたが、これは多くの助けになるとは思わない... – Chris

+0

システムに、-mオプションをサポートするksymsのバージョンがありますか?そうであれば、ロード可能な各モジュールの開始アドレスがリストされます(Linux 2.6.xでは/ proc/modulesに同じ情報が表示されます)。考えられるのは、問題のアドレスがロード可能なモジュールの1つに対応するかどうかを確認することです。 – ctuffli

答えて

2

NIPは(PC a.k.a)プログラムカウンタ一般的に次の命令ポインタ以上で、カーネルがoops'd場所を示します。 ksymsの出力によれば、NIP0xC9471C7C)の内容はfunctionAのように見えます。 functionAモジュールでobjdump -Sを使用して、どの命令がfunctionA+0x108にあるのか理解できます。

リンクレジスタ(LR)は、現在の機能のリターンアドレスを保持し、functionAの呼び出し元を示します。 System.mapファイルを参照してこのアドレスを含む関数を見つけるか、vmlinuxイメージ上でGNU binutilsプログラムaddr2lineを使って同じ情報を取得することができます。そこから、何が原因で起こったのかをよりよく理解できるはずです。

PPCレジスタとアセンブリの詳細については、herehereを参照してください。

+0

この有益な答えをありがとう。当分の間、これは私が知りたいと思ったものなので、私はこの答えを受け入れたものとしてマークします。 – Chris

1

はこのカーネルで利用可能な設定オプションのCONFIG_KALLSYMSですか?もしあなたのカーネルを再コンパイルすることができれば、シンボリック情報を取得する必要があります。

コメントで指摘されているように、linux 2.4にはkallsymsがないので、frame_pointerとCONFIG_DEBUGを有効にする必要があります。 backtraceとsystem.mapは仮想アドレスであり、一致する必要があります。それらは正確には一致しないかもしれませんが、最も近いシンボルを見つけることができます。

たとえば、バックトレースのアウト・アウトでは、 C0018C74 and C0018A1Cはカーネル・コード・アドレスのように見えますが、C9xxxxxxの範囲はカーネル・アドレスのようには見えません。カーネルモジュールをリンクできる場所ですか?

system.map

編集の最後にいくつかの行投稿してください:NIP C9471C7Cは右c9471b74とした後であるので、あなたのksymsの出力から を、障害がカスタムモジュールの関数Aで発生しているようですNIPは、次の命令ポインタを表します

  • c9471b74はあなたksymsの出力に応じて関数Aの先頭アドレスです。

LRはリンクレジスタです(通常はリターンアドレスが格納されるレジスタです)。

+0

あなたの答えをありがとう...私はそれを試みます。しばらく時間がかかります... – Chris

+0

私はそれが利用できないと思います。 'make config'を実行しても表示されません。私もconfigファイルに手動で入力しましたが、これは動作を変更しませんでした.Optメッセージはまだ同じように見えます... – Chris

+0

System.mapがある場合は、手動でデコードできます。 – stsquad

関連する問題