当前位置: 首页 > news >正文

linux的睡眠框架及实现

睡眠 4 种模式:

  • S2I (Suspend-to-Idle): 挂起系统,IO进入低功耗模式。需配置CONFIG_SUSPEND。

  • Standby:执行S2I后,把AP (nonboot CPU) 离线。除了CONFIG_SUSPEND的支持外,还需要向suspend子系统注册,如果是基于ACPI的系统,需要映射到S1状态。

  • S2RAM(Suspend-to-RAM):又称为STR,系统状态保存到内存,所有的外围设备,总线都进入低功耗或者断电的状态,内核在最后一步会把控制权给到BIOS,并映射到S3状态(ACPI系统)。除了CONFIG_SUSPEND的支持外,还需要向suspend子系统注册。

  • Hibernation(Suspend-to-Disk or STD) : 创建当前系统的内存镜像(内核和应用进程),保存到硬盘,然后,系统断电或者进入低功耗模式。唤醒时,bios启动一个新的内核(恢复内核)加载内存镜像,新内核自我更新,恢复先前的内核和进程状态。需要CONFIG_HIBERNATION的支持。

sys 接口

/sys/power/state (kernel/power/main.c)

  • state_show: 对应的read函数。

  • state_store:对应的write函数。

stat_show( )显示系统可用到睡眠模式,pm_states_init( ) 会初始化状态,其中S2I和 S2RAM是默认支持的,Standby 和 Hibernation 则需要进行检测硬件平台是否系统支持,不支持的话,就不会显示出来,显示值依次是:freeze,standby,mem,disk.

sys接口是功能的入口,从 stat_store( ) 里可以看到待机和休眠的入口函数分别是:

  • pm_suspend(state)

  • hibernate()

待机(SUSPEND)

入口:int pm_suspend(suspend_state_t state),有效参数是:

  • #define PM_SUSPEND_TO_IDLE ((__force suspend_state_t) 1)

  • #define PM_SUSPEND_STANDBY ((__force suspend_state_t) 2)

  • #define PM_SUSPEND_MEM ((__force suspend_state_t) 3)

待机可以分为3个阶段:

1: 准备阶段

主要是冻结应用程序和内核线程,外设进入睡眠状态。这个是公共部分,所有的suspend状态都要执行。

下图时一个基本的流程框架。

(suspend的流程框架图)

冻结程序

修改用户进程状态为 PF_FROZEN,使任务并进入__refrigerator( )里的一个循环,直到被唤醒——称之为 freeze。内核线程也是类似的情况,它进入另外的循环。freeze不是强制的,创建时可以配置为不可冻结。

冻结程序和内核线程的主要原因是:防止休眠时文件系统因为读写而损坏;防止驱动读写一个已经挂起的设备;等等(详见freezing-of-tasks.rst)。打开refrigerator( )里日志可以看到如下消息:

    Freezing user space processes ... systemd entered refrigeratorgdbus entered refrigeratoremacs entered refrigeratorbash entered refrigerator

当前系统所有的应用程序都被冻结了,系统唤醒后,各任务退出循环,继续运行。

设备待机

主要是在DPM(device power manager,base/power/main.c)模块的 dpm_suspend( )中实现,轮询 dpm设备list,依次调用 device_suspend(dev) 来 callback每个设备注册的suspend( ). 以pci设备为例:

    struct bus_type pci_bus_typs = { .pm        = PCI_PM_OPS_PTR,}struct dev_pm_ops pci_dev_pm_ops = {.suspend = pci_pm_suspend, ...}

因此,每个pci设备都是先callback pci_pm_suspend( ),在这个函数里再callback各个设备的 pm->suspend(dev) 。

dpm list是通过 device_add( ) --> device_pm_add( ) 来生成的,也就是添加设备时,进行检测,支持PM管理的设备会被放入 dmp list,当执行suspend时,轮询该列表依次callback各个设备注册的 suspend函数。

2: 进入待机

这个阶段主要时执行底层函数,进入待机状态,具体实现同CPU架构相关。

入口是 suspend_enter( ),先检测pm状态,如果是S2I,则走s2idle_loop( ),不需要待机。否则走 syscore_suspend( ),先轮询syscore_ops_list,执行每个对象的suspend( ), 最后,调用平台相关的suspend_ops->enter(state),执行cpu模块的底层函数,写数据到bios后,系统由bios接管,进入待机状态。

