linux内核睡眠状态解析

1. 系统睡眠状态

  睡眠状态是整个系统的全局低功耗状态,在这种状态下,用户空间的代码不能被执行而且整个系统的活动明显被下降html

  1.1 被支持的睡眠状态 

      取决于所运行平台的能力和配置选项,Linux内核能支持四种系统睡眠状态,包括休眠和多达三种系统挂起的变量;,支持的睡眠状态以下:架构

 

      1.1.1 休眠到空闲状态(Suspend-to-Idle)

          这是一种普通、纯软件、轻量级的系统挂起变量(也被称为S2I或S2Idle)。与运行时空闲状态相比,经过中止用户空间程序的运行、暂停计时、将全部的输入输出设备设置为低功耗状态能下降更多能耗,系统在休眠状态下,处理器一直运行在深度空闲状态。ide

          系统被内部中断唤醒,所以理论上任何在工做状态下能产生中断的设备也能针对S2Idle状态被设置为唤醒设备。ui

          这种状态能被用在不支持待机或休眠到内存的平台上,它能被用在更深的系统休眠变种中以减小进入正常工做状态的延迟。spa

          这种状态在内核选项CONFIG_SUSPEND被设置的时候老是被支持。命令行

      1.1.2 待机状态(Standby)

          若是支持这种状态,提供适度的但确实下降了功耗的方式,同时提供一种相对简单的方式恢复到正常工做状态,所以系统很容易地回到原来中止执行的地方继续运行。code

          除了冻结用户空间、暂停计时和将全部输入输出设备置于低功耗状态(这些是在suspend to idle状态作的),未启动的cpu直接被置为脱机状态,而且在转换到此状态的过程当中全部的低级系统功能都被暂停。orm

          所以,这种状态相对suspend to idle状态能节省更多的电力,可是切换到正常工做状态的时间一般会更长。htm

          相比suspend to idle状态,能从这种状态唤醒系统的设备集就少了不少,可能须要依赖平台适当地设定唤醒功能blog

          若是内核选项CONFIG_SUSPEND被设定,那么这种状态就被支持,支持被带有核心系统suspend子系统的平台注册。

          在基于ACPI的系统中,这种状态被映射为由ACPI定义的S1系统状态

      1.1.3 挂起到内存(Suspend-to-RAM)

          若是支持这种状态(也被称为STR/S2RAM),它能明显节能,由于在系统中,除了内存(内存被置于自刷新模式来保持其中的内容),任何东西都被置于低功耗状态,进入待机状态被执行的全部操做在转换到这种状态下也一样被执行,可能会根据平台的能力来执行其余操做。

          特别的是,在基于ACPI的系统上,在S2RAM状态切换的过程当中,内核将控制权交给平台固件(BIOS)做为最后的一个步骤,一般致使关掉一些不被内核直接控制的更低级的组件。

          设备和cpu的状态被保存在内存中,全部的设备被挂起并置于低功耗状态,在许多场景下,在进入S2RAM时全部的外围总线掉电,所以设备必需具有处理回退到正常状态的能力。、

          在基于ACPI的系统上S2RAM要求在平台固件中有一些最小化启动代码来切换到正常工做状态。在其它平台也多是这种状况。

          比起前两种状态,能从S2RAM唤醒系统的设备集一般能节约更多的电力,而且可能须要依赖平台适当地设定唤醒功能。

          若是CONFIG_SUSPEND被配置,那么S2RAM就被支持,支持被带有核心系统suspend子系统注册。在基于ACPI的系统上,它被映射为由ACPI定义的S3系统状态。

      1.1.4 休眠(Hibernation)

          这种状态(也被称为Suspend-to-Disk/STD)提供最佳节能效果,甚至在不支持系统挂起的低级平台上也可使用。然而,它要求为底层cpu架构提供一些唤醒系统的低级代码

          休眠状态与任何系统挂起的变种都明显不同。它须要三种系统状态都改变的状况下才能将系统置于休眠状态,两种系统状态改变才能使系统恢复到正常运行状态。

          首先,当休眠被触发的时候,内核中止全部的系统活动而且建立一个内存快照写入磁盘。

          接下来,系统运行到快照镜像能被保存的状态下,镜像被写入,最后系统进入目标低功耗状态(除了一些唤醒设备,几乎全部硬件组件,包括内存都被断电)。

          一旦快照被写入,系统可能进入一种超低功耗状态(好比ACPI S4),也可能简单的将本身断电。断电意味着最小功耗,它容许这种机制工做在任何系统之上。然而进入超低功耗可能容许使用额外的系统唤醒方式(如:键盘上的按键或打开笔记本上盖)

          在唤醒以后,控制权交给运行一个启动引导器(启动一个全新的内核实例)的平台固件(控制权可能直接交给启动引导器,取决于系统配置,可是它都会建立一个将被启动的内核实例)。新的内核实例(也被称做恢复内核)寻找在磁盘中的休眠镜像,若是被找到,就将镜像加载到内存中

          接下来,在系统中的全部活动被中止,恢复内核以镜像的内容覆盖本身,而且跳转到存储在镜像中的原内核(也被称为镜像内核)所在的特殊蹦床区域,这是特殊架构相关的低级代码被提供的区域。

          最后镜像内核恢复系统到预休眠状态而且容许用户空间程序再次被运行

          若是CONFIG_HIBERNATION选项被使能,那么休眠功能就被支持。然而,这个选项只能在支持包括系统恢复的低级代码的指定cpu架构被设置。

