Linux的電源管理架構(gòu)_第1頁(yè)
Linux的電源管理架構(gòu)_第2頁(yè)
Linux的電源管理架構(gòu)_第3頁(yè)
Linux的電源管理架構(gòu)_第4頁(yè)
Linux的電源管理架構(gòu)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Linux的電源管理架構(gòu)Linux的源代碼里,大部分都屬于設(shè)備驅(qū)動(dòng)程序的代碼,因此,大多數(shù)電源管理(PM)的 代碼也是存在于驅(qū)動(dòng)程序當(dāng)中。 很多驅(qū)動(dòng)程序可能只做了少量的工作, 另外一些,例如使用 電池供電的硬件平臺(tái)(移動(dòng)電話等)則會(huì)在電源管理上做了大量的工作。這份文檔對(duì)驅(qū)動(dòng)程序如何與系統(tǒng)的電源管理部分交互做了一個(gè)大概的描述,尤其是關(guān)聯(lián)到驅(qū)動(dòng)程序核心中的模型和接口的共享,建議從事驅(qū)動(dòng)程序相關(guān)領(lǐng)域的人通過(guò)本文檔可以了解相關(guān)的背景知識(shí)。設(shè)備電源管理的兩種模型驅(qū)動(dòng)程序可以使用其中一種模型來(lái)使設(shè)備進(jìn)入低功耗狀態(tài):1.系統(tǒng)睡眠模型:驅(qū)動(dòng)程序作為一部分,跟隨系統(tǒng)級(jí)別的低功耗狀態(tài),就像suspend ”(也叫

2、做suspend-to-RAM),或者對(duì)于有硬盤的系統(tǒng),可以進(jìn)入hibernation ”(也叫做suspend-to-disk )。這種情況下,驅(qū)動(dòng)程序,總線,設(shè)備類驅(qū)動(dòng)一起,通過(guò)各種特定于設(shè)備的suspend和resume方法,清晰地關(guān)閉硬件設(shè)備和各個(gè)軟件子系統(tǒng),然后在數(shù)據(jù)不被丟失的情況下重新激活硬件設(shè)備。有些驅(qū)動(dòng)程序可以管理硬件的喚醒事件,這些事件可以讓系統(tǒng)離開(kāi)低功耗狀態(tài)。這一特性可以通過(guò)相應(yīng)的/sys/devices/ - /power /wakeup文件來(lái)開(kāi)啟和關(guān)閉(對(duì)于Ethernet驅(qū)動(dòng)程 序,ethtool通過(guò)ioctl接口達(dá)到同樣的目的);使能該功能可能會(huì)導(dǎo)致額外的功耗,但他

3、讓整個(gè)系統(tǒng)有更多的機(jī)會(huì)進(jìn)入低功耗狀態(tài)。2. Runtime電源管理模型:這種模型允許設(shè)備在系統(tǒng)運(yùn)行階段進(jìn)入低功耗狀態(tài),原則上,他可以獨(dú)立于其他的電源管理活動(dòng)。不過(guò),通常設(shè)備之間不能單獨(dú)進(jìn)行控制(例如,父設(shè)備不能 進(jìn)入suspend,除非他 的所有子設(shè)備已經(jīng)進(jìn)入suspend狀態(tài))。此外,依據(jù)不同的總線類型,可能必須做出一些 特別的操作來(lái)達(dá)到目的。如果設(shè)備在系統(tǒng)運(yùn)行階段進(jìn)入了低功耗狀態(tài),在系統(tǒng)級(jí)別的電源狀態(tài)遷移時(shí)(suspend或hibernation)就必須做出特別的處理。正因?yàn)檫@個(gè)原因, 不僅僅設(shè)備驅(qū)動(dòng)程序本身,相應(yīng)的子系統(tǒng)(bus type,device type,deviceclass

4、)驅(qū)動(dòng)程序和電源管理核心也會(huì)被卷入到rumtime電源管理的工作中來(lái)。比如當(dāng)系統(tǒng)睡眠時(shí),以上的各模塊必須互相合作來(lái)實(shí)現(xiàn)各種多樣的suspend和resume方法,以便讓硬件進(jìn)入低功耗狀態(tài),喚醒后繼續(xù)提供服務(wù)而不丟失數(shù)據(jù)。對(duì)于低功耗狀態(tài)的定義,我們沒(méi)有太多可以說(shuō)的,因?yàn)樗麄兺ǔL囟ㄓ谙到y(tǒng),甚至特定于某 個(gè)設(shè)備。如果在系統(tǒng)運(yùn)行狀態(tài),足夠多的設(shè)備進(jìn)入了低功耗狀態(tài),這時(shí)的效果其實(shí)和進(jìn)入了系統(tǒng)級(jí)別的低功耗狀態(tài)非常相像。這樣一些驅(qū)動(dòng)程序可以利用rumtime電源管理讓系統(tǒng)進(jìn)入一種類似深度省電的狀態(tài)。大多數(shù)進(jìn)入suspend狀態(tài)的設(shè)備會(huì)停止所有的I/O操作:不會(huì)有DMA或者IRQ請(qǐng)求(需要喚醒系統(tǒng)的除外),

