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 ...
随机推荐
- NSIP
1. 第一章 信息安全概述 信息:信息是有意义的数据,具有一定的价值,是一种适当保护的资产,数据是是客观事务属性的记录,是信息的具体表现形式,数据经过加工处理之后 就是信息,而信息需要经过数字处理转换 ...
- 算法笔试过程中的几个输入输出python语句
title: python在线笔试学习笔记 localimage: image1 urlname: writenexam categories: summary tags: [writen, exam ...
- 解决MySQL不需要密码就能登录问题
因为执行了一个更改数据库root用户密码的命令,当我更改完后,发现用我新密码和旧密码都能登陆,于是感觉没有输密码,直接回车就能登录,而我在配置中也没有进行免密码登陆的操作,最后,执行了一条命令解决up ...
- 跨域访问支持(Spring Boot、Nginx、浏览器)
原文:http://www.itmuch.com/work/cors/ 最近家中事多,好久没有写点啥了.一时间竟然不知从何说起.先说下最近家里发生的事情吧: 老爸肺气肿住院: 老妈甲状腺囊肿 儿子喘息 ...
- django-haystack 安装No local packages or working download links found for setuptools_scm
在虚拟环境中安装drf-haystack时,pip报错 Liang-2:~ langying$ pip install django-haystack Collecting django-haysta ...
- [NOI2008]假面舞会 (搜索+gcd)
题意 LuoguP1477 题解 对于每一条边(u,v)(u,v)(u,v),建两条边(u→v,1),(v→u,−1)(u\to v,1),(v\to u,-1)(u→v,1),(v→u,−1).跑b ...
- hbase的region
一.Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成.对象层级图如下: Table (HBase table) Region (Regions for the ...
- Linux core dump 诊断进程奔溃退出
最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了coredump技术以找到崩溃原因,即确定进程退出时正在执行的函数是哪个,其状态如何. 如果系统开启了core ...
- ckeditor复制粘贴word
从word文档中直接粘贴到ckeditor编辑区,查看的时候格式会显示混乱,非常难看.解决方法: CKEDITOR.cleanWord = function(h, i) { return h; i ...
- BZOJ 1576 树剖+LCT
题意:给定一张图,保证 $1$ 号点到其他所有点的最短路径是唯一的,求:对于点 $i$,不经过 $1$ 到 $i$ 最短路径上最后一条边的最短路. 题解:可以先建出最短路树,然后枚举每一条非树边. 对 ...