1. 前言
在这个世界中,任何系统的运转都须要能量。如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行。而 能量的获取是有成本的,所以若是能在保证系统运转的基础上,尽可能节省对能量的消耗,就会大大提高该系统的生存竞争力。这方面,大天然已经作的很好了,如植 物的落叶,如动物的冬眠,等等。而在计算机的世界里(这里以运行Linux OS的嵌入式系统为例),称做电源管理(Power Management)。html
通俗的讲,电源管理就是:“想让马儿跑,不想马吃草”。不过,从能量守恒的角度,想让马儿跑多快、跑多久,就必定要让它吃相应数量的草。那么咱们就退而求其次:“只在须要马儿跑时,才让它吃草”。这就是电源管理的核心思想。那方法呢?能够这样:linux
方法1:不须要马儿跑时,把它杀掉,这样就不吃草了。须要马儿跑时,再养一匹。架构
在现实世界中,除了傻瓜,应该没人使用这种方法。由于从新养一匹马须要时间----我哪里等得及,须要草----有可能比养一匹闲马须要的更多。框架
方法2:不须要马儿跑时,让它睡觉,不能睁眼,不能动,不能叫。dom
先不讲马儿是否愿意一直睡觉,这种方法只能减小马儿吃草的数量,由于它的心脏还在跳动、血液还在流通,这些也消耗能量。不过还好,须要马儿跑时,应该不须要等过久了。函数
方法3:不是说心脏跳动、血液流通也消耗能量吗?那把这些也停下来好了,能省多少是多少嘛。性能
确实是好方法,很少得先去问问兽医,能不能搞定。不过以如今的医学水平,估计实现不了啊。ui
在计算机世界中,上面的方法是再日常不过的了,并且控制的远比这些精细。由于计算机是人类设计出来的,而马儿倒是经上帝之手。不过经过马儿的例子,咱们能够总结出电源管理的基本行为:spa
a, 实时的关闭暂时不使用的部分(可称做“工做状态到非工做状态的转移”)。例如手机在口袋时,屏幕不必亮。.net
b, 当须要从新使用那些已关闭部分时(可称做“非工做状态到工做状态的转移”),不能有太长时间的等待,且转移过程不能消耗太多的能量。上面的方法1就是一个反面教材,但在计算机的世界里,状况会好不少。
2. Linux电源管理的组成
电 源管理(Power Management)在Linux Kernel中,是一个比较庞大的子系统,涉及到供电(Power Supply)、充电(Charger)、时钟(Clock)、频率(Frequency)、电压(Voltage)、睡眠/唤醒(Suspend /Resume)等方方面面(以下图),蜗蜗会在Linux电源管理系列文章中,对它们一一讲述。
注1:该图片只是一个示意图,并无划分软件层次,所以模块之间的关系不必定是真正的关系。

在对图片中的这些组件(也能够称做Framework)进行详细描述以前,先在这里了解一下基本概念。
注 2:Framework是一个中间层的软件,提供软件开发的框架。其目有三:一是屏蔽具体的实现细节,固定对上的接口,这样能够方便上层软件的开发和维 护;二是尽量抽象公共逻辑,并在Framework内实现,以提升重用性、减小开发量;三是向下层提供一系列的回调函数(callback function),下层软件可能面对差异较大的现实,但只要填充这些回调函数,便可完成全部逻辑,减少了开发的难度。
- Power Supply,是一个供用户空间程序监控系统的供电状态(电池供电、USB供电、AC供电等等)的class。通俗的讲,它是一个Battery&Charger驱动的Framework
- Clock Framework,Clock驱动的Framework,用于统一管理系统的时钟资源
- Regulator Framework,Voltage/Current Regulator驱动的Framework。该驱动用于调节CPU等模块的电压和电流值
- Dynamic Tick/Clock Event,在传统的Linux Kernel中,系统Tick是固定周期(如10ms)的,所以每隔一个Tick,就会产生一个Timer中断。这会唤醒处于Idle或者Sleep状态 的CPU,而不少时候这种唤醒是没有意义的。所以新的Kernel就提出了Dynamic Tick的概念,Tick再也不是周期性的,而是根据系统中定时器的状况,不规律的产生,这样能够减小不少无用的Timer中断
- CPU Idle,用于控制CPU Idle状态的Framework
- Generic PM,传统意义上的Power Management,如Power Off、Suspend to RAM、Suspend to Disk、Hibernate等
- Runtime PM and Wakelock,运行时的Power Management,再也不须要用户程序的干涉,由Kernel统一调度,实时的关闭或打开设备,以便在使用性能和省电性能之间找到最佳的平衡
注 3:Runtime PM是Linux Kernel亲生的运行时电源管理机制,Wakelock是由Android提出的机制。这两种机制的目的是同样的,所以只须要支持一种便可。另外,因为 Wakelock机制路子太野了,饱受Linux社区的鄙视,所以咱们不会对该机制进行太多的描述。
- CPU Freq/Device Freq,用于实现CPU以及Device频率调整的Framework
- OPP(Operating Performance Point),是指可使SOCs或者Devices正常工做的电压和频率组合。内核提供这一个Layer,是为了在众多的电压和频率组合中,筛选出一些相对固定的组合,从而使事情变得更为简单一些
- PM QOS,所谓的PM QOS,是指系统在指定的运行状态下(不一样电压、频率,不一样模式之间切换,等等)的工做质量,包括latency、timeout、throughput三个参数,单位分别为us、us和kb/s。经过QOS参数,能够分析、改善系统的性能
3. Kernel中电源管理相关的Source code汇整
在蜗蜗使用的Linux 3.10.29版本的内核中,电源管理有关的Source code分别位于:
- kernel/power/ *
- drivers/power/
- drivers/base/power/*
- drivers/cpuidle/*
- drivers/cpufreq/*
- drivers/devfreq/*
- include/linux/power_supply.h
- include/linux/cpuidle.h
- include/linux/cpufreq.h
- include/linux/cpu_pm.h
- include/linux/device.h
- include/linux/pm.h
- include/linux/pm domain.h
- include/linux/pm runtime.h
- include/linux/pm wakeup.h
- include/linux/suspend.h
- Documentation/power/*.txt