syscore_ops_list 通过register_syscore_ops( )(drivers/base/syscore.c)来注册,一般在同cpu架构相关的代码里面。suspend_ops是通过suspend_set_ops( )来注册的,以龙芯mips为例:

suspend_set_ops(&loongson_pm_ops);
suspend_ops->enter -->loongson_pm_enter
-->mach_suspend: (arch/mips/loongson64/loongson-3/pm.c)-->保存一些寄存器
-->loongson_suspend_enter: (arch/mips/loongson64/loongson-3/sleep.S)写数据到bios后待机,系统在当前位置挂机,bios开始接管系统。

3: 恢复

待机后,系统就挂在当前的执行位置,当用户唤醒(按电源键或者键盘)系统时,bios先恢复CPU,然后CPU从当前位置开始唤醒系统,唤醒刚好是一个相反的过程,先从架构相关的底层开始,逐级唤醒系统,主要的代码流程是在 suspend_enter( )的后半段,也是从suspend_ops->enter( ) 开始,这个函数的退出,表示系统已开始唤醒,接着syscore_resume( ) -->... --> ahci_pci_device_resume ( ) ....;依次调用各模块的 resume( ) callback。

休眠(Hibernation)

入口是 hibernate( ) kernel/power/hibernate.c,主要的工作流程都在这个函数里面。

休眠的3种模式

cat /sys/power/disk 可以看到休眠支持的3种模式:

  • 'platform': 检测是否有平台支持(ACPI等),进入平台的待机模式。

  • 'shutdown':关机。

  • 'reboot': 重启,功能测试用。

工作流程

  • freeze_processes

  • freeze_kernel_threads()

  • dpm_suspend(PMSG_FREEZE)

  • create_image(platform_mode)

  • dpm_resume(msg)

  • swsusp_write(flags)

  • power_down( )

上面的函数流已经可以自解释了,先是冻结用户进程和内核线程,接着设备也进入待机,已防后面创建镜像时出现bug,镜像创建后,恢复设备,为关机做准备。最后的步骤是镜像写入交换分区,然后关机。

恢复的入口函数是:software_resume( ),加载内存镜像后,内核自我更新状态,恢复先前的状态。

ACPI

ACPI在睡眠框架里不是必选项,不是所有的架构都支持ACPI。它的入口是acpi_sleep_init( ) (drivers/acpi/sleep.c),主要是3个初始化函数:

  • acpi_sleep_syscore_init();

  • acpi_sleep_suspend_setup();

  • acpi_sleep_hibernate_setup();

分别注册对应级别的callback,当系统睡眠时,它会callback ACPI中相关的函数,与bios进行通讯,完成对应的睡眠功能。

参考资料

Documentation/admin-guide/pm/sleep-status.rst

Documentation/power/freezing-of-tasks.rst

相关文章:

linux的睡眠框架及实现

睡眠 4 种模式:S2I (Suspend-to-Idle): 挂起系统,IO进入低功耗模式。需配置CONFIG_SUSPEND。Standby:执行S2I后,把AP (nonboot CPU) 离线。除了CONFIG_SUSPEND的支持外,还需要向suspend子系统注册&#xff…...

Java面试知识点

工作也有好些年了,从刚毕业到前几年看过无数的面试题,总想着自己写一个面试总结,随着自我认识的变化,一些知识点的理解也越来越不一样了。写下来温故而知新。很多问题可能别人也总结过,但是答案不尽相同,如…...

PTA Advanced 1159 Structure of a Binary Tree C++

目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, a binary tree can be un…...

CDN绕过技术总汇

注 本文首发于合天网安实验室 首发链接:https://mp.weixin.qq.com/s/9oeUpFUZ_0FUu6YAhQGuAg 近日HVV培训以及面试,有人问了CDN该如何绕过找到目标真实IP,这向来是个老生常谈的问题,而且网上大多都有,但是有些不够全面…...

算法训练营DAY51|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

