1. 程式人生 > >linux電源管理--休眠與喚醒

linux電源管理--休眠與喚醒

在Linux中,休眠主要分三個主要的步驟:(1)凍結使用者態程序和核心態任務;(2)呼叫註冊的裝置的suspend的回撥函式;(3)按照註冊順序休眠核心裝置和使CPU進入休眠態。
      凍結程序是核心把程序列表中所有的程序的狀態都設定為停止,並且儲存下所有程序的上下文。當這些程序被解凍的時候,他們是不知道自己被凍結過的,只是簡單的繼續執行。如何讓Linux進入休眠呢?使用者可以通過讀寫sys檔案/sys /power/state 是實現控制系統進入休眠。比如:
# echo standby > /sys/power/state命令系統進入休眠。也可以使用
# cat /sys/power/state來得到核心支援哪幾種休眠方式。

      Linux Suspend 的流程。相關的檔案的路徑:
linux_soruce/kernel/power/main.c
linux_source/kernel/arch/xxx/mach-xxx/pm.c

linux_source/driver/base/power/main.c
(1)接下來讓我們詳細的看一下Linux是怎麼休眠/喚醒的。

      使用者對於/sys/power/state 的讀寫會呼叫到 main.c中的state_store(),使用者可以寫入 const char * const pm_state[] 中定義的字串,比如"mem"、 "standby"。然後state_store()會呼叫enter_state(),它首先會檢查一些狀態引數,然後同步檔案系統。
(2)準備凍結程序。

      當進入到suspend_prepare()中以後,它會給suspend分配一個虛擬終端來輸出資訊,然後廣播一個系統要進入suspend的Notify,關閉掉使用者態的helper程序,然後一次呼叫suspend_freeze_processes()凍結所有的程序,這裡會儲存所有程序當前的狀態,也許有一些程序會拒絕進入凍結狀態,當有這樣的程序存在的時候,會導致凍結失敗,此函式就會放棄凍結程序,並且解凍剛才凍結的所有程序。

(3)讓外設進入休眠。

      現在,所有的程序(也包括workqueue/kthread) 都已經停止了,核心態任務有可能在停止的時候握有一些訊號量,所以如果這時候在外設裡面去解鎖這個訊號量有可能會發生死鎖,所以在外設的suspend()函式裡面作lock/unlock鎖要非常小心,這裡建議設計的時候就不要在suspend()裡面等待鎖。
      最後會呼叫suspend_devices_and_enter()來把所有的外設休眠,在這個函式中,如果平臺註冊了suspend_pos(通常是在板級定義中定義和註冊),這裡就會呼叫suspend_ops->begin(),然後driver/base/power/main.c 中的 device_suspend()->dpm_suspend() 會被呼叫,他們會依次呼叫驅動的suspend() 回撥來休眠掉所有的裝置。當所有的裝置休眠以後,suspend_ops->prepare()會被呼叫,這個函式通常會作一些準備工作來讓板機進入休眠。接下來Linux,在多核的CPU中的非啟動CPU會被關掉,通過註釋看到是避免這些其他的CPU造成race condion,接下來的以後只有一個CPU在運行了。
      suspend_ops 是板級的電源管理操作,通常註冊在檔案 arch/xxx/mach-xxx/pm.c 中。接下來,suspend_enter()會被呼叫,這個函式會關閉arch irq,呼叫 device_power_down(),它會呼叫suspend_late()函式,這個函式是系統真正進入休眠最後呼叫的函式,通常會在這個函式中作最後的檢查。如果檢查沒問題,接下來休眠所有的系統裝置和匯流排,並且呼叫 suspend_pos->enter() 來使CPU進入省電狀態。這時候,就已經休眠了,程式碼的執行也就停在這裡了。

