Linux acpi电源管理详解

运维 系统运维
要实现电源管理,最重要的有两点:第一是需要设备本身支持节电功能,比如硬盘,可以通过指令暂时关闭;第二是需要操作系统支持电源管理,这样就可以在空闲一段时间之后调用驱动的电源管理功能关闭设备。

虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。

1.Linux acpi电源管理概述

在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它可以降低幅射,降温,延长外设使用寿命。现在的操作系统大都内置了电源管理支持,例如Windows和Linux。

2.PC机实现Linux acpi电源管理的方法

两种电源管理标准:APM和ACPI
传统的APM(AdvancedPowerManagement)是一种基于bios的电源管理标准,目前的***版本是1.2,它提供了CPU和设备电源管理的功能,但是由于这种电源管理方式主要是由bios实现,所以有些缺陷,比如对bios的过度依赖,新老bios之间的不兼容性,以及无法判断电源管理命令是由用户发起的还是由bios发起的,对某些新硬件如USB和1394的不支持性。为了弥补APM的缺陷,新的电源管理ACPI应运而生,这就是ACPI(AdvancedConfigurationandPowerInterface),它主要是将电源管理的主要执行者由bios转换成为操作系统,这样可以提供更大的灵活性以及可扩展性。目前的PC机主板一般同时支持APM和ACPI两种标准。

3.Linux对电源管理的支持

内核模块
针对APM和ACPI两种不同的标准,Linux内核提供了两个不同的模块来实现电源管理功能,这就是apm和acpi。需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一,如果当他们在加载的时候发现二者之一已经加载,就会自动退出。
在官方发布的内核中APM是较为成熟的电源管理方式,可以完成在Windows下ACPI所能完成的大部分功能。由于官方内核中ACPI的功能比较有限,目前还处于开发版状态。所以当前的大多数distribution,如红帽子默认就使用了apm作为电源管理方式。但是值得注意的是Linux中的ACPI实际上是由一个单独的项目小组模块进行维护的,当前内核ACPI的版本实际上已经远远落后于***的版本。由于Linux稳定版中对任何新特性的加入都非常谨慎小心,所以我们也许只能等到2.6.x版本的Linux诞生后才能看到ACPI的稳定全功能版了。不过我们也可以自己对内核打***的ACPI补丁来获得这些功能。
这里是ACPI的主页:
http://sf.net/projects/acpi/
下面对电源管理的介绍以APM为主。

用户态Daemon
为了让Linux内核中的电源管理功能够更好的被利用,我们还需要用户态daemon程序的配合。针对APM和ACPI,分别有apmd和acpid两个不同软件。他们实现的功能比较类似,都是允许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作。在apmd软件包中还有一个工具apm,用户可以用它使机器主动进入standby和suspend状态,还可以查询bios的apm版本号。在使用acpi时直接对proc文件系统进行操作即可完成同样的功能。

4.Linux下驱动的Linux acpi电源管理机制

在Linux下不必为驱动分别编写与APM和ACPI相对应的代码,Linux与Windows类似,为驱动提供了统一的电源管理接口。驱动只要实现了这些接口,就可以实现电源管理的功能。操作系统在它认为合适的时候就会通知驱动完成这些操作。

实现设备电源管理接口主要需要实现以下5点:
1).使用pm_register对设备的每个实例(instance)进行注册;
2).在对硬件进行操作之前调用pm_access(这样会保证设备已被唤醒并且处于ready状态);
3).用户自己的pm_callback函数在系统进入suspend状态(ACPID1-D3),或者从suspend状态恢复(ACPID0)的时候会被调用;
4).当设备不在被使用的时候调用pm_dev_idle函数,这个操作是可选的,可以增强设备idle状态的监测能力;
5).当被unload的时候,使用pm_unregister来取消设备的注册。

5.Linux acpi电源管理对APM进行编程

下面介绍在实模式中和在Linux下使用APM功能的编程方法:
由于APM是由bios提供的,我们可以直接在实模式(如DOS下)调用int15软中断来进行电源管理操作。
在实模式下APM的standby、suspend和poweroff功能分别可以通过下面的汇编语言实现:
 

  1. standby:  
  2. movax,5307H  
  3. movbx,1  
  4. movcx,1  
  5. int15H  
  6. suspend:  
  7. 改成movcx,2  
  8. poweroff:  
  9. 改成movcx,3  

 


需要注意的一件事是在Linux内核中没有使用和实模式的一样的方法来调用int15H中断,而是直接调用了bios的保护模式接口。所以我们如果修改了bios中的apm相关代码并且没有处理好保护模式接口的问题,可以出现这样的情况:在实模式DOS下使用apm功能一切正常,但是在Linux下调用apm功能发生内核一般保护性错误。在Linux下我们可以通过对apm_bios设备的操作来完成同样的功能。下面的代码可以实现APM的suspend功能,等价于apm-s
 

  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. #include  
  6. #include  
  7. #include"apm.h"  
  8. intmain()  
  9. {  
  10. intfd,res;  
  11. fd=open("/dev/apm_bios",O_RDWR);  
  12. if(fd  

 

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/17928/showart_114897.html

【编辑推荐】

  1. 华硕补齐Eee PC的ACPI源代码回应指责
  2. Linux acpi off简介
  3. Linux acpi off学习的必要
  4. Linux acpi off关于Suspend to Disk 问题分析
  5. Linux acpi off报告ACPI bug处理方法

 

责任编辑:chenqingxiang 来源: ChinaUnix博客
相关推荐

2010-06-18 12:58:17

Linux acpi电

2009-12-14 15:41:58

Linux高级电源管理

2010-06-18 14:58:42

Linux ACPI服

2010-06-18 15:22:14

Linux ACPI服

2009-02-17 21:58:31

LinuxGPU电源管理

2010-06-18 12:47:04

Linux acpi

2010-06-18 11:27:43

Linux acpi

2010-06-18 14:41:48

Linux ACPI服

2010-06-21 10:49:24

Linux APM

2010-06-21 14:05:08

Linux APM

2010-02-25 15:45:48

Linux启动服务

2010-06-18 12:26:17

Linux acpi

2010-06-18 12:38:31

Linux acpi

2010-06-18 14:27:52

ACPI是什么

2014-06-06 09:40:14

802.11

2014-04-15 11:02:56

Linux 3.15Linux内核

2013-11-25 17:39:17

Linux内核PCIACPI

2010-11-15 10:02:31

UPS电源技术

2009-03-05 09:43:32

Linux系统进程管理命令

2017-01-15 20:58:04

Linux进程作业管理
点赞
收藏

51CTO技术栈公众号