Kernel Panic: oops & debug information

Порой бывает не просто разобраться в неполадках работы ядра Linux. Поиск причины, приводящей к kernel panic, требует воспроизведения ситуации, вызывающей некорректное поведение ядра, а также сбора информации, на основании которой можно сделать какие-то выводы. Проблема в том, что kernel panic иногда вешает систему полностью, и в этом случае даже не знаешь с какой стороны подступиться и что вообще делать с "заблокированной" машиной.

В этом посте я описал в общих чертах некоторые методы, которые помогут разобраться с причиной возникновения kernel panic.

Netconf 2011 conference slides

Работа с SPI

Суть проблемы - необходимо управлять матрицей VITA1300 через процессор TexasInstruments TMS320DM365ZCE30 по SPI протоколу.
Особенности VITA1300 - 9 бит на адрес и 16 бит на данные, вся посылка занимает 26 бит.
Особенности TMS320DM365ZCE30 - сдвиговый регистр 16 битный.

Атомарные операции на PowerPC

PowerPC является RISC процессором, поэтому он не можем напрямую модифицировать переменные в памяти. Хотя CISC процессоры и предоставляют такие инструкции (например incl some_variable), не факт что они являются атомарными.

Типичный цикл изменения переменной для RISC процессоров выглядит примерно так (опустим кэши CPU):
load general_register, variable

Trace and profile function calls

Использование клевых штук для трассировки вашего кода.
На самом деле функции
__cyg_profile_func_{enter|exit} должны быть объявлены с аттрибутом __attribute__ ((no_instrument_function)) чтобы не трассировать их самих, иначе у нас получиться рекурсия которая грохнет стек. Но видимо gcc как-то учитывает уже этот факт.

Early debugging

Собственно на моей машине в меню kernel hacking (мы все его любим ;) ) можно выбрать пункт меню "Early debugging (dangerous)" - что для моей машины (powerbook g4) раскрывается в символ CONFIG_PPC_EARLY_DEBUG.
Как оказалось это означает вот что:
+machine_init()
+->udbg_early_init()

Наконец то работает perftools на 2.6.38-rc2 (ppc32)

Не помню какой HEAD у Линуса в ветке, но с него у меня начали работать perftools на ppc32. Имеетсся в виду 'нормально работать', а не просто собираться и крашиться или выдавать ворнинги на экран и счетчики со значением NaN.
Проверю эту вешь на ppc64 и sparc64.
http://acmel.wordpress.com/ - рекомендую почитать блог Arnaldo Carvalho de Melo, интересные посты.

Связанные списки

Связанные списки в ядре Linux.

Связанные списки используется в очень многих местах в коде ядра. Действительно, если взять какую-нибудь из подсистем, то обязательно увидим обьявление struct list_head в одной из структур. list_head и есть реализацией двухсвязных списков в Linux.

Linux network stack docs

Если у вас page allocation failure

Бывает что память в обработчике прерывания (т.е. GFP_ATOMIC) выделить не удается.
[15875.502554] SLUB: Unable to allocate memory on node -1 (gfp=0x20)
[15875.502554] cache: kmalloc-8192, object size: 8192, buffer size: 8192, default order: 3, min order: 1
[15875.502554] node 0: slabs: 173, objs: 683, free: 91
[15875.504984] skbuff alloc of size 3904 failed
[15875.953258] swapper: page allocation failure. order:1, mode:0x4020
Вам может помочь параметр /proc/sys/vm/min_free_kbytes.

RSS-материал