如何在 grub 中设置 acpi_osi 参数

Rey*_*x_0 3 grub backlight

这是一个关于我可以解决的问题的问题,但我不知道为什么修复有效。

我希望能够从键盘调整背光,唯一固定的是改变 grub 中的一条线

GRUB_CMDLINE_LINUX_DEFAULT="acpi_osi="
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这可以解决背光问题?

我正在使用 Debian 8。

frr*_*frr 8

在操作系统启动过程中,操作系统从 BIOS 获取各种 ACPI 表并解释“表”,这些表看起来更像是程序代码。一种非常流行的表是DSDT,但它并不孤单。

ACPI 表以文本源代码的形式创建(请参阅上面链接的示例),并使用称为iasl(由英特尔提供)的工具编译为二进制形式。这些表存储在 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 'space')。如果需要将此 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 (否则看起来也很有希望)。天啊。

请注意,这是一般向后兼容性问题的另一个化身。两个不同的软件之间的交叉兼容性,创建时间相距甚远。说到挂起和恢复,Linux 已经失去了对被称为“设置电源状态”的古老而简单的 APM BIOS 调用的支持,因此唯一可以用于挂起 + 恢复的接口是 ACPI,它本身非常复杂,经过多次演变主要版本和非常现代的 Linux 版本不再在非常旧的硬件(及其 BIOS)上进行彻底测试,即使是新的 BIOS 也可能没有错误......甚至 ACPI 现在也被 UEFI 取代,它建立在 ACPI 之上,并带来了它自己的更多特性......