5、不會(huì)有數(shù)據(jù)的讀寫,不再接受上層驅(qū)動(dòng)的請(qǐng)求。這對(duì)于不同的總線和平臺(tái)會(huì)有不同的要求。關(guān)于硬件喚醒事件的一些例子:由RTC發(fā)起的鬧鐘,網(wǎng)絡(luò)數(shù)據(jù)包的到達(dá),鍵盤或者鼠標(biāo)的活動(dòng),媒體的插入或移除(PCMCIA,MMC/SD,USB,等等)。進(jìn)入系統(tǒng)睡眠狀態(tài)的接口內(nèi)核為各個(gè)子系統(tǒng)(bus type,device type, device class )和驅(qū)動(dòng)程序提供了相應(yīng)的編程接口,以便它們參與它們所關(guān)心的設(shè)備的電源管理。這些接口覆蓋了系統(tǒng)級(jí)別的睡眠和runtime級(jí)別的管理。設(shè)備電源管理操作子系統(tǒng)和驅(qū)動(dòng)程序的設(shè)備電源管理操作,都定義在dev_pm_ops結(jié)構(gòu)中:1 struct dev_pm_ops 23

6、 int (* prepare )( struct device * dev );45 void ( * complete )( struct device * dev );67 int (* suspend )( struct device * dev );89 int (* resume )( structdevice* dev );1011int (* freeze )( structdevice* dev );12int (* thaw )( struct device * dev );37 ;這個(gè)結(jié)構(gòu)在include/linux/pm.h中定義,它們的作用將會(huì)在接下來(lái)進(jìn)行描述?,F(xiàn)在,

7、我們只要記住,最后三個(gè)方法是專門用于rumtime pm的,其他的則用于系統(tǒng)級(jí)別的電源狀態(tài)遷移。某些子系統(tǒng)中,依然存在所謂“過(guò)時(shí)的”或“傳統(tǒng)的”電源管理操作接口,這種方式不會(huì)使用到dev_pm_ops結(jié)構(gòu),而且只適用于系統(tǒng)級(jí)別的電源管理方法,這邊文章里將不會(huì)對(duì)它 進(jìn)行說(shuō)明,如果要了解的話請(qǐng)直接查看內(nèi)核的源代碼。子系統(tǒng)級(jí)別(Subsystem-Level)方法131415161718192021222324252627282930313233343536intintintintintintintint(* poweroff )( struct device*dev );(* restore )(

8、 struct device * dev );(* suspend_noirq(* resume_noirq(* freeze_noirq)(struct device)(struct device* dev );* dev );)(struct device * dev );(* thaw_noirq )( struct device(* poweroff_noirq(* restore_noirq(* runtime_suspend(* runtime_resume(* runtime_idle* dev );)(struct device * dev );)(struct device

9、* dev );)(struct device * dev );)(struct device * dev );)(struct device * dev );設(shè)備進(jìn)入suspend和resume的關(guān)鍵方法在bus_type結(jié)構(gòu)、device_type結(jié)構(gòu)和class結(jié)構(gòu)的pm成員中,他是一個(gè)dev_pm_ops結(jié)構(gòu)的指針。多數(shù)情況下,這些都是那些具體總線的體系結(jié)構(gòu)(例如PCI或USB或某個(gè)設(shè)備類別和設(shè)備類)的維護(hù)者們來(lái)關(guān)注的部分??偩€驅(qū)動(dòng)會(huì)適當(dāng)?shù)貙?shí)現(xiàn)這些方法以供硬件和驅(qū)動(dòng)程序使用它們;因?yàn)镻CI和USB有不同的工作方式。只有少數(shù)人會(huì)編寫subsystem-level的驅(qū)動(dòng)程序;大多數(shù)的設(shè)備驅(qū)

