5.4 当从 6.1 内核进行 kexec 时,x86 上的 Linux 内核会发生恐慌并出现对齐异常

5.4 当从 6.1 内核进行 kexec 时,x86 上的 Linux 内核会发生恐慌并出现对齐异常

这里的引导链是使用 EFI 存根构建的 UEFI -> 6.1.14 内核,initramfs 加载并检查 5.4.109 内核,然后 kexecs 它。 CPU是2核Intel Atom N6210。当以这种方式启动时,在启动时,当 5.4 内核释放第二个 CPU 时,它会立即出现对齐异常。当从 EFI 引导或由 5.4.109 内核通过 kexec 引导时,相同的内核映像可以正常工作。

答案1

事实证明这是由于分裂锁检测

6.1 内核在此 CPU 上启用了 Intel 分裂锁检测功能 - 每当原子操作跨越缓存行时,它就会导致对齐异常。在较新的内核(例如该内核)中,当发生这种情况时,它会根据启动时间设置发出警告、错误、恐慌或变慢。

这通过kexec.较旧的内核不知道它已启用,其对齐检查异常处理程序只是出现恐慌,并且由于较旧的内核尚未消除其对分割锁的使用,因此它遇到了这个问题。

我尝试将split_lock_detect=off(请参阅链接的文章)添加到编译的命令行中(因为我没有引导加载程序),但似乎设置分割锁检测的代码在引入编译的命令行的代码之前运行。不管怎样,它保持启用状态。

因此,对于我的应用程序,我修补了在arch/x86/kernel/cpu/intel.c.可能有更好的修复方法,例如在 kexec 时关闭此功能,使用引导加载程序和命令行禁用,或者不引导旧内核,但我不想尝试它们。

由于这是一个奇怪的问题,我想将其发布在 Stack Exchange 上,以防对其他人有所帮助。

答案2

我前段时间也看到过这个问题,并且有一个补丁可以在 kexecing 之前禁用 sld。

https://github.com/hengchiehhuang/linux/commit/3e49acca98335c8969fa8af438fddbb8335e5b3c

笔记:我试图对您的答案发表评论,但系统不允许新手添加评论:)

相关内容