linux内核睡眠状态解析

1. 系统睡眠状态

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

  1.1 被支持的睡眠状态 

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

 

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

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

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

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

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

      1.1.2 待机状态(Standby)

          如果支持这种状态,提供适度的但确实降低了功耗的方式,同时提供一种相对简单的方式恢复到正常工作状态,因此系统很容易地回到原来停止执行的地方继续运行。

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

          因此,这种状态相对suspend to idle状态能节省更多的电力,但是切换到正常工作状态的时间通常会更长。

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

          如果内核选项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 这里 

posted @ 2019-08-08 19:35  Jello  阅读(4800)  评论(0编辑  收藏  举报