10、動(dòng)程序是建立在各種特定總線架構(gòu)的代碼之上。有關(guān)這些調(diào)用,稍后會(huì)進(jìn)行更詳盡的描述;它們將會(huì)順著父子形式的設(shè)備模型樹(shù),一個(gè)設(shè)備一個(gè)設(shè)備地被調(diào)用。/sys/devices/ - /power/wakeup files設(shè)備模型中的所有設(shè)備都有兩個(gè)標(biāo)志來(lái)控制喚醒事件(可使得設(shè)備或系統(tǒng)退出低功耗狀態(tài))設(shè)兩個(gè)標(biāo)志位由總線或者設(shè)備驅(qū)動(dòng)用device_set_wakeup_capable()和device_set_wakeup_enable()來(lái)初始化,它們?cè)趇nclude/linux/pm_wakeup.h中定義。can_wakeup”標(biāo)志表示設(shè)備(或驅(qū)動(dòng))物理上支持喚醒事件,device_set_wakeu

11、p_capable()函數(shù)會(huì)影響該標(biāo) 志。should_wakeup標(biāo)志控制設(shè)備是否應(yīng)該嘗試啟用他的喚醒機(jī)制。device_set_wakeup_enable()會(huì)影響該標(biāo)志。大部分的驅(qū)動(dòng)程序不會(huì)主動(dòng)修改它們的值。大多數(shù)設(shè)備的should_wakeup的初始值都被設(shè)為false ,也有例外,比如電源鍵、鍵盤和由ethtool設(shè)置了wake-on-LAN功能的網(wǎng)卡。設(shè)備是否有能力發(fā)出喚醒事件是一個(gè)硬件的問(wèn)題,內(nèi)核只是負(fù)責(zé)持續(xù)地跟蹤這些事件的發(fā)生。另外一方面,一個(gè)有喚醒能力的設(shè)備是否應(yīng)該發(fā)起喚醒事件則是一個(gè)策略問(wèn)題,它是由用戶空間通過(guò)sysfs的屬性文件(power/wakeup)進(jìn)行管理的。用戶

12、空間可以寫入enabled ”或disabled”來(lái)設(shè)置或清除shoule_wakeup標(biāo)志,相應(yīng)地,讀取該文件時(shí),如果can_wakeup標(biāo)志是true則返回對(duì)應(yīng)的字符串,如果can_wakeup是false ,則返回一個(gè)空字符串,以此來(lái)表明設(shè)備不支持喚醒事件。(需要注意的是,盡管返回空字符串,該文件的寫入依然會(huì)影響should_wakeup標(biāo)志)只有當(dāng)這兩個(gè)標(biāo)志都為true時(shí),device_may_wakeup()函數(shù)才會(huì)返回true。當(dāng)系統(tǒng)遷移到睡眠狀態(tài)時(shí),驅(qū)動(dòng)程序應(yīng)該在讓設(shè)備進(jìn)入低功耗狀態(tài)前通過(guò)這一函數(shù)檢查,確定是否啟用喚醒機(jī)制。不過(guò),在rumtime電源管理模式下,不管設(shè)備和驅(qū)動(dòng)程序

13、是否都支持,也不管should_wakeup標(biāo)志是否設(shè)置,喚醒事件都會(huì)被使能。/sys/devices/ - /power/control files設(shè)備模型中的每個(gè)設(shè)備都有一個(gè)標(biāo)志位來(lái)控制它是否屬于runtime電源管理模式。這個(gè)叫runtime_auto的標(biāo)志由bus type(或其他子系統(tǒng))用pm_rumtime_allow()或者是pm_rumtime_forbid()來(lái)初始化。默認(rèn)值是允許rumtimepm的。用戶空間可以通過(guò)向設(shè)備的sysfs文件power/control寫入on ”或者auto ”來(lái)修改該標(biāo)志位。寫入auto”相當(dāng)于調(diào)用了pm_rumtime_allow(),允許