本期是求子序列的新的一期,题目前两道有一些相似之处,思路差不多,第三道有一点难度,但并不意味着第一道没有难度,没有做过该类型题的选手,并不容易解出题解。 300. 最长递增子序列 - 力扣(Leet…...

mac:彻底解决-安装应用后提示:无法打开“XXX”,因为无法验证开发者的问题;无法验证此App不包含恶意软件

mac从浏览器或其他电脑接收了应用,但是打开报错 目录报错解决办法一次性方法永久解决方法验证恢复应用验证报错 截图如下: 错误信息 无法打开“XXX”,因为无法验证开发者的问题;无法验证此App不包含恶意软件 解决办法 一次性方…...

CPU 指标 user/idle/system 说明

从图中看出,一共有五个关于CPU的指标。分别如下: User User表示:CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shells、数据库、web服务器…… Nice N…...

Thinkphp大型进销存ERP源码/ 进销存APP源码/小程序ERP系统/含VUE源码支持二次开发

框架:ThinkPHP5.0.24 uniapp 包含:服务端php全套开源源码,uniapp前端全套开源源码(可发布H5/android/iod/微信小程序/抖音小程序/支付宝/百度小程序) 注:这个是全开源,随便你怎么开,怎么来&a…...

hgame2023 WebMisc

文章目录Webweek1Classic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyWeek2Git Leakagev2boardSearch CommodityDesignerweek3Login To Get My GiftPing To The HostGopher Shopweek4Shared DiaryTell MeMiscweek1Where am I神秘的海报week2Tetris Master…...

67. Python的绝对路径

67. Python的绝对路径 文章目录67. Python的绝对路径1. 准备工作2. 路径3. 绝对路径3.1 概念3.2 查看绝对路径的方法4. 课堂练习5. 用绝对路径读取txt文件6. 加\改写绝对路径6.1 转义字符知识回顾6.2 转义字符改写7. 总结1. 准备工作 对照下图,新建文件夹和txt文件…...

VHDL语言基础-组合逻辑电路-加法器

目录 加法器的设计: 半加器: 全加器: 加法器的模块化: 四位串行进位全加器的设计: 四位并行进位全加器: 串行进位与并行进位加法器性能比较: 8位加法器的实现: 加法器的设计&…...

内存检测工具Dr.Memory在Windows上的使用

之前在https://blog.csdn.net/fengbingchun/article/details/51626705 中介绍过Dr.Memory,那时在Windows上还不支持x64,最新的版本对x64已有了支持,这里再总结下。 Dr.Memory源码地址https://github.com/DynamoRIO/drmemory,最新发…...

J6412四网口迷你主机折腾虚拟机教程

今天给大家做一个四网口迷你主机折腾虚拟机的安装教程,主机采用的是maxtang大唐NUC J6412 intel i226V四网口的迷你主机,这款主机它是不能直接装上NAS的,必须使用虚拟机系统,近期研究了下然后做了一个教程分享给大家。 首先需要做…...

电子招标采购系统—企业战略布局下的采购寻源

​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#xff…...

elasticsearch 之 mapping 映射

当我们往 es 中插入数据时,若索引不存在则会自动创建,mapping 使用默认的;但是有时默认的映射关系不能满足我们的要求,我们可以自定义 mapping 映射关系。 mapping 即索引结构,可以看做是数据库中的表结构&#xff0c…...

2023年rabbitMq面试题汇总2(5道)

一、如何确保消息接收⽅消费了消息?接收⽅消息确认机制:消费者接收每⼀条消息后都必须进⾏确认(消息接收和消息确认是两个不同操作)。只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。这⾥并没有⽤到超时…...

电视剧《狂飙》数据分析,正片有效播放市场占有率达65.7%

哈喽大家好,春节已经过去了,朋友们也都陆陆续续开工了,小编在这里祝大家开工大吉!春节期间,一大批电视剧和网剧上映播出,其中电视剧《狂飙》以不可阻挡之势成功成为“开年剧王”。这里小编整理了一些《狂飙…...

cas单点登录后重定向次数过多问题以及调试cas-dot-net-client

问题描述: web项目应用cas作为单点登录站点,登录后无法打开WEB项目的页面,报错,说重定向次数过多。 老实说,这种问题,以前遇到过不少,是我这种半桶水程序员的噩梦。解决这种问题,不…...

【监控】Prometheus(普罗米修斯)监控概述

文章目录一、监控系统概论二、基础资源监控2.1、网络监控2.2、存储监控2.3、服务器监控2.4、中间件监控2.5、应用程序监控(APM)三、Prometheus 简介3.1、什么是 Prometheus3.2、优点3.3、组件3.4、架构3.5、适用于什么场景3.6、不适合什么场景四、数据模…...

opencv+python物体检测【03-模仿学习】

仿照练习:原文链接 步骤一:准备图片 正样本集:正样本集为包含“识别物体”的灰度图,一般大于等于2000张,尺寸不能太大,尺寸太大会导致训练时间过长。 负样本集:负样本集为不含“识别物体”的…...

docker详细操作--未完待续

docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...