33.3. ACPI

ACPI(高级配置和电源接口)支持操作系统设置和控制各个硬件部件。ACPI 可以取代 PnP 和 APM。它提供有关电池、AC 适配器、温度、风扇和系统事件(例如“合上机盖”或“电池电量低”)的信息。

BIOS 提供包含有关各个部件和硬件访问方法信息的表。操作系统使用这些信息执行指派中断或激活和取消激活部件等任务。因为操作系统执行 BIOS 中储存的命令,所以功能取决于 BIOS 实施。/var/log/boot.msg 中报告了 ACPI 能够检测并装载的表。有关对 ACPI 问题进行查错的详细信息,请参见 第 33.3.4 节 “查错”

33.3.1. 使用 ACPI

如果内核在引导系统时检测到 ACPI BIOS,则会自动激活 ACPI 并取消激活 APM。某些较旧的计算机可能需要引导参数 acpi=force。计算机必须支持 ACPI 2.0 或更高版本。检查 /var/log/boot.msg 中的内核引导讯息,了解是否已激活了 ACPI。

随后,必须装载多个模块。这是由 Aacpid 的启动脚本完成的。如果这些模块中的任何一个模块引起问题,则可以在 /etc/sysconfig/powersave/common 中排除相应模块的装载或卸载。系统日志 (/var/log/messages) 包含模块的讯息,使您了解检测到了哪些部件。

/proc/acpi 目前包含多个文件,这些文件提供有关系统状态的信息,也可用于更改某些状态。某些功能仍在开发中,所以尚不能使用,而对某些功能的支持主要取决于制造商的实施。

通过 cat 可以读取所有文件(dsdtfadt 除外)。在某些文件中,可使用 echo(例如 echo X > file)来修改设置,以指定适用于 X 的值。能够简化对这些值的访问的其中一种可行方法就是使用 powersave 命令,它将充当 Powersave 守护程序的前端。下面介绍一些最重要的文件:

/proc/acpi/info

有关 ACPI 的一般信息。

/proc/acpi/alarm

这里指定应将系统从休眠状态唤醒的时间。当前不完全支持此功能。

/proc/acpi/sleep

提供有关可能的休眠状态的信息。

/proc/acpi/event

在这里报告所有事件并由 Powersave 守护程序 (powersaved) 对这些事件进行处理。如果没有任何守护程序访问该文件,则可以使用 cat /proc/acpi/event 读取该事件(如短暂单击电源按钮或合上机盖)(用 Ctrl-C 终止)。

/proc/acpi/dsdt/proc/acpi/fadt

这些文件中包含 ACPI 表 DSDT(differentiated system description table,区分系统说明表)和 FADT(fixed ACPI description table,固定 ACPI 说明表)。可以使用 acpidmpacpidisasmdmdecode 读取这些文件。包 pmtools 中提供了这些程序及其文档。例如,acpidmpDSDT | acpidisasm

/proc/acpi/ac_adapter/AC/state

显示是否连接了 AC 适配器。

/proc/acpi/battery/BAT*/{alarm,info,state}

有关电池状态的详细信息。通过将 info 中的 last full capacitystate 中的 remaining capacity 进行比较来读取电量水平。一个更方便的方法是使用 第 33.3.3 节 “ACPI 工具” 中引入的特殊程序之一。可以在 alarm 中指定电量水平,达到该电量水平将触发电池事件(例如警告、低和严重)。

/proc/acpi/button

该目录中包含各种切换模式的相关信息,比如便携式计算机机盖和按钮。

/proc/acpi/fan/FAN/state

显示风扇当前是否处于活动状态。将 0(开)或 3(关)写入此文件可以手工激活或取消激活风扇。但是,当系统变得过热时,内核中的 ACPI 代码和硬件(或 BIOS)将覆盖此设置。

/proc/acpi/processor/*

为系统中的每个 CPU 保留了一个单独的子目录。

/proc/acpi/processor/*/info

有关处理器省电选项的信息。

/proc/acpi/processor/*/power

有关当前处理器状态的信息。C2 旁边的星号表示处理器处于空闲状态。这是最常见的状态,可以从 usage 值中观察到。

/proc/acpi/processor/*/throttling

