CMOS 有时会重置超线程。我可以在使用 Linux 内核时强制使用超线程吗?

CMOS 有时会重置超线程。我可以在使用 Linux 内核时强制使用超线程吗?

我有一些基于 i7-4700EQ 的嵌入式服务器系统,需要超线程。一切都很好,只是在极少数情况下,CMOS 中的超线程标志会被设置为禁用。当硬件仍在我手中时,我可以简单地重新启动,进入 CMOS 并修复设置。 (CMOS 中的所有其他设置都保持良好,包括时间/日期,所以我认为这不是电池的问题。)

但是,一旦部署,就无法访​​问控制台。如果 CMOS 设置丢失,设备可以“修复”,但对于一个非常简单的问题来说,这似乎是一项艰巨的工作。

我的理解是Linux内核读取BIOS只是为了初始化内核变量。那是对的吗?

如果这是正确的,有没有办法告诉 Linux 内核忽略 BIOS 报告的内容并简单地在内核中启用超线程?

如果可能的话,有没有一种简单的方法(例如grub命令行设置)来做到这一点?否则,如果可能但很困难,是否可以通过修改内核源代码并重新编译来忽略 BIOS 的说明并启用超线程?

虽然我认为它不会起作用,但我已经在 /etc/default/grub 中尝试过

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash maxcpus=8 nr_cpus=8"

然后使用 update-grub 并重新启动。 (我还尝试单独设置 maxcpus 和 nr_cpus。)

我发现了许多在正在运行的系统上禁用超线程然后重新启用它的示例。但如果内核错误地认为人类故意禁用超线程,则不是启用超线程的示例。

最后,我可以声称“硬件损坏”,但这本身并不会赢得任何“战争”。如果尽管 BIOS 无法强制启用超线程,那么这是一个有效的答案 - 如果答案包含证据/解释,那么它对我很有用。

答案1

一般来说,这并不完全正确。

示例1:星米固件(又名 BIOS)中断处理程序在内核启动后仍然以比内核更高的权限运行。欢迎您尝试对抗SMM;不要指望 Linux 对帮助你特别感兴趣。

示例 2:“安全启动”固件可能是可自行升级的,但通常认为让操作系统用任意映像覆盖固件并不是一个好主意。因此,在启动操作系统/引导加载程序之前,固件应设置一个硬件标志以防止写入固件芯片。一旦设置,不重新启动就不可能取消设置该标志。或类似的东西。它的出现当然是因为某些固件忽略了正确执行此操作......一个例子是这里

我不知道允许SMT是否是另一个例子。

与固件对抗是不可取的。如果您的操作系统 (Linux) 不尝试支持您,那么与固件对抗尤其不可取。 (例如,因为它与有关 ACPI ATA 命令的固件进行斗争。或者更具建设性的是,如果 Linux 运行在已经知道准确的 C 状态信息的 Intel CPU 上,则它会忽略来自 ACPI BIOS 的 C 状态信息。

(此外,如果应用一般规则,您的目标可能仍然无法实现。例如,您可能需要 BIOS 告诉您布局。并且可能有一些原因导致您不想假设布局是静态的。即原因修补内核以忽略 BIOS 提供的 ACPI 表,而是使用您在使用所有所需 BIOS 设置启动时捕获的 ACPI 表并不是一个好主意)。

即使您的目标是可能的,我认为您也会了解特定于硬件的细节。如果您找到一种在内核中启用 SMT 的方法,那就太令人印象深刻了不是特定于硬件的。如果这个问题没有指定它已经在匹配的主板和固件版本上进行了测试,并且您没有指定这些是什么,我不会完全相信这个问题的答案是规范的。

在此基础上,我认为 Linux 开发人员不会在这里尝试支持您。这不是一个很常见的问题。

相关内容