Что означают эти поля Linux Kernel Oops?

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

Ниже вы найдете пример Oops, и я опишу, что я могу сделать из него. Затем я спрошу, что оставшаяся информация может рассказать мне о проблеме.

[  716.485951] BUG: unable to handle kernel paging request at fc132158
[  716.485973] IP: [<fc1936e7>] ubi_change_vtbl_record+0x87/0x1c0 [ubi]
[  716.485986] *pdpt = 00000000019e6001 *pde = 000000002c558067 *pte = 0000000000000000 
[  716.485997] Oops: 0002 [#1] SMP 
[  716.486004] Modules linked in: ubi(O) mtdchar nandsim nand mtd nand_ids nand_bch bch nand_ecc bnep rfcomm bluetooth parport_pc ppdev lp parport nfsd nfs_acl auth_rpcgss nfs fscache lockd sunrpc binfmt_misc dm_crypt snd_hda_codec_hdmi snd_hda_codec_analog kvm_intel snd_hda_intel snd_hda_codec snd_hwdep kvm snd_pcm snd_seq_midi snd_rawmidi snd_seq_midi_event hid_generic snd_seq cdc_acm snd_timer snd_seq_device mei tpm_tis snd mac_hid serio_raw soundcore lpc_ich snd_page_alloc microcode coretemp usbhid hid nouveau usb_storage ttm drm_kms_helper drm floppy e1000e i2c_algo_bit mxm_wmi video wmi
[  716.486128] Pid: 3994, comm: ubimkvol Tainted: G           O 3.8.0-rc3+ #3 LENOVO 6239AS8/LENOVO
[  716.486136] EIP: 0060:[<fc1936e7>] EFLAGS: 00010246 CPU: 0
[  716.486144] EIP is at ubi_change_vtbl_record+0x87/0x1c0 [ubi]
[  716.486151] EAX: 000000ac EBX: eb5ea000 ECX: 0000002b EDX: 00000000
[  716.486157] ESI: eb4d1d74 EDI: fc132158 EBP: eb4d1d40 ESP: eb4d1d20
[  716.486164]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[  716.486170] CR0: 8005003b CR2: fc132158 CR3: 27542000 CR4: 000407f0
[  716.486176] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
[  716.486183] DR6: ffff0ff0 DR7: 00000400
[  716.486188] Process ubimkvol (pid: 3994, ti=eb4d0000 task=ec01d9b0 task.ti=eb4d0000)
[  716.486195] Stack:
[  716.486199]  e755f000 eb4d1d2c c11cad11 eb4d1d34 eb543c00 eb5ea000 00000000 eb4d1e20
[  716.486215]  eb4d1e30 fc195412 e755f000 fc1adf01 eb5ea26c 00000002 0000009e eb5ea480
[  716.486232]  00000002 e755f22c e755f2ac e755f000 eb4d1d74 2a000000 01000000 00000000
[  716.486248] Call Trace:
[  716.486257]  [<c11cad11>] ? sysfs_create_file+0x21/0x30
[  716.486266]  [<fc195412>] ubi_create_volume+0x4b2/0x790 [ubi]
[  716.486277]  [<fc19967a>] ubi_cdev_ioctl+0x5da/0xac0 [ubi]
[  716.486285]  [<c117202a>] ? link_path_walk+0x5a/0x7d0
[  716.486294]  [<fc1990a0>] ? vol_cdev_ioctl+0x440/0x440 [ubi]
[  716.486842]  [<c1177e12>] do_vfs_ioctl+0x82/0x5b0
[  716.487703]  [<c1171ced>] ? final_putname+0x1d/0x40
[  716.488564]  [<c1171ced>] ? final_putname+0x1d/0x40
[  716.489422]  [<c1171ced>] ? final_putname+0x1d/0x40
[  716.489891]  [<c1171eb4>] ? putname+0x24/0x40
[  716.489891]  [<c1167239>] ? do_sys_open+0x169/0x1d0
[  716.489891]  [<c11783b0>] sys_ioctl+0x70/0x80
[  716.489891]  [<c16205cd>] sysenter_do_call+0x12/0x38
[  716.489891] Code: ac 00 00 00 03 bb c8 04 00 00 f7 c7 01 00 00 00 0f 85 ee 00 00 00 f7 c7 02 00 00 00 0f 85 ca 00 00 00 89 c1 31 d2 c1 e9 02 a8 02 <f3> a5 74 0b 0f b7 16 66 89 17 ba 02 00 00 00 a8 01 74 07 0f b6
[  716.489891] EIP: [<fc1936e7>] ubi_change_vtbl_record+0x87/0x1c0 [ubi] SS:ESP 0068:eb4d1d20
[  716.489891] CR2: 00000000fc132158
[  716.516453] ---[ end trace 473b15a7780e19ea ]---

Похоже, что ядро ​​хотело получить доступ не к той странице. Сейчас,

  • Код Oops 0002 говорит мне, что это произошло при попытке прочитать что-то в пользовательском режиме.
  • Указатель инструкции находится в позиции ubi_change_vtbl_record, что означает, что неисправная инструкция находится в этой функции.
  • Я могу вывести путь, ведущий к неисправной функции, из трассировки вызова (ioctl, запущенный из процесса ubimkvol)

Отсюда: является ли «стек» дампом необработанного стека задачи? Я вижу, что некоторые упомянутые значения также являются адресами функций, обнаруженными в трассировке вызовов. Затем я получил причудливые значения, такие как EAX, EBX ... DR7. Я думаю, что это регистры ЦП, но все же я не знаю, что это такое на самом деле.

Наконец, следующая строка сбивает меня с толку:

[  716.485986] *pdpt = 00000000019e6001 *pde = 000000002c558067 *pte = 0000000000000000

Что такое pdpt, pde и pte? Я чувствую, что это информация об ошибке страницы, но я не смог получить дополнительную информацию после некоторого поиска в Google.


person Rerito    schedule 24.04.2013    source источник


Ответы (2)


Да, EAX и т. д. — это 32-битные регистры процессора x86. pdpt (таблица указателей каталога страниц), pde (запись каталога страниц) и pte (запись таблицы страниц) — все это структуры подкачки.

IP (также EIP для 32-разрядных или RIP для 64-разрядных процессоров) — это указатель инструкций во время Oops.

Стек — это необработанный стек для этого процессора. У каждого процессора будет свой стек. Обратите внимание, что в этой архитектуре стек растет вниз (адреса начинаются с 0xfxxxxxx).

person Peter L.    schedule 24.04.2013
comment
Было бы любезно с вашей стороны, если бы вы могли дать немного больше подробностей о регистрах и пейджинговой информации. Мне удалось получить некоторую информацию, но если бы эти знания были непосредственно доступны здесь, это помогло бы и другим людям :) - person Rerito; 25.04.2013
comment
В этом случае PDPT — это значение PGD, а PDE — PMD в терминологии Linux. - person Rerito; 25.04.2013
comment
@Rerito PDPT - это скорее терминология x86. Другие операционные системы также используют их. Другие ОС имеют свой собственный способ сообщения данных о сбоях (например, «синий экран смерти»). Что касается пейджинговой информации, у меня нет лучшего объяснения, чем то, что есть в сети. Я нахожу подкачку и управление памятью Intel запутанными :-/. В регистрах x86 у каждого свое предназначение. Одни используются для накопления, другие — для указания на стек, третьи — для возвращаемых функцией значений, а некоторые могут использоваться взаимозаменяемо. Другие архитектуры будут иметь больше регистров и меньше инструкций. - person Peter L.; 26.04.2013

Поправьте меня, если я ошибаюсь, но OOPS 0002 означает, что страница не найдена при записи в режиме ядра:

bit 0 == 0 means no page found, 1 means a protection fault
bit 1 == 0 means read, 1 means write
bit 2 == 0 means kernel, 1 means user-mode
person butsec    schedule 16.09.2016