本系列将逐步介绍linux电源管理相关的知识,涉及到常见电源管理机制、linux电源管理机制、linux驱动中有关电源管理的相关接口、内核文档中关于Linux电源管理架构文档的分析。以下将以此来介绍相关内容,尽量做到通俗易懂,条理清晰。

电是现在社会的基础设施,它点亮了整个世界。随着移动互联网的盛行,各种智能设备层出不穷,各种CPU和大屏幕,都在不断折磨手机的电池,各种刺激的手游,也在压榨智能手机的电量。电池技术发展了这么多年,在没有新型储能材料发现之前,考虑到整体的重量和发热的可接受度,手机电池电量是不会有太大突破的。大家都知道Android是基于Linux开发的,要提高未来智能设备的续航时间,一方面需要提高电池容量,另一方面,就要站在系统的视角上,像进程调度一样,调度”电力”,在满足一定负载要求下,尽量降低功耗,延迟设备使用时间。本篇文章将从下往上,依次介绍电源管理理念在Android智能手机上的设计与实现。

电源管理的对象是各种硬件设备驱动、系统框架中的各种应用调度等(这只是我的初步理解,有什么不对的地方,请各位指教)。如果以日常生活为例子来类比,一个成年人,一日三餐,就可以全速工作一整天,吃饭就像充电一样,先吃饭,再做事,体内葡萄糖等储能物质就像电池一样,在一定的能量供应下,干越多的活,Boss越欢喜。只在需要马儿跑时,才让它吃草,这是电源管理的核心思想,它主要有两点

1. 灵活的关闭暂时不使用的部分

2. 当需要重新使用那些已经关闭的部分,不能有长时间的等待,且切换状态不能消耗太多能量。

电源管理使用的前提,是待控制的硬件支持节点功能,能够通过指令暂时关闭,操作系统需要支持电源管理,

常见电源管理机制

在x86机器中,存在两种电源管理方法,APM(Advanced Power Management,高级电源管理)和ACPI(Advanced Configuration and Power Interface ,高级配置和电源接口),这两个标准不能同时允许在Linux上面,默认情况下,Linux运行ACPI.需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一

APM可以让设备处于Suspend(挂起状态)或者Standby(待机状态)和检测电池容量,使用前提,需要BIOS和Linux核心支持,并且有apmd(APM的后台服务程序)和apm等应用程序。它是基于BIOS的电源管理标准,提供了CPU和设备电源管理的功能,缺陷是对BIOS的过度依赖、新旧BIOS的兼容性、以及无法判断电源管理命令是由用户发起还是由BIOS发起,不适合新硬件的发展趋势,为了弥补APM的缺陷,人们提出了ACPI规范。

ACPI主要是将电源管理的主要执行者由BIOS转换成操作系统,这样可以提供更大的灵活性以及可扩展性。ACPI除了APM的功能之外,还可以单独控制外设,有更加细粒化的节点控制。对于的应用程序有acpid和pmtools,下载链接在此

ACPI主要支持三种节点方式:

1. standby(S1模式),待机方式:显示屏断电,只是主机断电,此时,敲任何键都可以恢复原来状态

2. suspend to ram(STR,S3模式),挂起到内存,系统把当前信息储存在内存中,只有CPU和内存等几个关键部件,按电源键可以恢复原来状态

3. suspend to disk(STD,S4模式),挂起到硬盘,系统在关机前将当前数据先保存在内存中,再把内存写入硬盘上的交换分区上,用户下次按开机键开启时,计算机直接从硬盘读取数据,恢复原来状态。

ACPI有六种工作状态:

S0-->所有设备全开

S1-->只关闭CPU(中断使能)

S2-->关闭CPU和总线时钟

S5-->关机

在/sys/power目录下

进入对于的模式,只往state输入对于的状态标志位就可以了。

由于目前没有从事有关低功耗方面的项目,所以只能是参考一下标准Linux休眠和唤醒机制分析(一~四)来理解,等以后有相关的机会,要抓紧深入去体会。

struct platform_suspend_ops {

int (*valid)(suspend_state_t state);

int (*begin)(suspend_state_t state);

int (*prepare)(void);

int (*prepare_late)(void);

int (*enter)(suspend_state_t state);

void (*wake)(void);

void (*finish)(void);

void (*end)(void);

void (*recover)(void);

};

休眠唤醒的执行过程,依次是begin—>prepare—>prepare_late—>enter—>wake—>finish—>end.

休眠停留在enter函数中,唤醒和休眠是逆过程。