可用于设置处理器时钟的节流。通常,可以将节流分为 8 个级别。这与 CPU 的频率控制无关。

/proc/acpi/processor/*/limit

如果守护程序自动控制性能(已过时)和节流,则可以在这里指定最大限制。某些限制是由系统确定的。某些限制可由用户进行调整。

/proc/acpi/thermal_zone/

每个热区有单独的子目录。热区是具有类似热属性的区域,其编号和名称由硬件制造商指定。但是,很少实施 ACPI 提供的许多功能。而温度控制通常是由 BIOS 处理的。因为关系到硬件的使用寿命,所以操作系统很少有机会进行干预。因此,部分文件只具有理论价值。

/proc/acpi/thermal_zone/*/temperature

热区的当前温度。

/proc/acpi/thermal_zone/*/state

此状态指出一切是否 ok 或 ACPI 是采用 active 散热还是 passive 散热。对于独立于 ACPI 的风扇控制,此状态始终是 ok

/proc/acpi/thermal_zone/*/cooling_mode

选择由 ACPI 控制的散热方法。选择被动散热方式(性能较低,但很经济)还是主动散热方式(全部性能,但有风扇噪音)。

/proc/acpi/thermal_zone/*/trip_points

允许您确定温度限制,达到这些温度限制将触发特定操作(例如,被动散热或主动散热、暂停 (hot) 或关闭 (critical))。DSDT 中定义了可能的操作(取决于设备)。ACPI 规范中确定的临界点是 criticalhotpassiveactive1active2。即使不是实施所有临界点,也必须始终在此文件中以此顺序输入它们。例如,项 echo 90:0:70:0:0 > trip_pointscritical 的温度设置为 90,将 passive 的温度设置为 70(所有温度以摄氏度为单位)。

/proc/acpi/thermal_zone/*/polling_frequency

如果在温度改变时没有自动更新 temperature 中的值,请在这里切换巡回检测方式。使用命令 echoX > /proc/acpi/thermal_zone/*/polling_frequency 将每 X 秒查询一次温度。设置 X=0 禁用巡回检测。

不需要手工编辑这些设置、信息和事件。这可以通过 Powersave 守护程序 (powersaved) 及其各种前端(例如 powersave、kpowersave 和 wmpowersave)来完成。请参见第 33.3.3 节 “ACPI 工具”

33.3.2. 控制 CPU 性能

CPU 可以采用三种省电方法。根据计算机的运行方式,还可以将这三种方法结合起来使用。省电还意味着系统温度不会升得过高并且激活风扇的频率会降低。

频率和电压调节

PowerNow!Speedstep 是 AMD 和 Intel 为这一技术指定的名称。但是,其它制造商的处理器中也应用了这一技术。CPU 的时钟频率及其核心电压同时降低,因而采用这一技术所节省的电量远远超过了线性省电量。这意味着,如果频率减半(一半的性能),所节省的电量远不止一半。此技术独立于 APM 或 ACPI。可使用两种主要的方法来执行 CPU 频率调节 - 通过内核本身或通过用户空间应用程序。因此,可以在 /sys/devices/system/cpu/cpu*/cpufreq/ 下设置不同的内核管理器。

userspace governor

如果设置了用户空间管理器,则内核会将对 CPU 频率调节的控制指定给用户空间应用程序(通常是守护程序)。在 SUSE Linux 分发中,此守护程序是 powersaved 程序包。使用此实施时,将根据当前系统负载调整 CPU 的频率。 默认情况下,将使用某个内核实施。但是,在某个硬件上或对于特定处理器或驱动器,用户空间实施仍是唯一的工作解决方法。

ondemand governor

它是动态 CPU 频率策略的内核实施,应该可在大多数系统上运行。只要系统负载过高,CPU 频率将立即增加。它在系统负载较低时也较低。

conservative governor

此管理器与 ondemand 实施相似,只是使用更保守的策略。对于 CPU 频率增加之前的特定时间内,系统的负载必须很高。

powersave governor

静态地将 cpu 频率设置为最低。

performance governor

静态地将 cpu 频率设置为最高。

节流时钟频率

