蜗窝科技

Linux电源管理(1)_整体架构

wowo · · 电源管理子系统 · 阅读 98233 · 2014年5月存档

1. 前言

在这个世界中,任何系统的运转都需要能量。如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行。而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力。这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等。而在计算机的世界里(这里以运行Linux OS的嵌入式系统为例),称作电源管理(Power Management)。

通俗的讲,电源管理就是:“想让马儿跑,不想马吃草”。不过,从能量守恒的角度,想让马儿跑多快、跑多久,就一定要让它吃相应数量的草。那么我们就退而求其次:“只在需要马儿跑时,才让它吃草”。这就是电源管理的核心思想。那方法呢?可以这样:

方法1:不需要马儿跑时,把它杀掉,这样就不吃草了。需要马儿跑时,再养一匹。

在现实世界中,除了傻瓜,应该没人使用这种方法。因为重新养一匹马需要时间—-我哪里等得及,需要草—-有可能比养一匹闲马需要的更多。

方法2:不需要马儿跑时,让它睡觉,不能睁眼,不能动,不能叫。

先不讲马儿是否愿意一直睡觉,这种方法只能减少马儿吃草的数量,因为它的心脏还在跳动、血液还在流通,这些也消耗能量。不过还好,需要马儿跑时,应该不需要等太久了。

方法3:不是说心脏跳动、血液流通也消耗能量吗?那把这些也停下来好了,能省多少是多少嘛。

确实是好方法,不多得先去问问兽医,能不能搞定。不过以现在的医学水平,估计实现不了啊。

在计算机世界中,上面的方法是再平常不过的了,而且控制的远比这些精细。因为计算机是人类设计出来的,而马儿却是经上帝之手。不过通过马儿的例子,我们可以总结出电源管理的基本行为:

a, 实时的关闭暂时不使用的部分(可称作“工作状态到非工作状态的转移”)。例如手机在口袋时,屏幕没必要亮。

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

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。

标签:KernelmanagementPMPowerArchitecture

继续讨论

新讨论请用 GitHub 账号在下方发言——评论会保存在本仓库的 Discussions 里,与站点同寿; 再下方的「历史评论」是原站的只读存档。

评论(48 条,只读存档)