14、設(shè)備由驅(qū)動(dòng)程序進(jìn)行rumtimepm。寫入on ”相當(dāng)于調(diào)用pm_rumtime_forbid(),標(biāo)志位被清除,設(shè)備將會(huì)從低功耗狀態(tài)返回全功率狀態(tài),并且阻止設(shè)備進(jìn)行runtime電源管理。用戶空間也可以讀取該文件來(lái)檢查runtime_auto的當(dāng)前值。設(shè)備的runtime_auto標(biāo)志不會(huì)影響系統(tǒng)級(jí)別電源狀態(tài)的遷移。特別注意的是,盡管runtime_auto標(biāo)志被清除,當(dāng)系統(tǒng)級(jí)別的電源狀態(tài)遷移到睡眠狀態(tài)時(shí),設(shè)備也會(huì)被帶入低功耗狀態(tài)。關(guān)于runtime電源管理架構(gòu)的更多信息,請(qǐng)參看DocumentationZpowerZruntime_pm.txt調(diào)用驅(qū)動(dòng)程序進(jìn)入或退出系統(tǒng)睡眠狀態(tài)當(dāng)系統(tǒng)進(jìn)入睡

15、眠狀態(tài),系統(tǒng)會(huì)要求設(shè)備驅(qū)動(dòng)程序讓設(shè)備進(jìn)入兼容于目標(biāo)系統(tǒng)的一種狀態(tài)來(lái)掛起(suspend )設(shè)備。這通常是某種off”狀態(tài)。具體情況都是特定于各系統(tǒng)的。另外,可喚醒的設(shè)備一般會(huì)保持部分功能以便適當(dāng)?shù)臅r(shí)候可以喚醒系統(tǒng)。當(dāng)系統(tǒng)退出低功耗狀態(tài)時(shí),設(shè)備驅(qū)動(dòng)程序被要求恢復(fù)(resume )設(shè)備讓他進(jìn)入全電源狀態(tài)。suspend和resume動(dòng)作總是一起發(fā)生的,兩者都可分為多個(gè)不同的階段。對(duì)于相對(duì)簡(jiǎn)單的驅(qū)動(dòng)程序,suspend可能在suspend_noirq階段使用上層的類代碼來(lái)停止 設(shè)備并盡可能讓它們進(jìn)入off”狀態(tài)。喚醒時(shí),相對(duì)應(yīng)的resume調(diào)用會(huì)重新初始化硬件,然后重新激活他們的IZO活動(dòng)。對(duì)電源有

16、特別需求的驅(qū)動(dòng)程序可能會(huì)讓設(shè)備做出必要的準(zhǔn)備,以便之后可以產(chǎn)生喚醒事件。保證回調(diào)的順序當(dāng)設(shè)備進(jìn)入suspend或resume時(shí),因?yàn)樵O(shè)備之間具備一定的橋接關(guān)系,為了確保能夠正確地訪問(wèn)它們,suspend時(shí)會(huì)在設(shè)備數(shù)中按照自底向上的順序進(jìn)行,而resume時(shí)則是按 照自頂向下的順序進(jìn)行。設(shè)備在設(shè)備數(shù)中的順序決定于設(shè)備注冊(cè)的順序:子設(shè)備永遠(yuǎn)不能先于父設(shè)備進(jìn)行注冊(cè)、探測(cè)或resume;也不能在父設(shè)備之后進(jìn)行移除或掛起。具體的策略就是設(shè)備數(shù)應(yīng)該和硬件的總線拓?fù)浣Y(jié)構(gòu)相吻合。特別是,這就意味著當(dāng)父設(shè)備正在進(jìn)行掛起動(dòng)作(例如,已經(jīng)被pm的核心選為下一個(gè)將要被掛起的設(shè)備)、或者已經(jīng)掛 起的情況下,注冊(cè)子設(shè)備就

