Повідомлення Oops

Повідомлення oops — звичайний для ядра спосіб повідомити користувачеві, що сталося щось недобре Так як ядро ​​керує всією системою, то воно не може саме себе виправити, або завершити, як це можливо для програм простору користувача, коли вони роблять щось не так Замість цього, ядро ​​виводить повідомлення oops Таке повідомлення включає висновок інформації про помилку на консоль, висновок дампа вмісту всіх регістрів і висновок зворотного трасування викликів функцій (back trace) Збої в роботі ядра важко обробити, тому ядро ​​повинно пролізти’ через багато дірок, щоб вивести повідомлення oop s і виконати за собою всі необхідні дії з очищення Часто після видачі повідомлення oop s ядро ​​знаходиться в неузгоджену стані Наприклад, в момент виникнення ситуації, в якій видається повідомлення oops, ядро ​​може знаходиться в процесі обробки важливих даних У цей момент може утримуватися блокування, або виконуватися сеанс взаємодії з обладнанням Ядро має акуратно відійти від поточного стану і спробувати відновити контроль над системою У багатьох випадках це неможливо Якщо ситуація, в якій видається повідомлення oops, виникає в контексті переривання, то ядро ​​не може продовжувати роботу і переходить в стан паніки Стан паніки проявляється в повній зупинці системи Якщо oop s виникає в холостий задачі (idle task, ідентифікатор pi d дорівнює нулю), або при виконанні процесу ini t (ідентифікатор pi d дорівнює одиниці), то ядро ​​також переходить в стан паніки, тому що ядро ​​не може продовжувати виконання

без цих важливих процесів Однак, якщо oop s виникає при виконанні будь-якого іншого процесу, то ядро ​​завершує цей процес і продовжує роботу

Повідомлення oops може видаватися з багатьох причин, включаючи неприпустимий доступ до памяті (memory access violation) і виконання неприпустимою машинної команди Як розробнику ядра, вам доведеться мати справу з повідомленнями oop s і далі, безсумнівно, бути причиною їх появи

Нижче показано повідомлення oops для машини апаратної платформи РРС, яке виникло і обробнику таймера для мережевого интерфейсного адаптера tulip

Oops: Exception in kernel mode, sig: 4

Unable to handle kernel NULL pointer dereference at virtual address 00000001

NIP: C013A7F0 LR: C013A7F0SP:C0685E00 REGS: c0905dl0 TRAP: 0700

Nottainted

MSR: 00089037 ЇЇ: 1 PR: 0 FP: 0 ME: 1 IR / DR: 11

TASK = c0712530[0] swapper Last syscall: 120

GPROO: C013A7C0 C0295E00 C0231530 0000002F 00000001 C0380CB8 C0291B80 C02D0000

GPR08: 000012AO 00000000 00000000 C0292AA0 4020A088 00000000 00000000 00000000

GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

GPR24: 00000000 00000005 00000000 00001032 C3F7C000 00000032 FFFFFFFFC3F7C1C0

Call trace:

[c013ab30] tulip_timer+0xl28/0xlc4 [c0020744] run_timer_softirq+0xl0c/0xl64

[c001b864] do_softirq+0x88/0xl04 [c0007e80] timer_mterrupt+0x284/0x298 [c00033c4] ret_from_except+0x0/0x34 [c0007b84] default_idle+0x20/0x60 [c0007bf8] cpu_idle+0x34/0x38 [c0003ae8] rest_init+0x24/0x34

У користувачів ПК може викликати здивування кількість регістрів процесора (32 величезне число) Повідомлення oop s для апаратної платформи х86, які можливо вам більш знайомі, мають кілька більш простий вигляд Проте, важлива інформація ідентична для всіх апаратних платформ: вміст всіх регістрів і зворотна трасування

