0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux是休眠/唤醒的步骤解析

454398 来源:博客园 作者:Shimejing 2020-10-08 09:52 次阅读

Linux中,休眠主要分三个主要的步骤:(1)冻结用户态进程和内核态任务;(2)调用注册的设备的suspend的回调函数;(3)按照注册顺序休眠核心设备和使CPU进入休眠态。 冻结进程是内核把进程列表中所有的进程的状态都设置为停止,并且保存下所有进程的上下文。当这些进程被解冻的时候,他们是不知道自己被冻结过的,只是简单的继续执行。如何让Linux进入休眠呢?用户可以通过读写sys文件/sys /power/state 是实现控制系统进入休眠。比如: # echo standby 》 /sys/power/state命令系统进入休眠。也可以使用 # cat /sys/power/state来得到内核支持哪几种休眠方式。

Linux Suspend 的流程。相关的文件的路径: linux_soruce/kernel/power/main.c linux_source/kernel/arch/xxx/mach-xxx/pm.c

linux_source/driver/base/power/main.c

(1)接下来让我们详细的看一下Linux是怎么休眠/唤醒的。

用户对于/sys/power/state 的读写会调用到 main.c中的state_store(),用户可以写入 const char * const pm_state[] 中定义的字符串,比如“mem”、 “standby”。然后state_store()会调用enter_state(),它首先会检查一些状态参数,然后同步文件系统。

(2)准备冻结进程。

当进入到suspend_prepare()中以后,它会给suspend分配一个虚拟终端来输出信息,然后广播一个系统要进入suspend的Notify,关闭掉用户态的helper进程,然后一次调用suspend_freeze_processes()冻结所有的进程,这里会保存所有进程 当前的状态,也许有一些进程会拒绝进入冻结状态,当有这样的进程存在的时候,会导致冻结失败,此函数就会放弃冻结进程,并且解冻刚才冻结的所有进程。

(3)让外设进入休眠。

现在,所有的进程(也包括workqueue/kthread) 都已经停止了,内核态任务有可能在停止的时候握有一些信号量,所以如果这时候在外设里面去解锁这个信号量有可能会发生死锁,所以在外设的suspend()函数里面作lock/unlock锁要非常小心,这里建议设计的时候就不要在suspend()里面等待锁。 最后会调用suspend_devices_and_enter()来把所有的外设休眠,在这个函数中,如果平台注册了suspend_pos(通常是在板级定义中定义和注册),这里就会调用suspend_ops-》begin(),然后driver/base/power/main.c 中的 device_suspend()-》dpm_suspend() 会被调用,他们会依次调用驱动的suspend() 回调来休眠掉所有的设备。当所有的设备休眠以后,suspend_ops-》prepare()会被调用,这个函数通常会作一些准备工作来让板机进入休眠。接下来Linux,在多核的CPU中的非启动CPU会被关掉,通过注释看到是避免这些其他的CPU造成race condion,接下来的以后只有一个CPU在运行了。 suspend_ops 是板级的电源管理操作,通常注册在文件 arch/xxx/mach-xxx/pm.c 中。接下来,suspend_enter()会被调用,这个函数会关闭arch irq,调用 device_power_down(),它会调用suspend_late()函数,这个函数是系统真正进入休眠最后调用的函数,通常会在这个函数中作最后的检查。如果检查没问题,接下来休眠所有的系统设备和总线,并且调用 suspend_pos-》enter() 来使CPU进入省电状态。这时候,就已经休眠了,代码的执行也就停在这里了。

(4)Resume。

如果在休眠中系统被中断或者其他事件唤醒,接下来的代码就会开始执行,这个唤醒的顺序是和休眠的顺序相反的,所以系统设备和总线会首先唤醒,使能系统中断,使能休眠时候停止掉的非启动CPU,以及调用suspend_ops-》finish(),而且在suspend_devices_and_enter()函数中也会继续唤醒每个设备,使能虚拟终端。最后调用 suspend_ops-》end()。再返回到enter_state()函数中的,当suspend_devices_and_enter() 返回以后,外设已经唤醒了,但是进程和任务都还是冻结状态,这里会调用suspend_finish()来解冻这些进程和任务,而且发出Notify来表示系统已经从suspend状态退出,唤醒终端。到这里,所有的休眠和唤醒就已经完毕了,系统继续运行了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10859

    浏览量

    211706
  • Linux
    +关注

    关注

    87

    文章

    11302

    浏览量

    209431
  • 休眠
    +关注

    关注

    0

    文章

    5

    浏览量

    8444
  • 休眠唤醒
    +关注

    关注

    0

    文章

    8

    浏览量

    7555
