如何使 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 的秒數或分鐘的低位,但是太長的延遲會破壞幻數。