17、會(huì)失敗。設(shè)備驅(qū)動(dòng)程序必須正確地處理這種情況。系統(tǒng)電源管理中的各個(gè)階段suspend和resume是分階段完成的。Standby、Sleep (suspend-to-RAM )和hibernation (suspend-to-disk )會(huì)使用到不同的階段。在進(jìn)入下一個(gè)階段之前,都需要為每個(gè)設(shè)備調(diào)用屬于本階段的回調(diào)函數(shù)。不是所有的總線和設(shè)備類都會(huì)支持所有這些回調(diào),也不是所有的驅(qū)動(dòng)程序都要使用這些回調(diào)。有些階段需要凍結(jié)進(jìn)程后,解凍進(jìn)程前執(zhí)行。 此外,*_noirq階段需 要在IRQ被關(guān)閉的情況下執(zhí)行(除非他們被IRQ_WAKEUP標(biāo)記)。多數(shù)階段使用bus、type和class的回調(diào)(也就是定義在

18、dev-bus-pm , dev-type-pm和dev-class-pm中)。不過(guò)prepare和complete階段是個(gè)例外,他們僅僅使用了bus的回調(diào)。當(dāng)一個(gè)階段中有多個(gè)回調(diào)要執(zhí)行時(shí),按照以下順序調(diào)用,suspend時(shí): , resume時(shí):。比如, 在suspend時(shí)將會(huì)執(zhí)行以下 調(diào)用順序:dev-class-pm.suspend(dev);dev-type-pm.suspend(dev);dev-bus-pm.suspend(dev);相反,在resume階段,移至下一個(gè)設(shè)備之前,pm核心在當(dāng)前設(shè)備按以下回調(diào)進(jìn)行:dev-bus-pm.resume(dev);dev-type-pm.

19、resume(dev);dev-class-pm.resume(dev);這些回調(diào)可以反過(guò)來(lái)通過(guò)dev-driver-pm來(lái)調(diào)用設(shè)備或驅(qū)動(dòng)特定的方法,但這不是必需的。系統(tǒng)掛起(suspend )當(dāng)系統(tǒng)進(jìn)入standby或sleep狀態(tài)時(shí),需要經(jīng)歷以下階段:prepare , suspend , suspend_noirq。1. prepare階段主要是通過(guò)阻止新設(shè)備注冊(cè)來(lái)防止竟態(tài)的發(fā)生;如果此時(shí)要注冊(cè)子設(shè)備,PM的核心將會(huì)不知道一個(gè)設(shè)備的所有子設(shè)備已經(jīng)被suspend。(相反,設(shè)備可以在任何時(shí)刻被注銷。)不像suspend其他的階段,prepare階段設(shè)備樹(shù)會(huì)自頂向下進(jìn)行掃描。prepare階

