ACPI共有六种状态,分别是S0到S5,它们代表的含义分别是:
  S0--实际上这就是我们平常的工作状态,所有设备全开,功耗一般会超过80W;
  S1--也称为POS(Power on Suspend),这时除了通过CPU时钟控制器将CPU关闭之外,其他的部件仍然正常工作,这时的功耗一般在30W以下。In this state, no system context is lost (CPU or chip set) and hardware maintains all system context.
  S2--这时CPU处于停止运作状态,总线时钟也被关闭,但其余的设备仍然运转。This state is similar to the S1 sleeping state except that the CPU and system cache context is lost
  S3--这就是我们熟悉的STR(Suspend to RAM),这时的功耗不超过10W。all system context is lost except system memory. CPU, cache, and chip set context are lost in this state.
  S4--也称为STD(Suspend to Disk),这时系统主电源关闭,硬盘存储S4前数据信息,所以S4是比S3更省电状态。It is assumed that the hardware platform has powered off all devices. Platform context is maintained.
  S5--这种状态是最干脆的,就是连电源在内的所有设备全部关闭,即关机(shutdown),功耗为0。

linux支持3种ACPI的节电模式:

1. S1 - POS standby, power on standby 显示屏断电,主机通电

2. S3 - STR standby, (supend to ram) 挂起到内存,键盘不能唤醒,需要从电源键唤醒

3. S4 -hibernate (supend to disk)挂起到硬盘,需要从硬盘恢复

可以简化为 sleep 分为standby 和mem, hibernate即disk分为shutdown和platform(shutdown将系统状态保存到磁盘,BIOS关闭计算机;platform同时点亮挂起指示灯)

For device driver, linux takes S1/S3 exactly the same. The difference is in linux kernel, but NOT the driver. The kernel does different things for S1 and S3.

cat /sys/power/state   检查内核支持哪些节电模式,有standby,mem,disk等

linux 设备模型中一条就是为了电源管理和系统管理,能让系统以特定的顺便遍历硬件。

linux中休眠主要做三件事情:冻结用户进程和内核任务;调用注册的设备的suspend回调函数;休眠核心设备和CPU

# echo standby > /sys/power/state

用户对于/sys/power/state 的读写会调用到main.c中的state_store(),

1. 同步文件系统

2. 关掉用户态的helper进程,并调用suspend_freeze_processes()冻结所有的进程

3. 调用suspend_devices_and_enter()休眠所有的外设。在这个函数中, 先对于dpm_list(device_add中调用device_pm_add时添加)中的每个设备调用dpm_prepare;然后在dpm_suspend()中对于dpm_list中所有的设备调用device_suspend()。device_suspend依次调用class->pm, type->pm, bus->pm。譬如pci总线,bus->pm是pci_bus_type的pci_pm_suspend。这个函数判定如果legacy pci的话(即在pci_driver中指定了suspend、suspend_late、resume、resume_early等)则调用pci_legacy_suspend,会由dev找到pci_dev,然后找到pci_drvier,调用其suspend(即在register_pci_driver中的参数);如果非legacy&(!pm),则pci_disable_enabled_device(写入非master);如果非legacy并且driver->pm不为NULL,则调用driver->pm接口(并不调用driver->suspend)。

4. 调用dpm_suspend_enter。禁止所有的irq,对于dmp_list中的设备依照反序调用bus->pm->suspend_noirq,禁用没启用的CPU,sysdev_suspend,suspend_ops->enter(state)(要么acpi_suspend_ops_old,要么acpi_suspend_ops)。

resume 的过程刚好是反向过程。

因为所做的项目用到了多处kernel thread,在处理driver的时候要特别注意。默认情况下,所有的kernel thread并不能freeze(用户态的都可以),只有显示调用了set_freezable的才可以(去掉PF_NOFREEZE标志,但是不能重新设置PF_NOFREEZE标志)。kernel thread通过调用try_to_freeze进入睡眠(或者通过调用wait_event_freezable来调用try_to_freeze),如果try_to_freeze返回error,则整个hibernation过程失败。

