
最近电脑启动总是偶尔遇到这样的问题,
BUG:soft lockup - CPU#0 stuck for 23s! [migration/0:5]
于是在grub里取消了内核启动参数“quiet”,让linux报出更多问题。在打印的日志中出现了clocksource,swapper等,于是尝试通过禁用swap分区调整tsc等手段,发现都没有用,网上查了蛮多资料,试过去都没用。
由于日志里面提示软锁的函数都是关于cpu多核调度的,比如migration里的stop_machine_yield,以为是cpu的问题,耽误了不少时间,最终还是没解决。

然后就尝试复现这样一个bug,开始找cpu软锁的条件,发现以下规律:
1.软锁bug在开机进入grub选择linux内核进行引导的时候发生,遇到软锁的bug的时候,长按电源键强制关机,之后启动就不会出现这样的bug。
2.软锁bug只在启动linux系统时出现,启动windows或者黑苹果的时候不会出现。
3.笔记本拔掉电源线,使用电池供电的时候开机,不会出现这个bug。
4.笔记本前一次关机的时候插着电源,之后一直保持电源线插着,然后开机,就会遇到这个bug。
5.笔记本前一次关机的时候插着电源,之后拔掉电源线,然后开机,不会遇到这个bug。
6.笔记本拔掉电源线之后关机,等彻底关机之后,然后插着电源线开机,不会遇到这个bug。
由此可见,bug只有在4的时候发生,由此推测出,应该是一种设备,在关机之后没有彻底断开电源,导致下次开机的时候初始化出现问题。
那么为什么不插着电源线的时候开机就不会出现bug呢?很可能是因为,笔记本的节能设置的缘故:当笔记本切换到电池模式的时候,关机之后不会给那个出问题的设备供电。而当笔记本一直外接电源关机的时候,虽然笔记本关机了,但由于检测到外接电源,所以一直给那个设备供电。
之后想起来室友的维修技术————替换法。
换言之我们解决问题其实是在解空间里面搜索一个符合条件的解,任何维修问题其实都可以转化为数学问题,使用数学方法可以更快定位和解决问题。遇到这种问题,最快的方法往往不是通过正向思维阅读内核源码,而是逆向思维的二分法和替换法。
替换措施如下:
1.安装多种linux操作系统,我现在用的是debian,然后从ubuntu一直装到了archlinux以及freebsd,无一例外,在满足4的条件下,开机就有bug。排除操作系统问题,说明只有内核或者硬件出现问题。
2.对bios里面和电源与设备有关的所有选项进行二分法的开启和关闭,先关闭一半的选项,开机看是否出现bug,如果出现bug,就继续在剩下的选项里面关闭一半,如果不出现bug,那么就把关闭的选项开启一半。
通过定位,发现是端口设置里面的media card reader这个选项出现了问题,开启就会出现bug,关闭bug就会消失。
难道是读卡器的问题?
仔细一看,读卡器里面很多灰尘,赶紧清灰,之后开启那个选项开机发现还是有bug。
难道是linux驱动不支持这个读卡器?
使用lspci -nnv发现:
1 | 00:14.5 SD Host controller [0805]: Intel Corporation BayHubTech Integrated SD controller [8086:9df5] (rev 11) (prog-if 01) |
然后去网上查了一下,发现没这个设备的驱动,
1 | sudo -E hw-probe -all -upload |
但是去linux-hardware.org上面发现这个设备的驱动是内核本身就支持的。
也可以看到里面的pci id和lspci的结果是一样的,都是8086:9df5。
https://linux-hardware.org/?probe=8c952bfc3d
在读卡器里面插上卡,发现可以识别,排除驱动没装的问题。
然后开机的时候如果读卡器里面插上卡,也不会出现这个bug。很奇怪,原因有待研究。
说些什么吧!