在Linux驱动层面,Linux电源管理子系统已经封装好了统一的接口,各种类型的设备驱动只需要实现相关的接口函数,操作系统在它认为合适的时候就会通知驱动完成这些操作。在一般设备驱动基础之上,使用pm_register和pm_unregister进行注册和注销,使用pm_access进行休眠可行性检测,使用pm_callback函数执行状态通知后的回调响应,使用pm_dev_idle,用于检测设备idle状态机制。

对Android还不熟悉,只是知道它在标准的linux休眠唤醒的机制上,增加了early suspend和late resume两种模式,具体分析待后续相关文章。

参考资料 :Linux acpi电源管理的高级应用

      Linux电源管理_整体架构

5 http://www.acpi.info:ACPI的官方网站,在上面可以免费获得最新的ACPI规范。

6 http://acpi.sourceforge.net:Linux下支持ACPI项目网站。官方Linux内核中ACPI的版本实际上已经远远落后于最新的版本,因为linux稳定版中对任何新特性的加入都是非常小心谨慎的。你可以从这里下载最新的ACPI补丁。

7 Linux核心源代码目录:Documentation/power/,里面有开发人员写的一些关于电源管理在Linux上实现的文档。

linux电源管理系列(一)的更多相关文章

  1. Linux电源管理(1)-整体架构【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/pm_architecture.html 1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长, ...

  2. ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现

    ARM linux电源管理——Cortex A系列CPU(32位)睡眠和唤醒的底层汇编实现 承接 http://www.wowotech.net/pm_subsystem/suspend_and_re ...

  3. Linux电源管理(4)-Power Manager Interface【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/pm_interface.html 1. 前言 Linux电源管理中,相当多的部分是在处理Hibernate.Su ...

  4. linux磁盘管理系列-软RAID的实现

    1 什么是RAID RAID全称是独立磁盘冗余阵列(Redundant Array of Independent Disks),基本思想是把多个磁盘组合起来,组合一个磁盘阵列组,使得性能大幅提高. R ...

  5. linux磁盘管理系列-LVM的使用

    LVM是什么 LVM是Linux操作系统的逻辑卷管理器. 现在有两个Linux版本的LVM,分别是 LVM1,LVM2.LVM1是一种已经被认为稳定了几年的成熟产品,LVM2 是最新最好的LVM版本. ...

  6. linux磁盘管理系列三:LVM的使用

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  7. linux磁盘管理系列二:软RAID的实现

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  8. linux磁盘管理系列一:磁盘配额管理

    磁盘管理系列 linux磁盘管理系列一:磁盘配额管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...

  9. Linux电源管理(9)_wakelocks【转】

    1. 前言 wakelocks是一个有故事的功能. wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为"wakelocks&quo ...

随机推荐

  1. aspose.cells 模版

    aspose.cells 模版  http://www.cnblogs.com/whitewolf/archive/2011/03/21/Aspose_Cells_Template1.html

  2. C#_判断2个对象的值是否相等

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Spreadsheet Tracking

     Spreadsheet Tracking  Data in spreadsheets are stored in cells, which are organized in rows (r) and ...

  4. javaScript入门1--组成,基本使用

    javaScript:脚本语言,最初是为了实现在客户端进行的表单验证以减少服务器的数据交互次数,如今可用在页面交互,计算,拥有了闭包,匿名(拉姆达)函数,甚至元编程等特性. javaScript实现的 ...

  5. Mac下启动Apache

    1.启动 sudo apachectl -k start 2.重新启动 sudo apachectl -k restart     //-------------------------------- ...

  6. Mac 10.9 自带apache2虚拟目录设置

    花了好几天时间做这个事,终于成功,把正确的做法记录一下. 如果是第一次使用apache,可以先执行sudo apachectl start,然后在浏览器里打开http://localhost看看效果, ...

  7. Objective-C ,ios,iphone开发基础:使用第三方库FMDB连接sqlite3 数据库,实现简单的登录

    第一步:下载第三方库,点击 连接 下载, 第二部:准备数据库:按照连接&中博客的步骤实现数据库, 数据库的设计大致如下表: id        username             pas ...

  8. [转]网站优化-IIS7下静态文件的优化

    本文转自:http://www.cnblogs.com/Leung/archive/2009/10/26/1590256.html 在网站开发过程中,通常我们会对网站的静态文件做处事,像图片文件,CS ...

  9. poj2243

    Knight Moves Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13433   Accepted: 7518 Des ...

  10. (原创)monitor Dell Powerconnec 6224 with cacti

    使用cacti监控DELL Powerconnect 6224,可以直接使用http://docs.cacti.net/usertemplate:host:dell:powerconnect:62xx ...