2. 基本的系统挂起休眠sysfs接口

  下面位于/sys/power目录下的文件能被用在用户空间来对睡眠状态进行控制。

  2.1 state

这个文件包含一个表明被内核支持的睡眠状态的字符串列表。写字符串中的任何一个都会导致内核开始转换系统到由字符串所表明的睡眠状态,控制系统的睡眠状态。

特别是,字符串"disk","freeze" 和"standby"表示休眠,挂起到空闲和待。睡眠状态,个别的字符串“mem"被解释为根据下文提到的mem_sleep文件内容进行处理。

若是内核不支持任何系统睡眠状态,这个文件不会显示。

  2.2 mem_sleep
   这个文件包含一个表示支持系统挂起变量的字符串列表,而且容许用户空间选择与”mem"相关的变量,控制系统挂起的操做模式。

这个字符串可能在这个文件中显示为"s2idle","shallow"和“deep"。字符串"s2idle"老是表明挂起到空闲,而且按照惯例,”shallow"和"deep"表明待机和挂起到内存。

将列出来的字符串中的其中一个写到这个文件都会导致由它表明的系统挂起变量与state文件中的“mem"字符串相关联。表明当前与在state文件中的”mem“字符串相关联的挂起变量被列在方框里。

  2.3 disk
   这个文件包含一个表明不一样操做的字符串列表,在休眠镜像被保存以后这些操做被执行,控制系统挂起到磁盘的操做模式。可能的选项以下:
   2.3.1  platform
      把系统置于超低功耗状态(如ACPI S4),使额外的唤醒选项可用,而且可能容许在唤醒以后平台固件作一个简化的初始化。
    2.3.2 shutdown
      关掉系统。
   2.3.3 reboot
      重启系统。
   2.3.4 suspend 
      混合系统挂起。将系统置于由mem_sleep文件指定的挂起睡眠状态。若是系统成功被从那种状态唤醒,跳过休眠镜像并继续执行,不然使用镜像恢复以前系统的状态
   2.3.5 test_resume
      诊断操做。加载镜像,就像是系统刚被从休眠状态唤醒,当前运行的内核实例是一个恢复内核而且接着是完整系统的恢复。

写这些列出来的字符串中的一个将会导致相应的选项被选中。

当前选中的选项被显示在方框中,意味着由写”disk"到/sys/power/state触发的下一次休眠在建立和保存镜像以后由它指定的操做将被指定

若是内核不支持,这个文件不显示

3. 总结

  根据以上内容,由两种方式使系统进入挂起到空闲状态。第一个是直接写"freeze"到/sys/power/state。第二个是写“s2idle"到/sys/power/mem_sleep,而后写"mem"到/sys/mem/state。

  一样地,若是那种状态被平台支持,有两种方式使系统进入待机状态(在那种情形下,相应的写到控制文件中的字符串是"standby"或”shallow"和“mem")。

  然而,只有一种方式使系统进入挂起到内存状态(写"deep"到/sys/power/mem_sleep,而后写"mem" 到/sys/power/state)。

  默认的挂起变量(如:不写任何东西到/sys/pwer/mem_sleep)要么是”deep"(在大多数支持挂起到内存的系统上),要么是“s2idle”,可是它能经过在命令行指定“mem_sleep_default”参数而被覆盖。

  在一些基于ACPI的系统上,取决于ACPI表种的系统,即便挂起到内存被支持,默认也多是“s2idle"

 

 

4. 参考资料

  4.1

  4.2 这里 

相关文章
相关标签/搜索