2009-05-28 1 views
3

В встраиваемых Linux-среде (заказной 2.4.25 на PowerPC) я получаю следующую панику ядра через несколько часов:Oops: доступ к ядру плохой области, сиг: 11 - «Swapper» - убийство обработчика прерывания

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 

символьной -m:

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

Я гугл за помощь, но я не мог найти что-нибудь g полезно. А также хотел «декодировать» обратную линию, но я не понимаю, как ... адреса не соответствуют адресам в System.map. Может ли кто-нибудь объяснить мне, как узнать об ошибке?

Спасибо, Крисом

+0

комментарий @shodanex - отличный первый шаг, но было бы полезно получить результат «cat/proc/modules» в среднем – ctuffli

+0

Я добавил результат, но я не думаю, что это очень поможет ... – Chris

+0

Есть ли в вашей системе версия ksyms, которая поддерживает параметр -m? Если это так, то будет указан начальный адрес каждого загружаемого модуля (такая же информация появляется в/proc/modules под Linux 2.6.x). Идея состоит в том, чтобы увидеть, соответствует ли рассматриваемый адрес одному из загружаемых модулей. – ctuffli

ответ

2

NIP является следующей инструкции Pointer или более обобщенно программный счетчик (a.k.a PC) и указывает, где oops'd ядра. Согласно выводам ksyms, содержимое NIP (0xC9471C7C) выглядит как functionA. Вы должны иметь возможность использовать objdump -S в модуле functionA и выяснить, какая инструкция находится на functionA+0x108.

Реестр ссылок (LR) содержит адрес возврата текущей функции и указывает вызывающего абонента functionA. Вы можете либо посмотреть в файле System.map, чтобы найти функцию, содержащую этот адрес, либо использовать программу addr2line GNU binutils на вашем изображении vmlinux, чтобы получить ту же информацию. Оттуда вы сможете лучше понять, что вызвало упс.

Для получения дополнительной информации о регистрах и сборке PPC см. here и here.

+0

Спасибо вам за этот полезный ответ. На данный момент это то, что я хотел знать, поэтому я буду отмечать этот ответ как принятый. – Chris

1

Является CONFIG_KALLSYMS опции конфигурации, доступные на этом ядре? Если это так, и вы можете перекомпилировать свое ядро, вы должны получить символическую информацию oops.

Как указано в комментарии, linux 2.4 не имеет kallsyms, поэтому вы должны включить frame_pointer и CONFIG_DEBUG. Backtrace и system.map должны быть виртуальным адресом и соответствовать. Они могут не совпадать точно, но вы можете найти, какой символ является ближайшим.

Например, в outtut backtrace: C0018C74 and C0018A1C выглядит как код кода ядра, но диапазон C9xxxxxx не похож на адрес ядра для меня. Могут ли быть связаны модули ядра?

пожалуйста, напишите несколько строк в конце System.map

Edit: Из вашего выхода символьных, кажется, что ошибка происходит в FunctionA настраиваемого модуля, потому что NIP C9471C7C это сразу после c9471b74 и:

  • NIP означает следующей инструкцию Pointer
  • c9471b74 является начальным адресом FunctionA в соответствии с вашим выходом символьных.

LR - это регистр ссылок, то есть обычно регистр, в котором хранится адрес возврата.

+0

Спасибо за ваш ответ ... Я попробую это. Понадобится некоторое время ... – Chris

+0

Думаю, он недоступен. Он не появляется при запуске 'make config'. Я также ввел его вручную в файл конфигурации, но это не изменило поведение, сообщение Oops выглядит все тем же ... – Chris

+0

Вы можете декодировать вручную, если у вас есть System.map. – stsquad