(4)Resume。

      如果在休眠中系統被中斷或者其他事件喚醒,接下來的程式碼就會開始執行,這個喚醒的順序是和休眠的順序相反的,所以系統裝置和匯流排會首先喚醒,使能系統中斷,使能休眠時候停止掉的非啟動CPU,以及呼叫suspend_ops->finish(),而且在suspend_devices_and_enter()函式中也會繼續喚醒每個裝置,使能虛擬終端。最後呼叫 suspend_ops->end()。再返回到enter_state()函式中的,當suspend_devices_and_enter() 返回以後,外設已經喚醒了,但是程序和任務都還是凍結狀態,這裡會呼叫suspend_finish()來解凍這些程序和任務,而且發出Notify來表示系統已經從suspend狀態退出,喚醒終端。到這裡,所有的休眠和喚醒就已經完畢了,系統繼續運行了。

相關推薦

1.Linux電源管理-休眠喚醒

abi 按鍵事件 define 電平 最快 head config文件 con 我們 1.休眠方式 在內核中,休眠方式有很多種,可以通過下面命令查看 # cat /sys/power/state //來得到內核支持哪幾種休眠方式.

1.Linux電源管理-休眠喚醒【轉】

轉自:https://www.cnblogs.com/lifexy/p/9629699.html 1.休眠方式  在核心中,休眠方式有很多種,可以通過下面命令檢視 # cat /sys/power/state //來得到核心支援哪幾種休眠方式.  

linux電源管理--休眠喚醒

在Linux中,休眠主要分三個主要的步驟:(1)凍結使用者態程序和核心態任務;(2)呼叫註冊的裝置的suspend的回撥函式;(3)按照註冊順序休眠核心裝置和使CPU進入休眠態。       凍結程序是核心把程序列表中所有的程序的狀態都設定為停止,並且儲存下所有程序的上下文

linux休眠喚醒

簡介 休眠/喚醒在嵌入式Linux中是非常重要的部分,嵌入式裝置儘可能的進入休眠狀 態來延長電池的續航時間.這篇文章就詳細介紹一下Linux中休眠/喚醒是如何工作 的, 還有Android中如何把這部分和Linux的機制聯絡起來的. 國際化 English Versio

Linux Kernel and Android 休眠喚醒(中文版)

現在, 所有的程序(也包括workqueue/kthread) 都已經停止了, 核心態人物有 可能在停止的時候握有一些訊號量, 所以如果這時候在外設裡面去解鎖這個訊號 量有可能會發生死鎖, 所以在外設的suspend()函式裡面作lock/unlock鎖要非常 小心,這裡建議設計的時候就不要在suspen

android /linux休眠喚醒(二)

1. 當所有wake_lock被釋放,自動進入休眠; 2. echo mem > /sys/power/state;(也需要等待wake_lock全部釋放才能進入suspend); 2.2. 休眠主要步驟 1. 凍結使用者態程序、核心執行緒; 2. 呼叫註冊的裝置的suspend回撥,其順序就是按照註

Linux電源管理-Linux regulator framework概述

