linux suspend的基本流程,最简单的流程分析

首先我们说下linux的几种状态,完全就是简单的看了下Document下的文档

 

内核支持三种电源管理的状态,每一种的底层详细状态都依赖于板机代码的实现。本文件主要描述每种状态。什么情况下被调用,对应于那些acpi的状态和写什么样的字符到/sys/power/state进入相应的状态

 

State: Standby/Power-OnSuspend

ACPIState: S1

String: “standby”

 

该状态提供了一种很小功耗。没有丢失任何东西,如果需要,系统将会在极短的时间里启动

 

State:Suspend-to-RAM

ACPIState: S3

String:mem

这种情况给系统进入低功耗状态提供了一种极好的方案,除了memory还在不断的自刷新

而系统和外设的状态还被保存在memory中,所有的设备都被挂起并进入了D

3的状态。在一些案例中,当进入STR时,所有的的外设总线都掉电了,所以所有的外设都必须能够自己回到on状态

 

从S3回到on状态需要3-5秒

 

State: Suspned-to-disk

ACPIState: S4

String:“disk”

这种状态是最省功耗的了,都写入硬盘了阿

 

然后呢,我们知道了有这些状态,还是写入了/sys/power/state下的节点,那么可知,它是一个sys接口,然后呢,底层肯定实现了store和show的函数,找阿找,路径位linuxsrc/kernel/power/main.c

 

show函数就不用说了

 

constchar *const pm_states[PM_SUSPEND_MAX] = {

[PM_SUSPEND_STANDBY] = "standby",

[PM_SUSPEND_MEM] = "mem",

};

 

staticssize_t state_show(struct kobject *kobj, struct kobj_attribute*attr,

char*buf)

{

char*s = buf;

#ifdefCONFIG_SUSPEND

inti;

 

for(i = 0; i < PM_SUSPEND_MAX; i++) {//打印linux支持的系统状态pm_state

if(pm_states[i] && valid_state(i))

s+= sprintf(s,"%s ", pm_states[i]);

}

#endif

#ifdefCONFIG_HIBERNATION//如果支持最牛笔的方式把,还可以支持挂起到硬盘

s+= sprintf(s, "%s\n", "disk");

#else

if(s != buf)

/*convert the last space to a newline */

*(s-1)= '\n';

#endif

return(s - buf);

}

 

show函数还是比较简单的就是打印下支持的状态,那么接下来就是重点了,state_store,以前我很纠结为什么手机会在关屏之后休眠阿,凭什么阿,后来听了各位老大的指导,才知道一定是主动出发的阿,那么是怎么出发的阿,肯定是灭屏的时候出发的阿。。不管是power键出发灭屏,还是时间到了灭屏只要屏幕灭了就刮起呗,现在看来就是调用的state_store

 

staticssize_t state_store(struct kobject *kobj, struct kobj_attribute*attr,

constchar *buf, size_t n)

{

#ifdefCONFIG_SUSPEND

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值