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 这里
linux内核睡眠状态解析的更多相关文章
- 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 ...
- Linux 内核睡眠的几种方式
译至:http://geeki.wordpress.com/2010/10/30/ways-of-sleeping-in-linux-kernel/ 在Linux中睡眠有2-3种不同的方法. 睡眠的第 ...
- 【内核】探究linux内核,超详细解析子系统
Perface 前面已经写过一篇<嵌入式linux内核的五个子系统>,概括性比较强,也比较简略,现在对其进行补充说明. 仅留此笔记,待日后查看及补充! Linux内核的子系统 内核是操作系 ...
- 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 ...
- 20179223《Linux内核原理与解析》第六周学习笔记
视频知识学习 给MenuOS增加time和time-asm命令 1.更新menu代码到最新版 2.再main()函数中增加MenuConfig 3.增加对应的Time函数和TimeAsm函数(这里的函 ...
- 【内核】Linux内核Initrd机制解析,内核更新步骤,grub配置说明
什么是Initrd initrd的英文含义是 boot loader initialized RAM disk,就是由boot loader初始化的内存盘.在 linux内核启动前, boot loa ...
- linux 内核睡眠与唤醒
休眠(被阻塞)的进程处于一个特殊的不可执行状态.进程休眠由多种原因,但肯定都是为了等待一些事件.事件可能是一 段时间从文件I/O读取更多数据,或者是某个硬件事件.一个进程还由可能在尝试获取一个已被占用 ...
- linux内核input子系统解析【转】
转自:http://emb.hqyj.com/Column/Column289.htm 时间:2017-01-04作者:华清远见 Android.X windows.qt等众多应用对于linux系统中 ...
- linux内核驱动module_init解析(2)
本文转载自博客http://blog.csdn.net/u013216061/article/details/72511653 如果了解过Linux操作系统启动流程,那么当bootloader加载完k ...
随机推荐
- <转> Android LayoutInflater详解
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById().不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例 ...
- JAVA笔记整理(六),JAVA中的多态
JAVA引用变量有两个类型:一个是编译时类型,一个运行时类型 编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译时类型和运行时类型不一样,就形成了多态. 因为子类其 ...
- 解析CentOS 7中系统文件与目录管理
Linux目录结构 Linux目录结构是树形的目录结构 根目录 所有分区.目录.文件等的位置起点 整个树形目录结构中,使用独立的一个"/"表示 常见的子目录 目录 目录名称 目录 ...
- Scyther-Compromise 协议形式化安全分析如何改进协议
1.最终的目的是如何将协议的不安全因素进行改进,提升安全性能.对协议中有关的加密和认证的过程进行形式化分析验证的时候通过添加敌手模型的(DY模型和eCK强安全模型),接受者和发送者之间的通信过程可能存 ...
- mysql安装和遇到的问题处理
遇到需要在新系统上安装MySQL的事情,简单记录一下过程. 声明:最好的文档是官方文档,我也是看的官方文档,只是中间遇到点问题,记录一下出现的问题和处理方式.贴一些官方文档地址. 用tar包的安装方式 ...
- k8s的paas平台
高可靠设计,Etcd 集群,Kubernetes 三主节点,保证集群的高可用性. 基于 GlusterFS /nfs集群,在生产环境和非生产环境下提供存储卷服务. Flannel+VXLAN,提供可靠 ...
- re模块及其用法
一.re模块下的常用方法 首先在使用re模块之前,需要引入re模块 import re 1.与查找相关的: 1.findall 返回列表,找到所有的匹配项 ret = re.findall(" ...
- 使用poi导出固定excel的模板,出现汉字不能自动设置行宽
因为在工作中,可能因为不同的原因遇到不同的问题,本人就分享遇到的一个大坑 因为我要将数据库中的一部分字段的名称作为Excel中的列名,所以需要导出汉字,然后在对应的汉字下面填充数据. 正是因为这部分汉 ...
- canvas圆形进度条(逆时针)
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- 【bzoj3238】差异 后缀树
题目大意:给你一个字符串$S$,设$S_i$是串$S$第$i$长的后缀,求: $\sum\limits_{i=1}^{|S|} \sum\limits_{j=i+1}^{|S|} |S_i|+|S_j ...