欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

【原创】Linux Suspend流程分析

程序员文章站 2022-12-21 11:33:48
背景 By 鲁迅 By 高尔基 说明: 1. Kernel版本:4.14 2. ARM64处理器 3. 使用工具:Source Insight 3.5, Visio 1. 介绍 Linux Kernel支持四种 : 纯软件,轻量级的Suspend操作,它会 ,`suspend the timekee ......

背景

  • 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。由于系统核心逻辑单元保持上电状态,操作的状态不会丢失,也会很容易恢复到之前的状态。
    处于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
【原创】Linux 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是通过主动调用函数触发的;

具体还是看图吧:
【原创】Linux Suspend流程分析

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