
我有一些基於 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 開發人員不會在這裡嘗試支援您。這不是一個很常見的問題。