zoukankan      html  css  js  c++  java
  • Linux Suspend流程分析【转】

    转自:https://www.cnblogs.com/LoyenWang/p/11372679.html

    背景

    • 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:查看支持的操作,比如:freezemem
    • 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是通过主动调用函数触发的;

    具体还是看图吧:

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

    作者:LoyenWang
    出处:https://www.cnblogs.com/LoyenWang/
    公众号:LoyenWang
    版权:本文版权归作者和博客园共有
    转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
  • 相关阅读:
    rCore-Tutorial-Book-v3学习笔记(五)
    rCore-Tutorial-Book-v3学习笔记(四)
    rCore-Tutorial-Book-v3学习笔记(三)
    rCore-Tutorial-Book-v3学习笔记(二)
    rCore-Tutorial-Book-v3学习笔记(一)
    OpenStack 命令行速查表(转载)
    mysql数据库总结笔记
    Owncloud迁移上云案例
    Python
    高等数学(微积分)
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/12524814.html
Copyright © 2011-2022 走看看