2013-04-24 27 views
2

我在開發人員的生活中已經遇到過一些糟糕的情況,而我熟悉一些可以從這些糟糕的Oops中獲取的信息,但仍然有些信息我無法理解,因此無法用於解決問題。這些Linux Kernel 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,這意味着有問題的指令位於此函數中。
  • 我可以推斷導致從 呼叫跟蹤的斷層功能(從過程ubimkvol推出一個ioctl)

從那裏的路徑,是「堆棧」任務的原始堆轉儲?我可以看到提到的一些值也是呼叫跟蹤中的函數地址。然後,我得到了像EAXEBX ... DR7的看上去很值的值。我認爲它們是CPU寄存器,但仍然不知道它們是什麼。

最後,以下行讓我失去了:

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

什麼是PDPT,PDE和PTE?我覺得他們是關於頁面錯誤的信息,但是我搜索了一些Google搜索後無法獲取更多信息。

回答

1

是的,EAX等是32位x86處理器寄存器。 pdpt(頁目錄指針表),pde(頁目錄條目)和pte(頁表條目)都是分頁結構。

IP(也用於32位的EIP或用於64位處理器的RIP)是Oops時的指令指針。

堆棧是此處理器的原始堆棧。每個處理器都有自己的堆棧。請注意,在此體系結構中堆棧增長減少(地址以0xfxxxxxx開頭)。

+0

這將是那種你,如果你能在寄存器和給多一點細節尋呼信息。我能夠檢索到一些信息,但如果這些知識直接可用,它也會幫助其他人:) – Rerito 2013-04-25 07:16:59

+0

在這種情況下,PDPT是PGD值,PDE是Linux術語中的PMD? – Rerito 2013-04-25 08:13:47

+1

@Rerito PDPT更多的是x86術語。其他操作系統也使用這些。其他操作系統有自己的報告崩潰數據的方式(例如,「藍屏死機」)。關於尋呼信息,我沒有比網上更好的解釋。我發現英特爾的分頁和內存管理令人困惑: - /。在x86寄存器上,每個都有其自己的目的。有些用於累加,其他用於指向堆棧,其他用於函數返回值,有些可以互換使用。其他架構將擁有更多的寄存器和更少的指令。 – 2013-04-25 21:04:51

0

糾正我,如果我錯了,但 OOPS技術意味着沒有在內核模式下書寫時發現頁面:

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