linux 电源管理相关推荐

  1. Linux电源管理(10)_autosleep

    Linux电源管理(10)_autosleep 作者:wowo 发布于:2014-9-18 23:42 分类:电源管理子系统 1. 前言 Autosleep也是从Android wakelocks补丁 ...

  2. linux 电源管理 regulator,Linux内核电源管理综述

    资料: http://blog.csdn.net/bingqingsuimeng/article/category/1228414 http://os.chinaunix.net/a2006/0519 ...

  3. Linux电源管理(5)_Hibernate和Sleep功能介绍【转】

    本文转载自:http://www.wowotech.net/pm_subsystem/std_str_func.html 1. 前言 Hibernate和Sleep两个功能是Linux Generic ...

  4. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构

    Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...

  5. linux系统电源时钟,linux电源管理的一些梳理

    由于项目产品需要过能源之星3.0,所以最近做了一些电源管理低功耗方面的工作,抽个时间正好梳理一下. 其实Linux 电源管理非常复杂,牵扯到很多方面,比如系统级的待机.频率电压变换.系统空闲时的处理以 ...

  6. Linux电源管理(2)_Generic PM之基本概念和软件架构(蜗窝科技,www.wowotech.net)

    1. 前言 这里的Generic PM,是蜗蜗自己起的名字,指Linux系统中那些常规的电源管理手段,包括关机(Power off).待机(Standby or Hibernate).重启(Reboo ...

  7. 九万字图文讲透彻 Linux 电源管理及实例分析

    九万字图文讲透彻 Linux 电源管理及实例分析. 计算机运行在物理世界中,物理世界中的一切活动都需要消耗能量.能量的形式有很多种,如热能.核能.化学能等.计算机消耗的是电能,其来源是电池或者外电源. ...

  8. linux 电源管理 Generic PM之Suspend功能

    Linux电源管理(6)_Generic PM之Suspend功能 作者:wowo 发布于:2014-8-22 21:40 分类:电源管理子系统 1. 前言 Linux内核提供了三种Suspend: ...

  9. Linux电源管理(一)电源管理系统架构

    概述 Linux 电源管理非常复杂,牵扯到系统级的待机.频率电压变换.系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关. 对于消费电 ...

  10. Linux电源管理(1)_整体架构 -- wowo

    1. 前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就 ...

最新文章

  1. 2021年3月12日 北京格灵深瞳Java开发实习面试(一面)
  2. springboot的jsp应该放在哪_详解SpringBoot 添加对JSP的支持(附常见坑点)
  3. CentOS安装oracleJDK
  4. 火车头采集php源码不同,防火车头采集的功能
  5. hdu1285 拓扑排序(裸)
  6. android super this区别
  7. python基础(19)之 输入输出
  8. 在内存中创建临时表和表变量
  9. 为什么要用BigDecimal
  10. 当音乐博士开始写代码...
  11. brave浏览器_据说只有这款浏览器,真正做到了保护隐私
  12. Spring 学习一 @Autowired
  13. [bbk2193] 第34集 - Chapter 09-Optimizing Sore Perations(03)
  14. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
  15. Spring Cloud Ribbon 的请求分发与原理
  16. C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)
  17. 职业学校计算机课评课,中职计算机评课稿
  18. android 清理 app,最好用的五大手机清理APP
  19. CLion的Toolchains are not configured和no CMAKE profiles问题
  20. 新华三笔试题(助力面试)

热门文章

  1. Java并发编程:Lock(上)
  2. [Advance] How to debug a program (下):示例
  3. Zabbix2.4.X_监控SNMP
  4. 【leetcode】Trips and Users
  5. 移动分发端 基础统计指标经典业务代码节选--二次激活用户
  6. Swift2.0新特性
  7. LoggerFactory.getLogger
  8. 医疗物联网解决方案提供商“识凌科技”完成C轮融资
  9. Python模块--Pexpect
  10. oneproxy出现2103错误代码解决方案