/sys/power/state
state 是 sysfs 中一個(gè)文件,為 Generic PM
的核心接口,在“kernel/power/main.c”中實(shí)現(xiàn),用于將系統(tǒng)置于指定的 Power State。
讀取該文件,返回當(dāng)前系統(tǒng)支持的 Power State,形式為字符串。在內(nèi)核中,有兩種類型的 Power
State,一種是 Hibernate
相關(guān)的,名稱為“disk”,除“disk”之外,內(nèi)核在"/kernel/power/suspend.c"中通過(guò)數(shù)組的形式定義了另外 3 個(gè)
state,如下:
const char *const pm_states[PM_SUSPEND_MAX] = {
[PM_SUSPEND_FREEZE] = "freeze",
[PM_SUSPEND_STANDBY] = "standby",
[PM_SUSPEND_MEM] = "mem",
};
這些 Power State 的解釋如下:
- freeze:不涉及具體的
Hardware 或 Driver,只是凍結(jié)所有的進(jìn)程,包括用戶空間進(jìn)程及內(nèi)核線程 - standby
- mem,即通常所講的 Sleep
功能,STR,Suspend to RAM。 - disk,即
Hibernate 功能,STD,Suspend to Disk。
寫入特定的 Power State 字符串,將會(huì)把系統(tǒng)置為該模式。
/sys/power/wakeup_count
該接口只和 Sleep 功能有關(guān),因此由“CONFIG_PM_SLEEP”宏定義控制。它的存在,是為了解決
Sleep 和 Wakeup 之間的同步問(wèn)題。
系統(tǒng)睡眠后,可以通過(guò)保留的 Wakeup source 喚醒系統(tǒng)。而在 CPU 體系中,喚醒系統(tǒng)就是喚醒
CPU,而喚醒 CPU 的唯一途徑,就是 Wakeup source 產(chǎn)生中斷(內(nèi)核稱作 Wakeup event)。而內(nèi)核要保證在多種狀態(tài)下,Sleep/Wakeup
的行為都能正常,如下:
▆ 系統(tǒng)處于 sleep 狀態(tài)時(shí),產(chǎn)生了 Wakeup event。此時(shí)應(yīng)該直接喚醒系統(tǒng)。這沒(méi)有問(wèn)題。
▆ 系統(tǒng)在進(jìn)入 sleep 的過(guò)程中,產(chǎn)生了
Wakeup event。此時(shí)應(yīng)該放棄進(jìn)入 sleep。
這一點(diǎn)就不那么容易做到了。例如,當(dāng) Wakeup event
發(fā)生在“/sys/power/state”被寫之后、內(nèi)核執(zhí)行 freeze 操作之前。此時(shí)用戶空間程序依舊可以處理 Wakeup
event,或者只是部分處理。而內(nèi)核卻以為該 Event 已經(jīng)被處理,因此并不會(huì)放棄此次 sleep 動(dòng)作。
這就會(huì)造成,Wakeup event 發(fā)生后,用戶空間程序已經(jīng)后悔了,不想睡了,但最終還是睡下去了。直到下一個(gè)
Wakeup event 到來(lái)。
為了解決上面的問(wèn)題,內(nèi)核提供 wakeup_count 機(jī)制,配合“/sys/power/state”,以實(shí)現(xiàn)
Sleep 過(guò)程中的同步。該機(jī)制的操作行為如下:
▆ wakeup_count 是內(nèi)核用來(lái)保存當(dāng)前
wakeup event 發(fā)生的計(jì)數(shù)。
▆ 用戶空間程序在寫入
state 切換狀態(tài)之前,應(yīng)先讀取 wakeup_count 并把獲得的 count 寫回給 wakeup_count。
▆ 內(nèi)核會(huì)比對(duì)寫回的 count 和當(dāng)前的 count 是否一致,如果不一致,說(shuō)明在讀取/寫回操作之間,產(chǎn)生了新的的
wakeup event,內(nèi)核就會(huì)返回錯(cuò)誤。
▆ 用戶空間程序檢測(cè)到寫入錯(cuò)誤之后,不能繼續(xù)后的動(dòng)作,需要處理響應(yīng)的 event 并伺機(jī)再次讀取/寫回
wakeup_count。
▆ 如果內(nèi)核比對(duì)一致,會(huì)記錄 write wakeup_count 成功時(shí)的 event 快照,后面繼續(xù)
suspend 動(dòng)作時(shí),會(huì)檢查是否和快照相符,如果不符,會(huì)終止 suspend。
▆ 用戶空間程序檢測(cè)到寫入正確后,可以繼續(xù)對(duì) state 的寫入,以便發(fā)起一次狀態(tài)切換。而此時(shí)是安全的。
-
嵌入式
+關(guān)注
關(guān)注
5088文章
19158瀏覽量
306495 -
接口
+關(guān)注
關(guān)注
33文章
8669瀏覽量
151551 -
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209972
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論