收藏 人收藏

    评论

    相关推荐

    干货分享 | TSMaster—LIN 唤醒休眠机制

    在汽车总线中常见的唤醒方式有硬线唤醒、网络唤醒和特定信号唤醒,而LIN总线则是通过休眠帧与唤醒
    的头像 发表于 09-25 08:03 1675次阅读
    干货分享 | TSMaster—LIN <b class='flag-5'>唤醒</b>与<b class='flag-5'>休眠</b>机制

    STM32休眠不能唤醒的原因?

    休眠之后,会拉低相关的GPIO,确保省电;配置一些外部中断,用来唤醒停止模式;休眠前写入一个值到备份寄存器。 然后休眠休眠26秒后,看门狗
    发表于 05-13 08:47

    解析OMAPL138的休眠唤醒的过程!

    外设的PSC!现在不知道是什么原因!麻烦你们看一下这个问题! 或者有什么参考的例子! 可以详细的说一下OMAPL138的休眠唤醒的过程!谢谢了!
    发表于 08-22 12:51

    如何作休眠定时唤醒

    芯片休眠前,打开全局中断使能和定时器0中断使能,定时器0时钟源选择内部32768 WDT时钟,仅当内部WDT晶振打开时有效,芯片通过定时器0间断唤醒。这样休眠功耗较低,增加5uA左右。
    发表于 03-24 14:03

    Wi-Fi休眠唤醒失败的问题该如何去解决呢

    R18公板使用RTL8723ds模组,通过Wi-Fi ping的方式唤醒失败。Wi-Fi唤醒的一般测试步骤有哪些呢?Wi-Fi休眠唤醒失败的
    发表于 12-29 06:35

    CH582M freeRTOS如何实现休眠休眠后如何唤醒

    有以下以后望解答:如何实现休眠休眠后如何唤醒?目前尝试用裸机例程中的休眠函数,仅LowPower_Shutdown(0); 可以正常睡眠并且成功
    发表于 08-01 06:19

    lightsleep休眠不同唤醒方式的功耗问题求解

    我用arduino对esp32c3开发板进行编程测试lightsleep的休眠功耗,GPIO2口接红外,发现了一个问题,当我仅使用GPIO唤醒时,休眠后电流为5.16ma,仅使用Timer唤醒
    发表于 03-07 07:07

    基于S3C2440和WindowsCE5.0的平台休眠唤醒方案

    ]。Windows CE 作为一个广泛应用于嵌入式设备上的操作系统,提供了完善的电源管理功能。其中,休眠唤醒便是一个重要的功能。本文在结合S3C2440硬件基础上分析休眠唤醒过程,分别
    发表于 10-31 15:51 0次下载
    基于S3C2440和WindowsCE5.0的平台<b class='flag-5'>休眠</b><b class='flag-5'>唤醒</b>方案

    MSP430休眠唤醒装置设计详析

    针对矿用救灾指挥装置网络视频服务器采用电池供电工作时间短的缺点, 采用 MSP430 低功耗单片机设计了一种休眠唤醒装置, 实现了网络视频服务器的休眠唤醒功能, 延长了网络视频服务器电
    发表于 04-24 14:27 14次下载
    MSP430<b class='flag-5'>休眠</b><b class='flag-5'>唤醒</b>装置设计详析

    Linux Kernel suspend/resume 过程

    休眠/唤醒在嵌入式Linux中是非常重要的部分,嵌入式设备尽可能的进入休眠状 态来延长电池的续航时间.这篇文章就详细介绍一下Linux
    发表于 05-08 14:25 2192次阅读

    单片机休眠唤醒二三事

    想知道单片机休眠如何像吃了德芙一样丝滑么?想让你的单片机产品在合适的时候休眠待机不再失眠么?想让你的单片机项目随叫随醒不再怠惰长眠么?答案-关于单片机休眠唤醒的配置都在这里了
    发表于 12-20 19:00 24次下载
    单片机<b class='flag-5'>休眠</b>与<b class='flag-5'>唤醒</b>二三事

    LIN控制器休眠唤醒类型方式及测试案例

    虽然新架构的发展促进着通信威廉希尔官方网站 的升级换代,但作为车载通信威廉希尔官方网站 的常青树之一的LIN通信,由于其自身的特点,将会继续发光发热。其中LIN的休眠唤醒作为整车休眠唤醒的重要组成部分,需引起开发
    的头像 发表于 12-16 09:18 1884次阅读

    网络关闭但ECU没有休眠前如何进行网络唤醒呢?

    最近在做CAN网络管理的工作,发现网络休眠(关闭)后在ECU系统没有休眠/下电前如果又收到了NM报文,ECU的网络没有被重新唤醒(开启)
    的头像 发表于 03-29 09:06 3052次阅读

    ECU系统休眠后通过诊断报文唤醒ECU且唤醒网络

    ECU系统休眠后TJA1043的INH脚处于floating高阻态,系统休眠后通过硬件外部电路下拉到低电平状态/Low-level,ECU系统休眠前把TJA1043的INH脚配置为唤醒
    的头像 发表于 04-04 09:40 8663次阅读

    LIN休眠唤醒及测试心得

    这次我们的介绍主题是LIN休眠唤醒,一起看看标准和差异性,开发和测试的关系,实际的案例分享也来了。
    的头像 发表于 11-23 08:43 1203次阅读
    LIN<b class='flag-5'>休眠</b><b class='flag-5'>唤醒</b>及测试心得