背景
Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器
- 使用工具:Source Insight 3.5, Visio
1. 介绍
Linux Kernel支持四种Sleep State
:
Suspend-to-Idle
纯软件,轻量级的Suspend操作,它会freeze user space
,suspend the timekeeping
,put all I/O devices into low-power states
。
处于S2Idle状态下时,设备中断就可以将其唤醒。Standby
除了实现Suspend-to-Idle
时的操作外,还会将nonboot CPUs
置于offline
状态,以及suspend all low-level system functions
。由于系统核心逻辑单元保持上电状态,操作的状态不会丢失,也会很容易恢复到之前的状态。
处于Standby
状态时,可能需要依赖平台来设置唤醒源。Suspend-to-RAM
STR/S2RAM
时,除了Memory
需要进行自刷新来保持数据外,其他的所有设备都需要进入到低功耗状态。除了实现Standby
中的操作外,还有一些平台相关的操作要进行。比如,在STR的最后一步,将控制权交给Firmware
,然后下电,等着唤醒时再重新Resume回来。由于存在掉电行为,因此Resume的时候需要重新进行配置。
处于STR
状态时,需要依赖平台设置唤醒源。
本文主要分析的流程就是STR
。Hibernation
Suspend-to-Disk, STD
,简而言之,这个操作会将运行时的context保存在Disk这种非易失的存储器中,然后进行掉电操作。当按下电源键进行唤醒时,Firmware/Uboot会将保存的context进行恢复。
上述四个状态,功耗节省效果依次增强,同时唤醒回来的时间开销也相应加大。
2. 流程
通过/sys
接口可以触发Suspend流程:
cat /sys/power/state
:查看支持的操作,比如:freeze
,mem
;echo mem > /sys/power/state
:进行STR
操作;echo freeze > /sys/power/state
:进行S2Idle
操作;
代码路径:
kernel/power/main.c
kernel/power/suspend.c
STR
流程如下图,入口函数为pm_suspend
:
简而言之,这是一张信息量很大的图片,涵盖了Suspend To Ram
的整个流程。
图片中,从上到下涉及到进程的freeze,各种设备驱动的Suspend,平台的Suspend,CPU的Offline操作,syscore的Suspend操作。其中涉及到CPU的操作时,在ARMv8中,会通过PSCI
接口调用到ARM Trusted Firmware, ATF
,这个在【原创】Linux PSCI框架探讨过。
多说无益,看图吧。
3. process freeze
Suspend
过程中,有一个函数suspend_freeze_processes
引起了我的好奇心,我刻意分析了下。在Suspend
的时候是需要将用户进程和内核线程freeze
掉,避免它们来捣乱,比如你在Suspend
某个驱动的时候,此时用户还在使用该驱动的资源,这时候可能就会引起问题了。不过,内核线程并不是所有的都能freeze
掉。
记住两个知识点:
- 用户线程的
freeze
是通过发送信号来触发执行的; - 内核线程的
freeze
是通过主动调用函数触发的;
具体还是看图吧:
进程的操作比较复杂,以后在研究进程管理的时候再分析。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。