以下为原站的历史评论(只读存档);继续讨论请用上方的评论区。

  • RominSoft博客 主页

    很高深,已经完全看不懂了
    • 烂番茄 主页

      @RominSoft博客:一看就知道是资深人士!
      • 蜗蜗

        @烂番茄:哪里哪里,多谢谬奖。
    • 蜗蜗

      @RominSoft博客:不高深,行业不同而已,呵呵
  • 老三

    除了专业部分,其他的通俗易懂,就当是专业外人士的导航好了,理念是一样的,呵呵
  • 爱宝贝 主页

    高深啊。表示完全看不懂啊。哈
  • Daniel

    你有没有写书呢?感觉你写东西有一个linux内核的整体框架在那里,写出来的比较容易让人有一个整体认识,然后再各个部分的去讲,不过如果你写书的话,我想就能更好的弄清楚内核的框架以及细节实现部分的内容了,你出书来吗?如果出了可以告诉我名字,看你文章思路很清晰,非常感谢,大牛~~~
    • 蜗蜗

      @Daniel:非常感谢您的阅读。写的东西能够对除了我之外的其他人有些许的帮助,就是对自己的最大鼓舞。 当前暂时只是个人博客,因为没能达到财富自由,就不能全职放在这上面。毕竟在当前的大环境,靠它赚钱有点难。 不过确实打算将这些文章总结成书,这是我的一个五年计划。但您也知道,由于业余时间较少,可能比较慢,怕您等不及。
      • Daniel

        @蜗蜗:那我就经常来您这做客,看你写的文章,没看完一部分内容都有不少收获!最近我对device tree有点迷惑,3.8版本内核往后,开始用这种方式吧?对3.8之前版本和之后版本的驱动开发有点迷惑,到底主要的不同在哪,蜗蜗有时间可以出一个系列,希望你考虑下这个建议吧,这部分的资料非常少。
        • 蜗蜗

          @Daniel:谢谢您的建议,我们正在写,由于涉及很多背景知识,就稍微有点慢。 另外,非常感谢您能来小站,技术问题大家可以多多交流。
          • Daniel

            @蜗蜗:非常非常好,我非常想了解这方面的内容,没想到回复的这么快哈~~~~~~~~支持......
            • 蜗蜗

              @Daniel:呵呵,因为这会正在写呢。你可以注册个账号,或者定个RSS之类的,这样就可以及时看到我们的更新。 再次表示感谢。
              • Daniel

                @蜗蜗:订阅好像有问题,点击订阅,出来的是源代码
        • 蜗蜗

          @Daniel:一般需要用一个订阅工具,例如我现在使用的FoxMail邮箱,或者以前的Google Reader,然后在添加订阅时,输入RSS的地址,如“/index.xml”,就可以了。
          • Daniel

            @蜗蜗:蜗蜗,我在你这个网站注册的用户名就是邮箱名字,但是密码忘了怎么办?你能帮忙把密码发我邮箱吗?或者告诉我怎么修改密码啊。还有你有讨论的QQ群吗?
            • wowo

              @Daniel:至于讨论用的QQ群,我还是想坚持我的想法:蜗窝希望所有的讨论都能保留下来,以便后续自己和他人查看。所以在博客上比较好(速度确实是有些慢,但是可以多点时间思考)。 不过很多人都建议建立QQ群,我不确定这个想法还能坚持多久啊,呵呵~~
              • travelhop

                @wowo:QQ群里面水量太大,最后的结果是少数话痨成为主宰。blog的方式的确很慢,但是谈论技术问题,一定也是很漫长和很长篇的内容,所以不以QQ群为主要的平台是合理的。 技术的交流,应该是经过深思熟虑的,技术用语的选择,也应该是有所取舍的,一个表述,一个判断,都应该尽量忠实于技术本身,而不是变成口水话。 想在QQ里聊天的人,多半只是想快点得到技术指点,或者无聊的时候有人解闷罢了……
          • Daniel Shieh

            @蜗蜗:不用麻烦楼主了,我把密码试出来了,呵呵
            • wowo

              @Daniel Shieh:抱歉,看到的有点晚了。 后台看不到你的密码,但是可以给你重置。 试出来就好了,呵呵。
    • linuxer

      @Daniel:写书是这样的过程,你自己是一个装满水的水库,但是准备了一桶水,给读者倒了一杯。但现在,我们只是建好了水库,还在蓄水阶段......
      • yinyin

        @linuxer:精辟
  • Daniel

    另外,你这网站只是个人博客的形式?你是工作还是自己做公司呢?
  • 海

    wakelock已经被wakeup source替代了
    • 蜗蜗

      @海:多谢提醒,我会再了解一下Android的发展现状,然后更新这里的表述。 谢谢。
  • Daniel Shieh

    现在拿到一个新的板子,想要实现电源的power on和off,以及一级,二级低功耗,deep sleep,总体上说应该从哪里下手呢?
    • Daniel Shieh

      @Daniel Shieh:希望楼主能抽空指点一下,不知道这些点从哪下手。
    • wowo

      @Daniel Shieh:这位帅哥一口气问了很多问题啊,我只能这样建议:把事情拆细,一个一个的去做。比如说power on,比如说power off,等等。我可以协助你把每一件事情的过程理一下(其实我在文章中都涉及到了),至于其它的,除非你能提出更细致的问题,我也不知道怎么帮你啊。呵呵,见谅~~~
  • qkhhyga

    @wowo:坐等cpufreq动态调频的分析介绍。。。
    • wowo

      @qkhhyga:时机还未到啊,最低要等到regulator的介绍完,才能开始cpufreq。
  • zxqhbd

    很好的讲解,不小心进入这个博客就被吸引了,怎么注册不了啊
    • wowo

      @zxqhbd:抱歉,网站php代码有问题,注册用户超过255就注册不了了,我还没来得及研究一下怎么修复~~
      • zxqhbd

        @wowo:期待加入!
  • xiaogaod325

    有点意思
  • franc

    无法登录
    • wowo

      @franc:博客和论坛的账号不能通用,另外建议大家不要登录博客了(只有发文章的时候才需要)。
  • vv小蛋

    感觉到了一股禅意,或许做任何事情都是在修道吧
    • wowo

      @vv小蛋:哈哈,禅意,听着不错。 修道改为修行就更好了。
  • wolf

    LINUX 系统息屏后长时间不操作,屏幕点不亮,可是其他的一切正常运行,这个是怎么回事呢,我看到你回复别人的帖子是要重新设置背光,可是重新设置背光也不管用!怎么回事呢?谢谢 http://bbs.csdn.net/topics/370258429 这个帖子的问题和我的很像,有人说除了设置背光还有别的设置,但是具体的没有给出,怎么设置屏幕的电源呢
    • wowo

      @wolf:可以按照如下思路去查: 1。确认是背光没开,还是lcd没开,还是没有应用送显示数据。 2。如果是背光,检查power、pwm等。 3。如果lcd没开,检查对应的驱动。 4。等等
  • 周末花裤衩

    试试还能留言吗
  • GrayMonkey

    膜拜大佬,早找到你的文章就好了,Android开发一枚,一直对底层的电源管理存有疑问
  • 吴兵 主页

    "Runtime PM是Linux Kernel亲生的运行时电源管理机制,Wakelock是由Android提出的机制。这两种机制的目的是一样的,因此只需要支持一种即可。另外,由于Wakelock机制路子太野了,饱受Linux社区的鄙视,因此我们不会对该机制进行太多的描述。"是不是android 用户层用Wakelock机制,而内核层kernel用Runtime PM机制啊?
    • 吴兵 主页

      @吴兵:wowo, 有空讲一下这个历史故事吧
  • Nicole

    正在学习。。。
  • wall.e

    写的挺好,请问是您一个人还是一个团队
  • estrib

    看到这个系列的文章终于明白了一些,感谢
  • lumotuwe

    http://events17.linuxfoundation.org/sites/events/files/slides/Intro_Kernel_PM.pdf Introduction to Kernel Power Management 这个比较系统
  • baron 主页

    还能留言