如何在 grub 中設置 acpi_osi 參數
這是一個關於我可以修復的問題的問題,但我不知道為什麼修復有效。
我希望能夠從鍵盤調整背光,唯一可以解決的就是改變 grub 中的一行
GRUB_CMDLINE_LINUX_DEFAULT="acpi_osi="
有誰知道為什麼這解決了背光問題?
我正在使用 Debian 8。
在作業系統啟動過程中,作業系統從 BIOS 中獲取各種 ACPI 表並解釋這些“表”,這些“表”看起來更像是程式碼。一個非常流行的表是DSDT,但它並不孤單。
ACPI 表以文本原始碼的形式創建(參見上面連結的範例),並使用稱為iasl的工具(由 Intel 提供)編譯成二進制形式。這些表儲存在 BIOS 中並由作業系統以二進制形式(如中間字節碼或類似的)處理,但如果需要,可以“反彙編”回原始碼。Linux 修補程序有時使用它來糾正錯誤或 ACPI“版本不匹配”:原始表被反彙編,可能在原始碼中更正,由目前版本的 IASL 重新編譯,並作為自定義替換提供給 Linux 核心。 ..
ACPI 表(包括 DSDT)包含條件分支 - 由引導作業系統解釋的 ACPI 表可以使用稱為 _OSI 的方法測試作業系統版本。主機作業系統解釋該表,向 _OSI 方法提供“作業系統版本字元串”。例如,出於某種原因,_OSI 字元串“Windows 2009”指的是我們現實中的“Windows 7”。請注意,據稱這不是_OSI 方法最初的目的,但沒關係:-)
換句話說,包含在 ACPI 表中的“程序”(同時被主機作業系統解釋)可以測試它在哪個 Windows 版本下執行,並基於此修改其行為。它可以根據檢測到的 Windows 版本初始化硬體和各種 BIOS 服務介面/結構。Linux 有自己分配的 _OSI 標識符,例如 MacOS 也是如此……然而,由於 x86 主機板中的 BIOS 通常會針對目前的 Windows 版本進行測試,如果您嘗試讓 ACPI 表相信它是被某些特定的 Windows 版本解釋,而不是由 Linux 解釋。(或者盡量避免在分支 ACPI 程式碼中遇到“預設情況”,這可能沒有很好地定義。)核心 cmdline 參數是什麼
acpi_osi="some string"
有好處。Linux“核心參數”指南中記錄了此參數和其他相關參數的詳細資訊。除了顯示背光之外,acpi_osi 字元串還會影響引導期間 BIOS 和作業系統行為的其他方面。例如,此時我正在使用舊的 Acer Extensa 5220 筆記型電腦(C2D,i965GM 北橋),在預設配置中,它經常無法從掛起(ACPI S3,掛起到 RAM)中恢復。恢復時,它會凍結並顯示黑屏和背光,或者它會執行兩次重新啟動,然後從頭開始。我更新了 BIOS 單獨沒有幫助,但它讓我確信這個 BIOS 更新 (1.35) 旨在與 Windows 7 一起工作。所以在嘗試了一些其他的事情之後,我終於有了很好的結果
acpi_osi=! acpi_osi="Windows 2009"
第一部分,acpi_osi=! , 表示“忘記此時您知道的任何 acpi_osi 字元串”(它實際上是一個字元串列表,而不僅僅是一個字元串,顯然 - 呃)。因此,我們首先清除解釋器最初使用的任何內容,然後設置所需的字元串。要使其與現代 Linux 核心一起工作,最好指定 BIOS 名義上支持的最現代的 Windows 版本。
請注意,您需要在“Windows 2009”兩邊加上引號,因為該字元串包含一個空白字元(ASCII ‘空格’)。如果需要將此 cmdline arg 輸入到某些發行版特定配置文件中的 shell 變數中,例如 Debian 和朋友 (Ubuntu) 中的 /etc/default/grub,這將成為一個問題。在這種情況下,只需使用
acpi_osi=\"Windows 2009\"
,即使用反斜杠“轉義”每個應該進入核心命令行的引號。如果您隨後執行 update-grub(同樣是 Debian/Ubuntu),反斜杠將被去除,並且引號在 /boot/grub/grub.cfg 中逐字結束。有趣的是,如果您稍後檢查cat /proc/cmdline
,您可能會發現第一個引號已移至參數的開頭:"acpi_osi=Windows 2009"
這看起來有點奇怪:-)我發現我不應該弄亂 acpi_os_name 或 acpi_sleep (否則看起來很有希望)。YMMV。
請注意,這是一般向後兼容性問題的另一個體現。兩個不同軟體之間的交叉兼容性,在時間上相距甚遠。說到掛起和恢復,Linux 已經失去了對被稱為“設置電源狀態”的古老而簡單的 APM BIOS 呼叫的支持,所以唯一可以用於掛起+恢復的介面是 ACPI,它本身非常複雜,經過了幾次演變主要版本和非常現代的 Linux 版本不再在非常舊的硬體(及其 BIOS)上進行徹底測試,即使是新的 BIOS 也可能沒有沒有錯誤……甚至 ACPI 現在也被 UEFI 取代,它建立在 ACPI 之上,並帶來了自己的更多特性……