20、段只使用了bus的回調(diào)?;卣{(diào)返回后,該設(shè)備的下面將不可以注冊(cè)新的子設(shè)備?;卣{(diào)方法也會(huì)讓設(shè)備或驅(qū)動(dòng)為將要到來(lái)的系統(tǒng)電源狀態(tài)遷移做出準(zhǔn)備,但它不應(yīng)該讓設(shè)備進(jìn)入低功耗狀態(tài)。2. suspend階段由suspend回調(diào)實(shí)現(xiàn),它停止設(shè)備的一切I/O操作。它同時(shí)也可以保存設(shè)備的寄存器,依據(jù)設(shè)備所屬的總線類型,讓設(shè)備進(jìn)入合適的低功耗狀態(tài),同時(shí)可以使能喚醒事件。3. suspend_noirq階段發(fā)生在IRQ被禁止之后,這意味著該回調(diào)運(yùn)行期間,驅(qū)動(dòng)程序的中斷處理代碼不會(huì)被調(diào)用?;卣{(diào)方法可以保存上一階段沒(méi)有保存的寄存器并最終讓設(shè)備進(jìn)入相應(yīng)的低功耗狀態(tài)。大多數(shù)子系統(tǒng)(subsystem )和驅(qū)動(dòng)程序不需要實(shí)現(xiàn)這一

21、回調(diào)。不過(guò),某些允許設(shè)備共享中斷向量的總線類型,例如PCI,通常需要這一回調(diào);否則,當(dāng)本設(shè)備已經(jīng)進(jìn)入低功耗時(shí)另一 個(gè)與他共享中斷的設(shè)備感知中斷的發(fā)生,驅(qū)動(dòng)程序?qū)?huì)發(fā)生錯(cuò)誤。這些階段結(jié)束后,驅(qū)動(dòng)程序必須停止所有的I/O事務(wù)(DMA , IRQs),保存足夠的狀態(tài)信息以便它們能被重新初始化或回復(fù)之前的狀態(tài)(按應(yīng)將的需要而定),然后讓設(shè)備進(jìn)入低功耗狀態(tài)。很多平臺(tái)上,它們會(huì)關(guān)閉某些時(shí)鐘;有時(shí)還會(huì)關(guān)閉電源或者是降低電壓。(支持rumtime pm的驅(qū)動(dòng)可能已經(jīng)提前完成部分或所有的步驟。)如果device_may_wakeup(dev)返回true,設(shè)備準(zhǔn)備好產(chǎn)生硬件喚醒信號(hào)以便觸發(fā)一個(gè)系統(tǒng)喚醒事件來(lái)喚醒

22、已經(jīng)進(jìn)入睡眠狀態(tài)的系統(tǒng)。例如,enable_irq_wakeup()可以讓一個(gè)連接到某個(gè)開(kāi)關(guān)或外部硬件的GPIO被捕捉,pci_enable_wake()則響應(yīng)類似PCI PME等信號(hào)。只要這些回調(diào)中的一個(gè)返回錯(cuò)誤,系統(tǒng)不會(huì)進(jìn)入所述的低功耗狀態(tài),而是由pm的核心對(duì)已經(jīng)suspend的設(shè)備發(fā)起resume動(dòng)作進(jìn)行回退。退出系統(tǒng)掛起(resume )當(dāng)系統(tǒng)退出standby或sleep狀態(tài)時(shí),需要經(jīng)歷以下階段:resume_noirq , resume , complete。1. resume_noirq回調(diào)方法應(yīng)該執(zhí)行所有在中斷處理程序被調(diào)用前的必須動(dòng)作。這通常意味著撤銷suspend_noir

23、q階段所做的動(dòng)作。如果總線類型允許共享中斷向量,例如PCI,該回調(diào)方法應(yīng)該使設(shè)備和驅(qū)動(dòng)能夠識(shí)別自身是否是中斷源,如果是,還要能正確地處理。例如,對(duì)于PCI總線,bus-pm.resume_noirq()讓設(shè)備進(jìn)入全電源狀態(tài)(PCI中稱作D0 ),并回復(fù)設(shè)備的標(biāo)準(zhǔn)配置寄存器。然后,調(diào)用設(shè)備驅(qū)動(dòng)程序的-pm.resume_noirq()方法來(lái)執(zhí)行特定于設(shè)備的動(dòng)作。2. resume回調(diào)方法讓設(shè)備回到他的工作狀態(tài),以便它能執(zhí)行正常的I/O。這通常等同于執(zhí)行suspend階段的撤銷工作。3. complete階段僅僅使用bus的回調(diào)。該方法應(yīng)該撤銷prepare階段所做出的動(dòng)作。不 過(guò)請(qǐng)注意,新設(shè)備可

24、能在resume回調(diào)返回后立刻被注冊(cè),而不必等到complete階段完成。這些階段結(jié)束后, 驅(qū)動(dòng)應(yīng)該和suspend之前一樣:I/O能通過(guò)DMA或IRQs執(zhí)行,相應(yīng)的時(shí)鐘被打開(kāi)。盡管在系統(tǒng)睡眠之前,設(shè)備因?yàn)閞untime pm已經(jīng)處于低功耗狀態(tài)之下,在這之后設(shè)備還是應(yīng)該回到全電源狀態(tài)。有很多原因說(shuō)明為什么要這樣做,詳細(xì)的討論請(qǐng)參 考:Documentation/power/runtime_pm.txt。不過(guò),到這以后,具體還是會(huì)特定于平臺(tái)的。例如,一些系統(tǒng)支持多種run”狀態(tài),resume后的模式可能不同于suspend之前??赡苁悄承r(shí)鐘或電源的改變,這些都會(huì)很容易影響 到驅(qū)動(dòng)程序如何工作。

