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 这里

linux内核睡眠状态解析的更多相关文章

  1. Linux内核:sk_buff解析

    sk_buff 目录 1 sk_buff介绍 2 sk_buff组成 3 struct sk_buff 结构体 4 sk_buff成员变量 4.1 Layout布局 4.2 General通用 4.3 ...

  2. Linux 内核睡眠的几种方式

    译至:http://geeki.wordpress.com/2010/10/30/ways-of-sleeping-in-linux-kernel/ 在Linux中睡眠有2-3种不同的方法. 睡眠的第 ...

  3. 【内核】探究linux内核,超详细解析子系统

    Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...

  4. linux内核启动参数解析及添加

    1.环境: ubuntu16.04 Linux jello 4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x ...

  5. 20179223《Linux内核原理与解析》第六周学习笔记

    视频知识学习 给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.再main()函数中增加MenuConfig 3.增加对应的Time函数和TimeAsm函数(这里的函 ...

  6. 【内核】Linux内核Initrd机制解析,内核更新步骤,grub配置说明

    什么是Initrd initrd的英文含义是 boot loader initialized RAM disk,就是由boot loader初始化的内存盘.在 linux内核启动前, boot loa ...

  7. linux 内核睡眠与唤醒

    休眠(被阻塞)的进程处于一个特殊的不可执行状态.进程休眠由多种原因,但肯定都是为了等待一些事件.事件可能是一 段时间从文件I/O读取更多数据,或者是某个硬件事件.一个进程还由可能在尝试获取一个已被占用 ...

  8. linux内核input子系统解析【转】

    转自:http://emb.hqyj.com/Column/Column289.htm 时间:2017-01-04作者:华清远见 Android.X windows.qt等众多应用对于linux系统中 ...

  9. linux内核驱动module_init解析(2)

    本文转载自博客http://blog.csdn.net/u013216061/article/details/72511653 如果了解过Linux操作系统启动流程,那么当bootloader加载完k ...

随机推荐

  1. layui 后台分页

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Innodb关键特性之自适用Hash索引

    一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的 ...

  3. Eclipse启动tomcat超时

    启动tomcat 超时 Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the ser ...

  4. linux fstab下挂载错误导致cannot open access to console, the root account is locked的问题

    用 deepin 安装 u 盘启动,出现选择安装语言的界面时,按 ctrl+alt+T,进入 tty,然后输入 startx,进入 live cd 模式,挂载硬盘的根分区,然后修改 /etc/fsta ...

  5. Spring Boot起步依赖:定制starter

    在定制我们自己的起步依赖--xxx.spring.boot.starter之前,我们先了解下什么是Spring Boot起步依赖. 起步依赖,是Spring Boot带给我们的一项重要的便利.要理解S ...

  6. 你应该知道的16个linux命令

    Linux常用命令很多比如cd.ls.pwd.du.df.tail.head.yum.mv.touch.mkdir.cp.tar等,根据工作内容不同,经常使用的命令也不同,比如运维人员使用tail.h ...

  7. selenium之python源码解读-expected_conditions

    一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...

  8. HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9

    /* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...

  9. elment-ui的validate

    https://blog.csdn.net/qq469234155/article/details/84034816 validate()时elment-ui封装好的用于对整个表单进行验证valida ...

  10. linux系列(十四):head命令

    1.命令格式: head [参数] [文件] 2.命令功能: head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行. 3.命令参数: -q 隐藏文件名 -v 显示文件名 ...