Зворотній трасування показує точну послідовність викликів функцій, яка призвела до проблеми У даному випадку можна точно визначити, що трапилося: машина виконувала неодружене завдання холостий цикл: виклик функції cpu_idle (), і з якої циклічно викликається функція default_idle () Поступив про переривання е від сістемног про таймера, в яких м визиваютс я обробник і таймерів ядра Серед них викликається обробник таймера – функція tulip_timer (), в якій виконано розіменування покажчика зі значенням NULL Можна навіть скористатися значенням зміщення (Числа начебто0х128/0х1с4, які вказані праворуч від імені функції) для точного знаходження команди, в якій виникла помилка

Вміст регістрів точно також корисно, хоча і використовується не так часто Разом з дизасемблювати кодом функції вміст регістрів може допомогти відновити точну послідовність подій, яка призвела до проблеми Якщо значення в деякому регістрі не відповідає очікуваному, то це може пролити певне світло на корінь проблеми У даному випадку можна перевірити, які регістри містять значення NULL (всі розряди нульові) і визначити, яка

з змінних функції містить не те значення У ситуаціях, схожих на дану, швидше за все причина – конкуренція за ресурс (race) і швидше за все між таймером і іншою частиною мережевого адаптера Налагодження станів конкуренції за ресурси – завжди серйозне завдання

Утиліта ksymoops

Тільки що розглянуте повідомлення oops має так званийдекодований вид, тому що адреси памяті трансльовані в імена функцій, які їм відповідають Чи не декодований вид попереднього повідомлення виглядає наступним чином

NIP: C013A7F0 LR: C013A7F0 SP: C0685E00 REGS: c0905dl0 TRAP: 0700

Nottainted

MSR: 00089037 ЇЇ: 1 PR: 0 FP: 0 ME 1 IR / DR: 11

TASK = c0712530[0] swapper Last syscall: 120

GPROO: C013A7CO C0295E00 C0231530 0000002F 00000001 C0380CB8 C0291B80 C02D0000

GPR08: 000012AO 00000000 00000000 C0292AA0 4020A088 00000000 00000000 00000000

GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

GPR24: 00000000 00000005 00000000 00001032C3F7C00000000032 FFFFFFFF C3F7C1C0

Call trace: [c013ab30] [c0020744] [c001b864] [c0007e80] [c00061c4] [c0007b84][c0007bf8][c0003ae8]

Адреси зворотного трасування повинні бути переведені в символічні імена функцій Це можна зробити за допомогою команди ksymoops при наявності файлу Systemmap, який згенерований під час компіляції даного ядра Якщо використовуються завантажувані модулі ядра, то необхідна також інформація про модулях Утиліта ksymoops намагається самостійно визначити всю необхідну інформацію, тому зазвичай її можна просто викликати такий спосіб

ksymoops saved_oopstxt

Програма виводить декодовану інформацію повідомлення oops Якщо інформація, яка використовується за замовчуванням, недоступна, або є необхідність вказати альтернативне положення відповідних інформаційних файлів, то на такий випадок програма приймає різні параметри Сторінки керівництва за даною програмою, які необхідно прочитати перед використанням, містять всю необхідну інформацію

Програма ksymoops включена в більшість поставок операційної системи

Linux

Функція kallsym s

На щастя, більше немає необхідності використовувати програму ksymoops Це дуже корисно, тому що, хоча, у розробників зазвичай немає проблем з її використанням, користувачі часто вказують неправильний файл Systemmap, або неправильно декодують повідомлення oops

У розробляється серії ядра 25 була введено нова можливість kallsyms, яка включається за допомогою конфігураційного параметра CONFIG_KALLSYMS Ця функція включає в виконуваний образ ядра інформацію для відображення адрес памяті у відповідні імена функцій ядра, що дає можливість ядру

самостійно декодувати інформацію зворотного трасування Отже, декодування повідомлень oops більше не вимагає файлу Systemmap, або утиліти kallsyms Як недолік такого підходу слід відзначити деяке збільшення обсягу памяті, використовуваної ядром, так як таблиця перекладу адрес памяті в імена функцій завантажується в постійно отображаемую память ядра На таке збільшення обсягів використовуваної памяті варто піти, принаймні, на етапі розробки ядра

Джерело: Лав, Роберт Розробка ядра Linux, 2-е видання : Пер з англ – М: ТОВ «ІД Вільямс »2006 – 448 с : Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*