acpi(4)
驱动在系统启动时被默认加载,不应该被编译到内核中。这个驱动在启动后不能被卸载,因为系统总线使用它进行各种硬件交互。然而,如果系统遇到问题,可以通过在 /boot/loader.conf
中设置 hint.acpi.0.disabled="1 "
后重启,或者通过在加载器提示下设置这个变量来完全禁用 ACPI,如“第三阶段”所述。注意ACPI 和 APM 不能共存,应该分开使用。如果驱动程序注意到另一个正在运行,最后加载的那个将终止。
acpiconf
、-s
标志和 1 到 5 的数字来使系统进入睡眠模式。大多数用户只需要 1(快速挂起到 RAM)或 3(挂起到 RAM)。选项 5 执行软关闭,与运行 halt -p
相同。acpi_video(4)
驱动程序使用 ACPI 视频扩展来控制显示切换和背光亮度。它必须在任何 DRM 内核模块之后加载。在加载该驱动后,Fn
亮度键将改变屏幕的亮度。可以通过检查 /var/run/devd.pipe
来检查 ACPI 事件:sysctl
。更多信息请参考 acpi(4)
和 acpiconf(8)
的手册。src/sys/contrib/dev/acpica
。允许 ACPI-CA
在 FreeBSD 上工作的胶合代码是在 src/sys/dev/acpica/Osd
。最后,实现各种 ACPI 设备的驱动在 src/sys/dev/acpica
中找到。/boot/loader.conf
中添加 hint.psm.0.flags="0x3000"
。S1-S3
,和一种暂停到磁盘的状态(STD),称为 S4
。STD可以用两种不同的方式实现。S4
BIOS 是一个由 BIOS 协助的挂起到磁盘的状态,S4
OS 则完全由操作系统实现。当插上电源但不开机时,系统所处的正常状态是 "软关闭"(S5
)。sysctl hw.acpi
来检查与挂起有关的项目。这些例子的结果来自 Thinkpad:acpiconf -s
来测试 S3
、S4
和 S5
。s4bios
为一(1)表示S4
BIOS的支持而不是 S4
操作系统的支持。S1
开始。这个状态最有可能工作,因为它不需要太多的驱动支持。没有人实现S2
,它与S1
类似。接下来,尝试S3
。这是最深的 STR 状态,需要大量的驱动支持来正确地重新初始化硬件。S3
状态。在某些情况下,诸如丢失固件状态、设备看门狗超时、永远重试等问题,都可以用这种方法捕捉到。注意,系统不会真正进入 S3
状态,这意味着设备可能不会失去电源,即使暂停/恢复方法完全消失,许多设备也能正常工作,这与真正的 S3
状态不同。S3
,并在再次打开时恢复:dcons(4)
的火线端口(Firewire port)和电缆,以及内核调试技能。nvidia.ko
这样的二进制驱动、显示驱动和 USB 会有最多的问题,而以太网接口通常工作良好。如果驱动程序可以被正确加载和卸载,可以通过在 /etc/rc.suspend
和 /etc/rc.resume
中添加适当的命令来实现自动化。如果恢复后显示混乱,试着将 hw.acpi.reset_video
设置为1。尝试为 hw.acpi.sleep_delay
设置更长或更短的值,看看是否有帮助。vmstat -i
的输出并查看有 acpi0
的那一行来区别于丢失的中断。如果计数器的增加速度超过每秒几次,就有一个中断风暴。如果系统出现挂起的情况,尝试中断到 DDB(控制台的 CTRL
+ ALT
+ ESC
)并输入show interrupts
。/boot/loader.conf
中用 hint.apic.0.disabled="1 "
禁用 APIC 支持。debug.acpi.disable
的不同值来隔离 ACPI 子系统。参见 acpi(4) 的命令手册以了解一些例子。/boot/loader.conf
中设置 hw.acpi.disable_on_poweroff="0"
。这可以防止 ACPI 在关机过程中禁用各种事件,一些系统出于同样的原因需要将这个值设置为 1(默认值)。这通常可以解决系统在挂起或关机后自发开机的问题。acpi.sys
和 acpiec.sys
) 并没有严格检查是否符合标准,因此许多只在 Windows® 下测试 ACPI 的 BIOS 供应商从未修复他们的 ASL。FreeBSD 的开发人员继续识别并记录哪些非标准的行为是 Microsoft® 的解释器所允许的,并对其进行复制,这样 FreeBSD 就可以在不强迫用户修正 ASL 的情况下工作。acpidump的-t
,显示固定表的内容,和-d
,来反汇编 AML:/boot/loader.conf
中设置 hw.acpi.osname="Windows 2009"
,使用 ASL 中列出的最新的 Windows® 版本。my.asl
。如果这个文件被编辑了,用下面的命令编译新的 ASL。警告通常可以被忽略,但错误是错误,通常会妨碍 ACPI 的正常工作。-f
将强制创建 AML,即使在编译过程中出现了错误。一些错误,例如缺少返回语句,会由 FreeBSD 解释器自动解决。iasl
的默认输出文件名是 DSDT.aml
。通过编辑 /boot/loader.conf
来加载这个文件,而不是 BIOS 的错误副本,后者仍然存在于闪存中,如下所示:DSDT.aml
复制到 /boot
,然后重新启动系统。如果这能解决这个问题,请将新旧ASL的 diff(1)发送到 FreeBSD ACPI邮件列表,以便开发人员能够解决 acpica
中的错误行为。ACPI_ALL_COMPONENTS
)和 ACPI 硬件支持(ACPI_ALL_DRIVERS
)。调试输出的粗略程度被指定为级别,范围从仅仅报告错误( ACPI_LV_ERROR
)到一切( ACPI_LV_VERBOSE
)。级别是一个位掩码,所以可以同时设置多个选项,用空格隔开。在实践中,应该用一个串行控制台来记录输出,这样它就不会因为控制台消息缓冲区的刷新而丢失。在 acpi(4)
中可以找到各个层和级别的完整列表。options ACPI_DEBUG
。在 /etc/make.conf
中添加 ACPI_DEBUG=1
来全局启用它。如果使用模块而不是自定义内核,只重新编译 acpi.ko
模块,如下所示:acpi.ko
复制到 /boot/kernel
,并在 /boot/loader.conf
中添加所需的级别和层次。本例中的条目启用了所有 ACPI 组件和硬件驱动的调试信息,并以最简洁的级别输出错误信息:/boot/loader.conf
。相反,在启动并为特定事件准备好系统后,使用 sysctl
来指定层和级别。可以使用 sysctl
设置的变量与 /boot/loader.conf
中的 tunables
命名相同。注意在向该邮件列表提交调试信息之前,请确保安装了最新版本的 BIOS ,如果有的话,也请更新嵌入式控制器固件版本。
boot -v
后 dmesg
的输出,包括由错误产生的任何错误信息。boot -v
的 dmesg
输出。sysctl hw.acpi
的输出,它列出了系统提供的功能。njl-FooCo6000.asl
。