2

私は開発者としての人生ですでにいくつかの Oops に遭遇しており、これらの 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)から、障害のある関数につながるパスを推測できます。

そこから、「スタック」はタスクの生スタックのダンプですか?言及されている値の一部は、呼び出しトレースで見つかった関数アドレスでもあることがわかります。次に、EAXEBX...のような見栄えの良い値を取得しDR7ました。それらはCPUレジスターだと思いますが、それでも、それらが実際に何であるかはわかりません。

最後に、次の行で迷子になります。

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

pdpt、pde、pte とは何ですか? ページフォルトに関する情報だと思いますが、グーグルで調べた後、それ以上の情報を取得できませんでした。

4

2 に答える 2

1

間違っている場合は訂正してください。ただし、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
于 2016-09-16T20:41:24.523 に答える
1

はい、EAX などは 32 ビット x86 プロセッサ レジスタです。pdpt (ページ ディレクトリ ポインター テーブル)、pde (ページ ディレクトリ エントリ)、および pte (ページ テーブル エントリ) はすべてページング構造です。

IP (32 ビット プロセッサの場合は EIP、64 ビット プロセッサの場合は RIP) は、Oops 時の命令ポインタです。

スタックは、このプロセッサの raw スタックです。各プロセッサには独自のスタックがあります。このアーキテクチャでは、スタックが成長することに注意してください (アドレスは 0xfxxxxxx で始まります)。

于 2013-04-24T17:13:21.517 に答える