nts RM 成功 一定的 val machine ons 存在 nag 前言 1. 什麽是regulator? regulator翻譯為"調節器",分為voltage regulator(電壓調節器)和current(電流調節器)。一般電源管理芯片(Power

Linux管理命令Ubuntu下安裝nginx的方法

rpm包和deb包是兩種Linux系統下最常見的安裝包格式,在安裝一些軟體或服務的時候免不了要和它們打交道。rpm包主要應用在RedHat系列包括 Fedora等發行版的Linux系統上,deb包主要應用於Debian系列包括現在比較流行的Ubuntu等發行版上。 二者對應的安裝命令分別為rp

Android電源管理-休眠簡要分析

轉自https://www.cnblogs.com/tangdoudou/p/3807936.html   工作需要,需要對這一塊深入學習。故在此做一點分析記錄,存疑解惑。 一、開篇  1.Linux 描述的電源狀態  - On(on)  

Linux電源管理研究筆記 動態電源管理 DPM

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Linux命令——gdisk、fdisk、partprobe Linux磁碟管理——MBR GPT

gdisk、fdisk MBR分割槽表請使用fdisk分割槽,GPT分割槽表請使用gdisk分割槽 MBR與GPT區別參考:Linux磁碟管理——MBR 與 GPT gdisk、gdisk這兩個命令引數不需要特殊記憶,進入命令後分別按? m會提示下一步如何操作。 partprobe 使用gdisk或

Linux電源管理(7)_Wakeup events framework

1.  前言 本文繼續“Linux電源管理(6)_Generic PM之Suspend功能”中有關suspend同步以及PM wakeup的話題。這個話題,是近幾年Linux kernel最具爭議的話題之一,在國外Linux開發論壇,經常可以看到圍繞該話題的辯論。辯論的時間跨度和空間

Linux電源管理(6)_Generic PM之Suspend功能

1. 前言 Linux核心提供了三種Suspend: Freeze、Standby和STR(Suspend to RAM),在使用者空間向”/sys/power/state”檔案分別寫入”freeze”、”standby”和”mem”,即可觸發它們。 核心中,Suspend及Resume過程

Linux電源管理(5)_Hibernate和Sleep功能介紹

1. 前言 Hibernate和Sleep兩個功能是Linux Generic PM的核心功能,它們的目的是類似的:暫停使用——>儲存上下文——>關閉系統以節電········>恢復系統——>恢復上下文——>繼續使用。 本文以核心向用戶空間提供的介面為突破口

Linux電源管理(4)_Power Management Interface

1. 前言 Linux電源管理中,相當多的部分是在處理Hibernate、Suspend、Runtime PM等功能。而這些功能都基於一套相似的邏輯,即“Power management interface”。該Interface的程式碼實現於“include/linux/pm.h”、“dri

Linux電源管理(3)_Generic PM之Reboot過程

1. 前言 在使用計算機的過程中,關機和重啟是最先學會的兩個操作。同樣,這兩個操作在Linux中也存在,稱作shutdown和restart。這就是本文要描述的物件。 在Linux Kernel中,主流的shutdown和restart都是通過“reboot”系統呼叫(具體可參考kern

Linux電源管理(2)_Generic PM之基本概念和軟體架構

1. 前言 這裡的Generic PM,是蝸蝸自己起的名字,指Linux系統中那些常規的電源管理手段,包括關機(Power off)、待機(Standby or Hibernate)、重啟(Reboot)等。這些手段是在嵌入式Linux普及之前的PC或者伺服器時代使用的。在那個電腦科學的蠻荒時

Linux電源管理(1)_整體架構

1. 前言 在這個世界中,任何系統的運轉都需要能量。如樹木依靠光能生長,如馬兒依靠食物奔跑,如計算機系統依靠電能執行。而能量的獲取是有成本的,因此如果能在保證系統運轉的基礎上,儘量節省對能量的消耗,就會大大提升該系統的生存競爭力。這方面,大自然已經做的很好了,如植物的落葉,如動物的冬眠,等等。

Linux電源管理(11)_Runtime PM之功能描述

1. 前言 終於可以寫Runtime PM(後面簡稱RPM)了,說實話,蝸蝸有點小激動。因為從個人的角度講,我很推崇使用RPM進行日常的動態電源管理,而不是suspend機制。 軟體工程的基本思想就是模組化:高內聚和低耦合。通俗地講呢,就是“各人自掃門前雪”,儘量掃好自己的(高內聚),儘

Linux電源管理(9)_wakelocks

1. 前言 wakelocks是一個有故事的功能。 wakelocks最初出現在Android為linux kernel打的一個補丁集上,該補丁集實現了一個名稱為“wakelocks”的系統呼叫,該系統呼叫允許呼叫者阻止系統進入低功耗模式(如idle、suspend等)。同時,該補丁集更