ACPI 模块
来自 uefi.org
- 高级配置与电源接口(ACPI)规范的开发旨在建立行业通用接口,以实现强大的操作系统(OS)主导的主板设备配置以及设备和整个系统的电源管理。ACPI 是操作系统主导的配置和电源管理(OSPM)的关键要素。
ACPI 模块是用于不同 ACPI 组件的内核模块。它们启用特殊的 ACPI 功能或向 /proc
或 /sys
添加信息。这些信息可以被 acpid 解析,用于事件或其他监控应用程序。
哪些模块可用?
这是一个 ACPI 内核模块的小列表和摘要
- ac (电源连接器状态)
- asus-laptop (在 ASUS/medion 笔记本电脑上很有用)
- battery (电池状态)
- bay (托架状态)
- button (捕获按钮事件,例如 LID 或 电源按钮)
- container (容器状态)
- dock (扩展坞状态)
- fan (风扇状态)
- i2c_ec (EC SMBus 驱动程序)
- thinkpad_acpi (在 Lenovo ThinkPad 笔记本电脑上很有用)
- processor (处理器状态)
- sbs (智能电池状态)
- thermal (热传感器状态)
- toshiba_acpi (对 Toshiba 笔记本电脑有用)
- video (视频设备状态)
可以使用以下命令获取运行内核的完整列表
$ ls -l /usr/lib/modules/$(uname -r)/kernel/drivers/acpi
total 112 -rw-r--r-- 1 root root 2808 Aug 29 23:58 ac.ko.gz -rw-r--r-- 1 root root 3021 Aug 29 23:58 acpi_ipmi.ko.gz -rw-r--r-- 1 root root 3354 Aug 29 23:58 acpi_memhotplug.ko.gz -rw-r--r-- 1 root root 4628 Aug 29 23:58 acpi_pad.ko.gz drwxr-xr-x 2 root root 4096 Aug 29 23:59 apei -rw-r--r-- 1 root root 7120 Aug 29 23:58 battery.ko.gz -rw-r--r-- 1 root root 3700 Aug 29 23:58 button.ko.gz -rw-r--r-- 1 root root 2181 Aug 29 23:58 container.ko.gz -rw-r--r-- 1 root root 1525 Aug 29 23:58 custom_method.ko.gz -rw-r--r-- 1 root root 1909 Aug 29 23:58 ec_sys.ko.gz -rw-r--r-- 1 root root 2001 Aug 29 23:58 fan.ko.gz -rw-r--r-- 1 root root 1532 Aug 29 23:58 hed.ko.gz -rw-r--r-- 1 root root 3241 Aug 29 23:58 pci_slot.ko.gz -rw-r--r-- 1 root root 17742 Aug 29 23:58 processor.ko.gz -rw-r--r-- 1 root root 3073 Aug 29 23:58 sbshc.ko.gz -rw-r--r-- 1 root root 7098 Aug 29 23:58 sbs.ko.gz -rw-r--r-- 1 root root 6311 Aug 29 23:58 thermal.ko.gz -rw-r--r-- 1 root root 8891 Aug 29 23:58 video.ko.gz
如何选择正确的模块
您必须亲自尝试哪个模块适用于您的机器,使用 modprobe yourmodule
,然后使用 dmesg 检查您的硬件是否支持该模块。添加 grep 文本搜索可能有助于缩小结果范围
# dmesg | grep -i acpi
[ 0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled) [ 0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x04] enabled) [ 0.000000] ACPI: LAPIC (acpi_id[0x02] lapic_id[0x01] enabled) [ 0.000000] ACPI: LAPIC (acpi_id[0x03] lapic_id[0x05] enabled) [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1]) [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1]) [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x02] high edge lint[0x1]) [ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x03] high edge lint[0x1]) [ 5.066752] ACPI: acpi_idle yielding to intel_idle [ 5.438998] acpi device:04: registered as cooling_device4
您可以 在启动时加载模块 以使更改对工作模块永久生效。
获取信息
要读取电池信息,您可以简单地 安装 acpi 包并运行 acpi -i
。
自 Linux 2.6.24 起,不鼓励且已弃用使用 /proc
存储 ACPI 信息。相同的数据现在可在 /sys
中获得,感兴趣的各方可以(应该)通过 netlink 从内核订阅 ACPI 事件。例如,对于电池
/sys/class/power_supply/BAT0/
故障排除
DSDT 修复
如果加载了正确的模块后电源管理问题仍然存在,则可能是 Linux 不友好的 DSDT 导致的。
笔记本 ACPI 修复
有时您会看到“ACPI: EC: input buffer is not empty, aborting transaction”。这是 ACPI 的问题,更具体地说是 BIOS 的不兼容性。可能有四种方法可以解决此问题
- 如果可用,请 刷新 BIOS。
- 使用
acpi=off
作为 内核参数,但这将禁用所有 ACPI 功能,例如电池充电和省电。 - 在某些情况下,据报道禁用 DPMS 可以解决此问题 [2]。但是,屏幕亮度可能不再完全可控
$ xset dpms force off
- 使用 bugs.launchpad.net 的补丁构建自定义 内核。
启动循环
某些笔记本电脑或主板可能存在启动问题,例如由于错误的 ACPI 固件实现,在从引导加载程序到操作系统的转换过程中断电。以下步骤提供了一些 内核参数,需要按顺序测试
- 设置
acpi=off
。如果您能够成功启动- 转储 ACPI 表并检查类似于 “Windows XXXX” 的字符串。找到最新的
# acpidump -b && for i in *; do echo $i:; strings -a $i | grep -i windows; done
- 设置
acpi_osi="Windows XXXX"
。
- 转储 ACPI 表并检查类似于 “Windows XXXX” 的字符串。找到最新的
- 启动循环问题可能是由于不稳定的 C 状态引起的
- 通过使用
processor.max_cstate=0
禁用 ACPI C 状态驱动程序 - 如果您使用的是 Intel 处理器,请设置
intel_idle.max_cstate=2
以将 C 状态限制为 C1E。更高的 C 状态可能有效,效果可能会有所不同。 - 使用
idle=nomwait
禁用 MWAIT 指令并回退到 ACPI C 状态驱动程序。使用 cpupower 验证您的更改$ cpupower idle-info
- 通过使用