Упс: доступ к ядру из плохой области, sig: 11 - 'swapper' - обработчик прерываний уничтожения - PullRequest
4 голосов
/ 28 мая 2009

Во встроенной среде Linux (настроено 2.4.25 для PowerPC), через несколько часов я получаю следующую панику ядра:

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...

cat / proc / modules:

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]
...

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

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

Ответы [ 2 ]

3 голосов
/ 02 июня 2009

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

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

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

1 голос
/ 28 мая 2009

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

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

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

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

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

  • NIP обозначает Указатель Следующей Инструкции
  • c9471b74 - это начальный адрес FunctionA в соответствии с вашим выводом в ksyms.

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

...