2009-05-28 1 views
3

을 죽이는 :아차 : 나쁜 지역의 커널 액세스, SIG : 11 - - '스와 퍼'나는 몇 시간 후에 다음과 같은 커널 패닉을 얻을 (파워에 2.4.25 사용자 정의) 임베디드 리눅스 환경에서 인터럽트 핸들러

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 디렉토리/모듈 :

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

내가 도움을 봤하지만 난 뭔가를 찾을 수 없습니다 :

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 g 유용합니다. A는 백 트레이스를 '디코드'하고 싶었지만 주소가 System.map의 주소와 일치하지 않는 이유를 이해하지 못합니다. 누구든지 오류를 찾는 방법을 설명 할 수 있습니까?

감사합니다, 크리스

+0

@shodanex 의견은 훌륭한 첫 걸음이지만 평균 시간에 'cat/proc/modules'의 출력을 얻는 것이 유용 할 것입니다. – ctuffli

+0

출력을 추가했지만 이것이 많이 도움이 될 것이라고 생각하지 않습니다 ... – Chris

+0

시스템에 -m 옵션을 지원하는 ksyms 버전이 있습니까? 그렇다면, 각로드 가능한 모듈의 시작 주소가 나열됩니다 (동일한 정보는 Linux 2.6.x에서/proc/modules에 나타납니다). 아이디어는 문제의 주소가로드 가능한 모듈 중 하나와 일치하는지 확인하는 것입니다. – ctuffli

답변

2

NIP은 (PC a.k.a) 프로그램 카운터 일반적으로 다음 명령 포인터 이상 어디 커널 oops'd을 나타냅니다. ksyms의 출력에 따르면 NIP (0xC9471C7C)의 내용은 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의 끝 부분에 몇 줄을 게시하시기 바랍니다

편집 : 당신의 ksyms 파일 출력에서 ​​ , 그것은 NIP C9471C7C를 잘 작성 후 c9471b74하고 있기 때문에 고장, 사용자 정의 모듈의 FunctionA에서 발생하는 것 같다

  • NIP는
  • c9471b74이 ksyms 파일 출력에 따라 FunctionA의 시작 주소입니다 다음 명령 포인터를 의미합니다.

LR은 링크 레지스터, 즉 일반적으로 반송 주소가 저장되는 레지스터입니다.

+0

답변 해 주셔서 감사합니다. 약간의 시간이 걸릴 것입니다 ... – Chris

+0

그것은 사용할 수없는 것 같아요. 'make config'를 실행할 때 나타나지 않습니다. 또한 config 파일에 수동으로 입력했는데 동작이 변경되지 않았으므로 Oops 메시지는 여전히 동일하게 보입니다 ... – Chris

+0

System.map을 사용할 수 있으면 직접 디코딩 할 수 있습니다. – stsquad