如何使 s2ram 工作

2006 Linus Torvalds 2006 Pavel Machek

  1. 查看 suspend.sf.net,程序 s2ram 在那里有一个很长的“已知可以”机器的白名单,以及在每台机器上使用的技巧。

  2. 如果这没有帮助,请尝试阅读 swsusp/S3 技巧S3 恢复的视频问题。 也许问题就像损坏的模块一样简单,简单的模块卸载可以解决它。

  3. 您可以使用 Linus 的 TRACE_RESUME 基础设施,如下所述。

使用 TRACE_RESUME

我一直在努力使我拥有的机器能够 STR,而且几乎总是驱动程序存在错误。 感谢挂起/恢复调试 - Chuck 试图禁用的东西。 这通常是调试这些问题的_唯一_方法,而且它实际上非常强大(但很耗时 - 必须将 TRACE_RESUME() 标记插入到不恢复的设备驱动程序中,然后重新编译并重新启动)。

无论如何,有兴趣的人(拥有一台无法启动的机器)调试此问题的方法是

  • 启用 PM_DEBUG 和 PM_TRACE

  • 使用如下脚本

    #!/bin/sh
    sync
    echo 1 > /sys/power/pm_trace
    echo mem > /sys/power/state
    

    挂起

  • 如果它没有恢复(通常是问题所在),请按住电源按钮重新启动,并查看 dmesg 输出,例如

    Magic number: 4:156:725
    hash matches drivers/base/power/resume.c:28
    hash matches device 0000:01:00.0
    

    这意味着最后一个跟踪事件就在尝试恢复设备 0000:01:00.0 之前。 然后找出哪个驱动程序控制该设备(lspci 和 /sys/devices/pci* 是您的朋友),看看您是否可以修复它,禁用它或跟踪到其恢复函数中。

    如果没有任何设备与哈希匹配(或任何匹配似乎是误报),则罪魁祸首可能是来自可加载内核模块的设备,该模块直到哈希检查后才加载。 您可以在加载更多模块后使用 sysfs 再次针对当前设备检查哈希

    cat /sys/power/pm_trace_dev_match
    

例如,以上恰好是我 EVO 上的 VGA 设备,我过去使用“radeonfb”(它是 ATI Radeon mobility)运行它。 事实证明,“radeonfb”根本无法恢复该设备 - 它试图设置 PLL,并且只是_挂起_。 使用常规的 VGA 控制台并让 X 恢复它可以正常工作。

注意

pm_trace 使用系统的实时时钟 (RTC) 来保存幻数。 原因是 RTC 是恢复操作期间唯一可靠可用的硬件,可以在其中设置一个值,该值可以在重新启动后继续存在。

pm_trace 与异步挂起不兼容,因此它会关闭异步挂起(这可能会解决时序或排序敏感的错误)。

结果是,在恢复后(即使成功),您的系统时钟将具有与幻数对应的值,而不是正确的日期/时间! 因此,建议使用诸如 ntp-date 或 rdate 之类的程序,在使用此跟踪选项时,从外部时间源重置正确的日期/时间。

由于时钟不断滴答,因此在恢复失败后尽快完成重新启动也至关重要。 跟踪选项不使用 RTC 的秒数或分钟的低位,但是太长的延迟会破坏幻数。