Упс: доступ ядра к плохой области, sig: 11 - 'swapper' - уничтожение обработчика прерываний

Во встроенной среде 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...

кот /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

ксимс -м:

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

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

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


person Chris    schedule 28.05.2009    source источник
comment
Комментарий @shodanex — отличный первый шаг, но также было бы полезно получить вывод «cat /proc/modules» в то же время   -  person ctuffli    schedule 28.05.2009
comment
Я добавил вывод, но не думаю, что это сильно поможет...   -  person Chris    schedule 29.05.2009
comment
Есть ли в вашей системе версия ksyms, поддерживающая параметр -m? Если да, то будет указан начальный адрес каждого из загружаемых модулей (та же информация отображается в /proc/modules в Linux 2.6.x). Идея состоит в том, чтобы увидеть, может ли рассматриваемый адрес соответствовать одному из загружаемых модулей.   -  person ctuffli    schedule 01.06.2009
comment
@ctuffli: я опубликовал начало вывода ksyms -m. Значение в NIP кажется промежуточным между функцией A и функцией B. Означает ли это, что функция A неисправна? Что вообще означают NIP, LR, CP и так далее? Когда я гуглила oops nip, я только что нашла результаты знаменитостей niplips :-D   -  person Chris    schedule 02.06.2009


Ответы (2)


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

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

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

person ctuffli    schedule 02.06.2009
comment
Спасибо за этот полезный ответ. На данный момент это то, что я хотел знать, поэтому я отмечу этот ответ как принятый. - person Chris; 03.06.2009

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

Как указано в комментарии, в 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 — это регистр связи, т.е. обычно регистр, в котором хранится адрес возврата.

person shodanex    schedule 28.05.2009
comment
Я думаю, что это недоступно. Он не появляется при запуске make config. Я также ввел его вручную в файл конфигурации, но это не изменило поведение, сообщение Oops выглядит все так же... - person Chris; 29.05.2009
comment
В Linux 2.4.x нет KALLSYMS. Убедитесь, что ваш файл .config содержит CONFIG_DEBUG_KERNEL=y и CONFIG_FRAME_POINTER=y. Если нет, включите их в разделе «Взлом ядра» меню конфигурации. - person ctuffli; 01.06.2009
comment
@stsquad: Как? Адреса не соответствуют... как узнать смещение? - person Chris; 02.06.2009
comment
@ctuffli: CONFIG_DEBUG_KERNEL доступен и не был включен, другого нет. Что изменится, когда я включу это? - person Chris; 02.06.2009
comment
CONFIG_FRAME_POINTER бесполезен на powerp pc, я думаю - person shodanex; 02.06.2009
comment
CONFIG_DEBUG_KERNEL должен добавлять символы отладки в ядро, позволяя oops выводить более удобную для человека информацию. Это также позволит использовать инструменты отладки, такие как gdb. - person ctuffli; 02.06.2009