这是一个关于我可以解决的问题的问题,但我不知道为什么该修复有效。
我希望能够从键盘调整背光,唯一解决的问题是更改 grub 中的一行:
GRUB_CMDLINE_LINUX_DEFAULT="acpi_osi="
有谁知道为什么这可以解决背光问题?
我使用的是 Debian 8。
答案1
在操作系统启动过程中,操作系统从BIOS中获取各种ACPI表并解释“表格”,其中确实看起来更像程序代码。一张相当受欢迎的桌子是DSDT,但它并不孤单。
ACPI 表以文本源代码的形式创建(请参阅上面链接的示例),并使用名为的工具编译为二进制形式亚斯尔(由英特尔提供)。这些表存储在 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 代码中遇到“默认情况”,这可能没有很好地定义。)这就是内核命令行参数的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 之上并带来了自己的更多特性......
答案2
acpi_osi=
_OSI
导致Linux在执行主板提供的ACPI代码时禁用ACPI操作系统识别功能( )。
您的笔记本电脑可能会检查特定的 Windows 版本,以便在向操作系统报告亮度热键的不同模式之间进行切换。 Linux 通常将自己呈现为 ACPI 代码的最新 Windows 版本,因此acpi_osi=
让所有这些检查失败,显然会导致 ACPI 代码以 Linux 安装可以理解的方式报告亮度热键。
看https://unix.stackexchange.com/a/268106/147970有关 的影响的更多详细信息acpi_osi=…
。