为什么 linux 内核不能在我的新 Intel i7-6500U CPU 上启动?

tms*_*ont 8 boot kernel-panic linux-kernel

我知道很难隔离 CPU,但我看到的错误表明这就是问题所在。

这绝对不是故障/损坏的硬件问题。在过去的几天里,我一整天都在运行 Windows 10,这东西很快!没有崩溃。更重要的是,我运行了 Windows 内存检查器。记忆力都很好。

机器规格

该机为全新联想Yoga 710 15"

x64
Intel i7-6500 CPU @ 2.50 GHz, 2601 Mhz, 2 Cores, 4 Logical Processors
SMBIOS Version 2.8
BIOS Mode UEFI
16.0 GB DDR4 Ram
256 MB SSD
Run Code Online (Sandbox Code Playgroud)

隔离到 linux 内核 (?)

我在两者上都看到了同样的问题

  • archlinux-2016.08.01-dual.iso
  • ubuntu-gnome-16.04.1-desktop-amd64.iso

对于 Arch——问题只是在从 U 盘启动时间歇性地出现。我设法在驱动器上的 100GB ext4 分区上安装了 Arch。该安装在启动期间间歇性地(例如 90% 的时间)具有相同的问题。如果我通过了启动,那么问题会在我执行的前几个终端命令之后随机出现,最终导致完全死锁。

对于 Ubuntu——USB 记忆棒甚至无法启动。我立即被这些相同的错误阻止。僵局...

这么多错误...

每当发生这种情况时,日志中都会出现与内存相关的错误,但我看到的关键错误是:

  • General protection fault 0000[#1] PREEMPT SMP
  • RIP kmem_cache_alloc
  • RIP kmem_cache_alloc_trace

对于这些错误,我已经多次看到一些相同的堆栈跟踪:

rbt_memtype_copy_nth_element
on_each_cpu
flusH_tbl_kernel_range
__purge_umap_area_lazy
um_unmam_aliases
change_page_attr_set_clr
set_memory_ro
frob_text.isra
module_enable_ro
Run Code Online (Sandbox Code Playgroud)
kobject_create
kobject_create_and_add
load_module
__symbol_put
kernel_read
sys_finit_module
entry_SYSCALL_64_fastpath
Run Code Online (Sandbox Code Playgroud)
kmem_cache_alloc_trace
allocate_cgrp_cset_links
...
sys_write
entry_SYSCALL-64_fastpath
Run Code Online (Sandbox Code Playgroud)

Linux 也一直承诺它正在解决这个问题

修复递归错误,但需要重新启动!

我希望..

英特尔 ucode

我还尝试intel-ucode在 Arch 安装中安装该软件包。我在dmesg日志中看到微码已更新,但不幸的是并没有解决我的问题。

可能是什么问题?如何解决?


编辑

补充说明。

一般保护故障消​​息和“检测到锁定”类型的消息通常引用 CPU。我已经看到了CPU0CPU1CPU2CPU3在这些消息。似乎有什么事情导致 CPU 无法相处,就像他们都在试图清除缓存内存或其他东西的死锁中一样。


编辑2

错误提到的BIOS

我在一些错误中看到了这一点信息:

LENOVO 80U01LENOVO YOGA710-1 BIOS OGCN20WW(v1.04) 6/30/2016
Run Code Online (Sandbox Code Playgroud)

不确定这是否有助于专业人士理解问题...


编辑3

最大CPU=1

我在内核参数文档中寻找调试选项,发现maxcpus

如果我将最大 CPU 设置为 1,那么问题就会消失。因此,问题似乎是某种共享缓存内存冲突。


编辑3

maxcpus=1 + Gnome = 又坏了

虽然maxcpus=1似乎只用 1 个 CPU 就可以使系统工作,但我安装了 gnome 然后运行systemctl enable gdm.service

现在,当我重新启动时,我又恢复了所有错误,但这一次它们都发生在 CPU0 上

因此,即使使用 1 个 CPU,似乎仍有某些事情导致内存冲突。


编辑4

诺拉皮克

所以使用nolapic似乎让一切“工作”

但是通过使用nolapic,我有效地禁用了我的其他 CPU 和 1 个工作 CPU 中的所有多线程。

我正在尝试将其用于 OpenMP,在使用 启动后nolapic,OpenMP 和 linux 内核只能找到 1 个线程、1 个 CPU。真糟糕!

我也试过intel_idle.max_cstate=012等等。但这并不能解决启动问题。

还有什么可能导致内核无法使用我的多核机器?

tms*_*ont 6

原来问题是 i2c_hid

这似乎是某种触摸板驱动程序。出于某种原因,当我禁用它时,我仍然可以使用我的触摸板。可能是笔记本电脑上的触摸屏也在使用这个驱动程序,因为它不起作用。

无论如何,我不喜欢用指纹弄脏我的笔记本电脑屏幕……再见i2c_hid

我通过将其添加到内核参数来修复它: modprobe.blacklist=i2c_hid

虽然nolapic也有效,但它禁用了处理器中除 1 个内核之外的所有内核。

我强烈建议其他人不要使用apci=offnolapic出于这个原因。

使用这些选项是一种可能使您的机器正常工作的核武器,但您将损失大量性能和/或 I/O 设备作为附带损害。这是启动的一个很好的起点,然后你可以像我一样通过 journalctl 分析失败的启动。

祝找到这个的人好运。

  • 非常感谢分享你的发现!根据您的信息,我发现禁用“hid_sensor_hub”就足够了,并且触摸屏也可以使用(有关更多详细信息,请参阅下面的答案)。 (3认同)