25、驅(qū)動(dòng)程序需要能夠處理在suspend回調(diào)被調(diào)用后硬件被復(fù)位的情況,例如需要徹底地重新初始化。這可能是最困難的部分,實(shí)現(xiàn)細(xì)節(jié)可能會(huì)受到NDA等文檔和chip errata的保護(hù)。最簡(jiǎn)單的情況是硬件的狀態(tài)自suspend被執(zhí)行后沒(méi)有改變過(guò),單這是不能保證的(實(shí)際上,這通常都不成立)。不管物理上是否可能,驅(qū)動(dòng)程序也要準(zhǔn)備被知會(huì)系統(tǒng)power-down期間設(shè)備被移除。在Linux中,PCMCIA , MMC , USB, Firewire , SCSI甚至IDE都是可移除的例子。具體的關(guān)于驅(qū)動(dòng)程序如何被知會(huì),和處理這種移除事件的工作是特定于總線的,而且通常有單獨(dú)的線程來(lái)處理。進(jìn)入Hibernation

26、省略.退出Hibernation省略.系統(tǒng)設(shè)備系統(tǒng)設(shè)備(sysdevs )遵循稍微不同的API,它們可以在以下文件中找到:include/linux/sysdev.hdrivers/base/sys.c系統(tǒng)設(shè)備要在中斷關(guān)閉的情況下進(jìn)行suspend,并且要在其他設(shè)備被掛起之后執(zhí)行,喚醒時(shí),它們會(huì)先于其他設(shè)備被resume,當(dāng)然也是在關(guān)中斷的情況下。這些動(dòng)作都特別的”sysdev_driver”階段發(fā)生,該階段僅會(huì)對(duì)系統(tǒng)設(shè)備起作用。因仕匕,在suspend_noirq (freeze_noirq , poweroff_noirq)階段之后, 當(dāng)啟動(dòng)(non-boot )的CPUs都被關(guān)閉而且剩下

27、的CPU的IRQs也被關(guān)閉的情況下,這時(shí)候就會(huì)啟動(dòng)sysdev_driver.suspend階段,接下來(lái)系統(tǒng)進(jìn)入睡眠狀態(tài)(對(duì)于hibernation是系統(tǒng)映像被創(chuàng)建)。resume期間的順序就是:sysdev_driver.resume階段執(zhí)行,開(kāi)啟啟動(dòng)用CPU的IRQ,打開(kāi)其他非啟動(dòng)CPU,然后開(kāi)始resume_noirq階段。實(shí)際進(jìn)入和退出系統(tǒng)級(jí)別低功耗狀態(tài)的代碼有時(shí)候會(huì)調(diào)用一些只有boot firmware (bios ?bootloader?)才知道的硬件操作,然后保留CPU運(yùn)行某一軟件(從RAM或者FLASH中)來(lái)監(jiān)控系統(tǒng)和管理喚醒序列。設(shè)備低功耗(suspend)狀態(tài)設(shè)備的低功耗狀

28、態(tài)并沒(méi)有標(biāo)準(zhǔn)可言。某個(gè)設(shè)備可以只處理”on ”和”off ”,但另一個(gè)設(shè)備可能支持一打不同版本的”on”(多少個(gè)引擎被激活?),加上一個(gè)可以比徹底”off”更快地回到”on”的狀態(tài)。一些總線對(duì)不同的suspend狀態(tài)定義了一些規(guī)則。PCI可以給出一個(gè)例子來(lái):suspend的 序列完成后,一個(gè)非傳統(tǒng)(non-legacy )德?tīng)朠CI設(shè)備不可以執(zhí)行DMA或發(fā)出IRQs ,而且喚醒事件要通過(guò)PME#總線信號(hào)發(fā)出。還定義了幾個(gè)PCI標(biāo)準(zhǔn)的設(shè)備狀態(tài),其中一些狀態(tài)可以只是作為選項(xiàng)。相反,集成度較高的SOC處理器經(jīng)常使用IRQs作為喚醒源(因此驅(qū)動(dòng)要調(diào)用enable_irq_wake(),而且可以用DMA的完成中斷作為喚醒事件(有時(shí)DMA能保持激活,只是CPU和一些外設(shè)進(jìn)入睡眠)。這里有些細(xì)節(jié)可以是特定于平臺(tái)的。在某些睡眠狀態(tài)下,系統(tǒng)可以有部分設(shè)備保持激活,例如系統(tǒng)輕度睡眠時(shí),LCD顯示器會(huì)使用DMA繼續(xù)進(jìn)行刷 新,frame buffer甚至可能有DSP或者另外的非Linux的CPU來(lái)刷新,而運(yùn)行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論