是什么导致"没有找到页面"哎呀

时间:2018-06-14 14:04:43

标签: linux-kernel segmentation-fault

我在kfifo_unused()代码中点击了oops。此问题与时间有关,因为它不会发生内核调试消息被禁用。

糟糕标记[ 82.848904] Oops: 0000 [#1] PREEMPT SMP表示由"未找到页面"引起的。什么可能导致这类错误?

编辑:我刚注意到这一行PGD 0。页面全局目录似乎为空。是什么给了什么?

[   82.827981] BUG: unable to handle kernel 
[   82.832507] NULL pointer dereference at 000000000000001c
[   82.838470] IP:
[   82.840537]  [<ffffffff8126b126>] kfifo_unused+0x0/0x10
PGD 0 
[   82.847245] 
[   82.848904] Oops: 0000 [#1] PREEMPT SMP
[   82.853244] Modules linked in:
[   82.856703]  dal_gate portmux_intel_drcfg mwifiex_pcie mwifiex xhci_pci xhci_hcd cfg80211 ahci spidev usbcore x86_pkg_temp_thermal libahci libata sbi_apl usb_common pwm_lpss_pci tpm_crb spi_pxa2xx_platform pwm_lpss scsi_mod dwc3_pci tpm_tis tpm_tis_core evdev tpm aesni_intel ablk_helper lrw cryptd gf128mul aes_x86_64 glue_helper mei_dal ccm gcm crc32c_intel mei_me ctr ecb cbc mei snd_soc_skl snd_soc_tdf8532 snd_soc_bxt_gpmrb snd_hda_ext_core snd_soc_core snd_hda_core snd_soc_skl_ipc snd_soc_sst_dsp snd_soc_sst_ipc snd_aloop snd_pcm snd_compress snd_timer i915 rtc_cmos drm_kms_helper intel_gtt i2c_dev ipv6 crc_ccitt autofs4
[   82.919279] CPU: 1 PID: 18 Comm: kworker/1:0 Not tainted 4.9.78-abl-11621-g109ff90 #4
[   82.928085] Workqueue: events mei_cl_bus_rx_work [mei]
[   82.933881] task: ffff88027eb80fc0 task.stack: ffffc900000b0000
[   82.940551] RIP: 0010:[<ffffffff8126b126>] 
[   82.945273]  [<ffffffff8126b126>] kfifo_unused+0x0/0x10
[   82.951123] RSP: 0018:ffffc900000b3dc0  EFLAGS: 00010246
[   82.957111] RAX: 0000000000000001 RBX: ffff880274c6cc00 RCX: 0000000000000018
[   82.965147] RDX: 0000000000000008 RSI: ffff880274c6cfb0 RDI: 0000000000000018
[   82.973180] RBP: ffffc900000b3dc8 R08: 0000000000000009 R09: 0000000000000002
[   82.981209] R10: ffffc90000213d28 R11: 0000000000000018 R12: 0000000000000000
[   82.989241] R13: 0000000000000020 R14: ffff880274c6cf28 R15: 0000000000000000
[   82.997276] FS:  0000000000000000(0000) GS:ffff88027fa80000(0000) knlGS:0000000000000000
[   83.006431] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[   83.012903] CR2: 000000000000001c CR3: 0000000001a08000 CR4: 0000000000340670
[   83.020932] Stack:
[   83.023228]  ffffffff8126b315
[   83.026652]  ffffc900000b3e08 ffffffffa021d1f5 0000000000000018
[   83.033116]  ffff8802762a8018
[   83.036481]  ffff880274027f00 ffff880274027f00 0000000000000000
[   83.042946]  ffffe8ffffc81c00
[   83.046308]  ffffc900000b3e28 ffffffffa0063ed6 ffff88027eaecf00
[   83.052765] Call Trace:
[   83.055548]  [<ffffffff8126b315>] ? __kfifo_in+0xc/0x23
[   83.061445]  [<ffffffffa021d1f5>] dal_recv_cb+0xe5/0x18a [mei_dal]

1 个答案:

答案 0 :(得分:0)

因此,仔细查看dal_recv_cb()结果发现if-else {}设置指向非现有用户空间客户端的dal客户端结构的指针。如果错误响应(无法与当前dal客户端匹配),则默认选择用户空间客户端来处理该消息。由于它没有设置,它的指针为null,在调用__kfifo_in()之前没有检查过。