此技术将忽略一定百分比的 CPU 时钟信号脉冲。25% 的节流率,每四个脉冲忽略一个。87.5% 的节流率,每八个脉冲有一个送达处理器。但是,采用这种方法所节省的电量稍微低于线性省电量。通常,只有在频率调节不可用或要最大程度节省电量时才使用节流。此技术也必须由特殊的进程控制。系统接口是 /proc/acpi/processor/*/throttling

使处理器进入休眠状态

操作系统在处理器不执行任何任务时使处理器进入休眠状态。在这种情况下,操作系统向 CPU 发送一个 halt 命令。休眠状态有三种类型:C1、C2 和 C3。最经济的状态是 C3,在这种状态下,连处理器高速缓存与主存之间的同步都将暂停。因此,只有在没有任何其它设备通过总线主控芯片活动修改主存储器的内容时才能应用此状态。某些驱动程序禁止使用 C3。当前状态显示在 /proc/acpi/processor/*/power 中。

只有当处理器忙时,才需要进行频率调节和节流,这是因为当处理器处于空闲状态时总是会应用最经济的 C 状态。如果 CPU 忙,则建议采用的省电方法是频率调节。处理器经常只在部分负载的状态下工作。在这种情况下,可以以较低的频率运行。通常,内核 ondemand governor 或守护程序(例如 powersaved)控制的动态频率调节是最佳方法。如果使用电池工作或如果您想让计算机冷却或安静,则静态设置为低频率会非常有用。

节流应作为最后没有办法时采用的方法,例如,虽然系统负载很高,但为延长电池工作时间而采用节流。但是,如果节流程度过高,某些系统将不会正常运行。此外,如果 CPU 处理的任务量很少,则 CPU 节流就没什么作用。

在 SUSE Linux 中,这些技术是由 powersave 守护程序控制的。第 33.5 节 “powersave 包” 对此配置进行了说明。

33.3.3. ACPI 工具

一系列相对全面的 ACPI 实用程序包含这样一些工具:只显示信息(例如,电池电量水平和温度)的工具(acpi、klaptopdaemon 和 wmacpimon 等)、简化对 /proc/acpi 中的结构进行访问的工具或协助监视更改的工具(akpi、acpiw 和 gtkacpiw)以及用于编辑 BIOS 中 ACPI 表的工具(包 pmtools)。

33.3.4. 查错

问题有两种不同的类型。一方面,内核的 ACPI 代码可能包含未及时检测出的错误。在这种情况下,可以通过下载获得解决方案。但问题经常是由 BIOS 引起的。有时,会故意将一些不符合 ACPI 规范的配置集成在 BIOS 中,用于避免其它常用操作系统中 ACPI 实施中的错误。在 ACPI 实施中有严重错误的硬件部件会被记录在一个黑名单中,防止 Linux 内核对这些部件使用 ACPI。

在遇到问题时,首先要做的是更新 BIOS。如果计算机根本未引导,则使用以下引导参数之一可能会解决问题:

pci=noacpi

不使用 ACPI 配置 PCI 设备。

acpi=oldboot

只执行简单的资源配置。不要将 ACPI 用于其它目的。

acpi=off

禁用 ACPI。

[Warning]不使用 ACPI 引导会出现问题

某些较新的计算机(特别是 SMP 系统和 AMD64 系统)需要 ACPI 以正确配置硬件。在这些计算机上,禁用 ACPI 可能会产生问题。

引导后,用命令 dmesg| grep -2i acpi 来监视系统的引导讯息(或所有讯息,因为问题可能不是由 ACPI 引起的)。如果在解析 ACPI 表时发生错误,可以用改进的版本替换最重要的表 DSDT。在这种情况下,将忽略 BIOS 中有问题的 DSDT。第 33.5.4 节 “查错” 中对这一过程进行了介绍。

在内核配置中,可以使用开关来激活 ACPI 调试讯息。如果已编译并安装了具有 ACPI 调试功能的内核,则支持对详细信息执行错误专家搜索。

如果遇到 BIOS 或硬件问题,则最好与制造商联系。特别是如果制造商不常对 Linux 提供支持,他们就应该面对这些问题。只有在制造商意识到有很多客户在使用 Linux 时,他们才会重视这一问题。

33.3.4.1. 参见信息

有关 ACPI 的其它文档和帮助: