一文搞懂Linux电源管理(合集)

1, 介绍

万物运行遵循能量守恒定律,因此,世界上并不存在永动机,一切运动都需要能量。人走路、思考需要能量,汽车在路上跑需要能量,电子产品运行需要能量。另外,能量并不是取之不尽用之不竭的。动物进化出了冬眠,为的就是在天寒地冻,缺乏食物的冬天能够安全地度过。汽车长时间停车,就要熄火,为的就是节省燃料。电子产品在不使用的时候,就要关机或待机,为的就是省电。

对于电子产品的功耗管理是一个系统工程,需要在各使用场景下,用尽可能少的资源、功耗,完成想要的功能,并且还要长续航、不发烫。对于像手机这样的电子产品,为了续航,从供能的角度需要加大电池的电量,但是电池的电量增加,又不想增加体积。因此人们通过各种办法提升能量密度,这样电池可以做的更小,电量更大。不过随着手机支持的屏幕更大,功能更丰富,需要DSP、CNN等算力单元做加速,这也需要更多的功耗。高功耗一方面减少了续航;另一方面,也会带来很大的热量,导致手机这样的一个结构、材质、体积的电子产品会发热严重,甚至烫手。

为了解决不必要功耗的消耗,linux提供了多种电源管理方式。为了解决系统不工作时的功耗消耗,linux提供了休眠(suspend to ram or disk)、关机(power off)、复位(reboot)。为了解决运行时不必要的功耗消耗,linux提供了runtime pm、cpu/device dvfs、cpu hotplug、cpu idle、clock gate、power gate、reset等电源管理的机制。为了解决运行时电源管理对性能的影响,linux提供了pm qos的功能和投票机制,用于平衡性能与功耗,这样既能降低功耗,又不影响性能。

2, 框架

linux功耗管理框架

功耗管理不仅是软件的逻辑,还需要硬件功能的支撑。硬件设计决定了功耗的下限,热设计决定了功耗的上限,而软件就是通过一些机制及策略将功耗尽可能逼近硬件功耗下限。

芯片上支持的低功耗机制:power domain、reset、clock、系统休眠/唤醒、cpu的低功耗、ddr自刷新等。系统一般是通过pmic芯片控制供应给各个器件电压、电流大小及有无。外设也支持低功耗模式,或者它们的供电能被开、关。

芯片、电源芯片、系统外设之上便是各个硬件低功耗功能对应的管理框架:

  • Clock framework:时钟管理框架(可参考文章《一文搞懂linux clock子系统 - 知乎 (zhihu.com)》)统一管理系统的时钟资源,这些时钟资源包括pll/mux/div/gate等,对时钟资源操作做封装,维护成一个时钟树,抽象频率获取、频率设置、时钟开关等核心逻辑,为其他驱动子模块提供频率调整、频率查询、使能、失能等接口;
  • Regulator framework:电压管理框架(可参考文章《一文搞懂linux regulator子系统 - 知乎 (zhihu.com)》)统一管理系统的供电资源。这些供电资源包括pmic、corebuck等,对供电资源操作做封装,一般通过iic、spi、gpio、pwm等控制供电资源的电压、电流调整或者开/关,为其他驱动或者框架提供电压、电流调整、开关等接口;
  • Power domain framework:power domain管理框架(可参考文章《一文搞懂linux power domain framework - 知乎 (zhihu.com)》)统一管理芯片的power domain。对芯片内的power domain开关操作做封装,抽象核心的开关处理逻辑,为runtime pm、系统休眠唤醒提供开关等接口;
  • Reset framework:reset管理框架(可参考文章《一文搞懂linux reset framework》)统一管理芯片的复位。对芯片内的reset、dereset寄存器操作做封装。抽象核心的reset/dereset处理逻辑,为其他驱动提供统一的reset/dereset等接口;
  • Opp framework:opp(Operating Performance Point)管理框架(可参考文章《一文搞懂linux device dvfs - 知乎 (zhihu.com)》)统一管理使CPU或者Devices正常工作的电压和频率组合。内核提供这个Layer,是为了给出一些相对固定的电压和频率组合,从而使调频调压变得更为简单;
  • Runtime pm:runtime pm管理框架(可参考文章《一文搞懂Linux runtime pm - 知乎 (zhihu.com)》)统一管理片内设备及相应power domain硬件操作。是在power domain提供的开关接口及设备运行时对应的时钟、复位、电的管理基础之上做的封装,设备会在dts指定具体的power domain,设备驱动通过在runtime_suspend、runtime_resume实现对时钟、复位、电的管理,然后注册到runtime pm框架。runtime pm为设备提供了pm_runtime_get_xxx/pm_runtime_put_xxx类接口,在使用设备前,先调用get接口,让设备退出低功耗,在使用完设备后调用put接口,让设备进入低功耗,当power domain下所有的设备都进低功耗后,就可以关闭power domain,当power domain下有一个设备需要工作时,就要打开power domain;
  • Device dvfs:device dvfs管理框架(可参考文章《一文搞懂linux device dvfs - 知乎 (zhihu.com)》)统一管理设备的频率及电压调整,利用opp framework提供的接口,根据设备驱动给定的频率进行调频调压,跟cpu dvfs很类似;
  • Sleep:系统休眠唤醒(可参考文章《一文搞懂linux系统休眠唤醒 - 知乎 (zhihu.com)》)能在系统不被使用的时候,进入一个功耗很低的状态,芯片功耗会很低,ddr进入自刷新,并且在系统被使用的时候,能够快速地恢复。休眠唤醒的过程中会调用device提供的system suspend、resume函数,调用power domain提供的suspend、resume函数,会关闭、打开cpuidle/cpuhotplug功能;
  • Reboot/poweroff:系统重启/关机,重启和关机两个功能关系很紧密,可以简单地理解重启就是先关机再开机。系统重启能在系统出现异常后,或者在系统升级后,进行系统的复位。系统关机一般是用户不再使用机器,或者系统检测到用户不再使用或者可预见的时间不再使用,将系统断电的操作。系统重启和系统关机都是由reboot系统调用实现的,只是相应的参数不一。Service发起重启和关机后,事件会给到init进程来处理。Init会保存一些数据,停止所有srvice,杀死普通进程,最后调用系统调用reboot进行重启或者关机;
  • Cpu idle:cpu idle管理框架(可参考文章《一文搞懂linux cpu idle - 知乎 (zhihu.com)》)会根据当前一段时间cpu的空闲状态及接下来空闲时间的预估,选择进入相应idle等级,不同的等级功耗收益不同,进出时间也不一样,一般功耗收益低,但对应着比较少的退出时间;
  • Cpu dvfs:cpu dvfs管理框架(可参考文章《一文搞懂linux cpu dvfs - 知乎 (zhihu.com)》)提供了不同governor,用来控制cpu的频率、电压调整,这些governor有完全把cpu dvfs交给用户service的,用户service根据场景的不同进行相应的频率、电压调整,也有根据负载进行动态频率、电压调整的;
  • Cpu hotplug:cpu hotplug管理框架(可参考文章《一文搞懂linux cpu hotplug - 知乎 (zhihu.com)》)提供了一种机制给到service:当前的空闲cpu loading比较多时,会由service直接拔掉一些cpu,当cpu loading的需求增加时,再由service将cpu插上;
  • Pm qos:pm qos(quality of service)服务质量(可参考文章《一文搞懂linux PM QOS - 知乎 (zhihu.com)》)是解决低功耗可能会降低性能的问题,它向驱动或者上层service提供了一套对性能约束要求的接口,在cpu dvfs、cpu idle等低功耗管理的时候,会检查性能的约束需求,当发现低功耗动作会影响到性能的时候,便不会进行该次的低功耗操作;

上层service会有专门的功耗管理应用,用来协调其他service进入休眠、唤醒,在进入不同场景的时候告知各service做相应的功耗策略。

3, 内核中各低功耗管理模块框架

3.1 clock framework

详见文章《一文搞懂linux clock子系统 - 知乎 (zhihu.com)

clock framework框架

3.2 Regulator framework

详见文章《一文搞懂linux regulator子系统 - 知乎 (zhihu.com)

regulator framework

3.3 Power domain framework

详见文章《一文搞懂linux power domain framework - 知乎 (zhihu.com)

power domain framework

3.4 Reset framework

详见文章《一文搞懂linux reset framework

reset framework

3.5 Opp framework

opp framework比较简单,就不单独用一篇文章讲述,在文章《一文搞懂linux device dvfs - 知乎 (zhihu.com)》对opp framework也有介绍。

3.6 Runtime pm

详见文章《一文搞懂Linux runtime pm - 知乎 (zhihu.com)

rpm 框架

3.7 Device dvfs

详见文章《一文搞懂linux device dvfs - 知乎 (zhihu.com)

linux device dvfs框架

3.8 系统休眠唤醒

详见文章《一文搞懂linux系统休眠唤醒 - 知乎 (zhihu.com)

系统休眠唤醒框架

3.9 Cpu idle

详见文章《一文搞懂linux cpu idle - 知乎 (zhihu.com)

cpuidle framework

3.10 Cpu dvfs

详见文章《一文搞懂linux cpu dvfs - 知乎 (zhihu.com)

cpu dvfs framework

3.11 Cpu hotplug

详见文章《一文搞懂linux cpu hotplug - 知乎 (zhihu.com)

cpu hotplug

3.12 Pm qos

详见文章《一文搞懂linux PM QOS - 知乎 (zhihu.com)

pm qos framework

(平时会分享linux技术干货文章,关注我可以定期收到相关文章的推送,知乎、微信同名:黑客与摄影师)

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值