Linux Suspend流程分析

背景

  • Read the fucking source code!  –By 鲁迅

  • A picture is worth a thousand words. –By 高尔基

说明:

  1. Kernel版本:4.14

  2. ARM64处理器

  3. 使用工具:Source Insight 3.5, Visio

1. 介绍

Linux Kernel支持四种Sleep State

  • Suspend-to-Idle纯软件,轻量级的Suspend操作,它会freeze user spacesuspend the timekeepingput all I/O devices into low-power states。处于S2Idle状态下时,设备中断就可以将其唤醒。

  • Standby除了实现Suspend-to-Idle时的操作外,还会将nonboot CPUs置于offline状态,以及suspend all low-level system functions。由于系统核心逻辑单元保持上电状态,操作的状态不会丢失,也会很容易恢复到之前的状态。处于Standy状态时,可能需要依赖平台来设置唤醒源。

  • Suspend-to-RAMSTR/S2RAM时,除了Memory需要进行自刷新来保持数据外,其他的所有设备都需要进入到低功耗状态。除了实现Standby中的操作外,还有一些平台相关的操作要进行。比如,在STR的最后一步,将控制权交给Firmware,然后下电,等着唤醒时再重新Resume回来。由于存在掉电行为,因此Resume的时候需要重新进行配置。处于STR状态时,需要依赖平台设置唤醒源。本文主要分析的流程就是STR

  • HibernationSuspend-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.ckernel/power/suspend.c

STR流程如下图,入口函数为pm_suspend

Linux Suspend流程分析

2.1 process freeze

Linux Suspend流程分析

进程的操作比较复杂,以后在研究进程管理的时候再分析。

Linux Suspend流程分析》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:https://www.hashtobe.com/784.html