linux电源管理_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、linux电源管理虽然 linux 可以在任何一台 386 以上的 pc 上运行,目前大多数人用法的都是新型的,带有各种外设的桌面pc或者笔记本电脑,这样,功能(pm)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延伸电池寿命,而在桌面pc上它可以降低幅射,降温,延伸外设用法寿命。现在的操作系统大都内置了电源管理支持,例如 windows 和 。2.pc机实现电源管理的办法要实现电源管理,最重要的有两点:第一是需要设备本身支持节电功能,比如硬盘,可以通过命令临时关闭;其次是需要操作系统支持电源管理,这样就可以在空闲一段时光之后调用驱动的电源管理功能关闭设备。两种电源管理标准:apm和a

2、cpi传统的apm(advanced power management)是一种基于bios的电源管理标准,目前的最新版本是1.2,它提供了cpu和设备电源管理的功能,但是因为这种电源管理方式主要是由bios实现,所以有些缺陷,比如对bios的过度依靠,新老bios之间的不兼容性,以及无法推断电源管理指令是由用户发起的还是由bios发起的,对某些新硬件如和1394的不支持性。为了弥补apm的缺陷,新的电源管理acpi应运而生,这就是acpi(advanced configuration and power interface),它主要是将电源管理的主要执行者由bios转换成为操作系统,这样可以提

3、供更大的灵便性以及可扩展性。目前的pc机主板普通同时支持apm和acpi两种标准。3.linux对电源管理的支持内核模块针对apm和acpi两种不同的标准,linux内核提供了两个不同的模块来实现电源管理功能,这就是apm和acpi。需要注重,apm和acpi是相互矛盾的两个模块,用户在同一时光内只能加载其中之一,假如当他们在加载的时候发觉二者之一已经加载,就会自动退出。在官方发布的内核中apm是较为成熟的电源管理方式,可以完成在windows下acpi所能完成的大部分功能。因为官方内核中acpi的功能比较有限,目前还处于开发版状态。所以当前的大多数distribution,如红帽子默认就用法

4、了apm作为电源管理方式。但是值得注重的是linux中的acpi事实上是由一个单独的项目小组模块举行维护的,当前内核acpi的版本事实上已经远远落后于最新的版本。因为linux稳定版中对任何新特性的加入都十分谨慎当心,所以我们大概只能等到2.6.x版本的linux出生后才干看到acpi的稳定全功能版了。不过我们也可以自己对内核打最新的acpi补丁来获得这些功能。下面向电源管理的介绍以apm为主。用户态daemon为了让linux内核中的电源管理功能够更好的被利用,我们还需要用户态daemon程序的协作。针对apm和acpi,分离有apmd和acpid两个不同软件。他们实现的功能比较类似,都是允

5、许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作。在apmd软件包中还有一个工具apm,用户可以用它使机器主动进入standby和suspend状态,还可以查询bios的apm版本号。在用法acpi时挺直对proc文件系统举行操作即可完成同样的功能。4.linux下驱动的电源管理机制在linux下不必为驱动分离编写与apm和acpi相对应的代码,linux与windows类似,为驱动提供了统一的电源管理接口。驱动只要实现了这些接口,就可以实现电源管理的功能。操作系统在它认为合适的时候就会通知驱动完成这些操作。实现设备电源管理接口主要需要实现以下5点:1)用法pm_register对设备

6、的每个实例(instance)举行注册;2)在对硬件举行操作之前调用pm_access(这样会保证设备已被唤醒并且处于ready状态);3)用户自己的pm_callback函数在系统进入suspend状态(acpi d1-d3),或者从suspend状态复原(acpi d0)的时候会被调用;4)当设备不在被用法的时候调用pm_dev_idle函数,这个操作是可选的,可以增加设备idle状态的监测能力;5)当被unload的时候,用法pm_unregister来取消设备的注册。5.对apm举行编程下面介绍在实模式中和在linux下用法apm功能的编程办法:因为apm是由bios提供的,我们可以挺

7、直在实模式(如dos下)调用int 15软中断来举行电源管理操作。在实模式下apm的standby、suspend和poweroff功能分离可以通过下面的汇编语言实现:standby:mov ax, 5307hmov bx, 1mov cx, 1int 15hsuspend:改成 mov cx,2poweroff:改成 mov cx,3需要注重的一件事是在linux内核中没有用法和实模式的一样的办法来调用int 15h中断,而是挺直调用了bios的庇护模式接口。所以我们假如修改了bios中的apm相关代码并且没有处理好庇护模式接口的问题,可以浮现这样的状况:在实模式dos下用法apm功能一切正

8、常,但是在linux下调用apm功能发生内核普通庇护性错误。在linux下我们可以通过对apm_bios设备的操作来完成同样的功能。下面的代码可以实现apm的suspend功能,等价于apm -sinclude stdio.hinclude unistd.hinclude stdlib.hinclude asm/fcntl.hinclude linux/types.hinclude sys/types.hinclude "apm.h"int main()int fd, res;fd = open("/dev/apm_bios", o_rdwr);if (

9、fd 0) printf("open /dev/apm_bios error!n");exit(-1);sync();res = ioctl(fd, apm_ioc_suspend, null);if (res != 0) printf("ioctl error!n");close(fd);exit(-1);close(fd);return 0;假如我们把上面程序中的suspend改成standby,我们就同样实现了apm -s的功能。在linux下poweroff操作有其独特的流程,最后按照内核中apm或者acpi的存在状况来执行相应不同的流程来关闭电

10、源。请参见linux内核源码,我写的linux关机重启流程分析中也有一定的介绍。6.常见问题(faq)1)我的系统不能被suspend,这是怎么回事呢?系统在suspend之前会向全部的驱动发消息,假如这个时候某个狂妄的驱动返回了一个-ebusy,那么这次suspend的企图就被这个驱动拒绝了,你惟独过一会再试,假如这个驱动总是拒绝(真是蛮横,不过它大概有自己的苦衷也说不定),你就永久都无法suspend了。2)我按下系统的poweroff开关,在atx的主板上,系统就会自动关机了,这个处理流程是什么样子的呢?在内核apm模块中建立了一个核心态线程不停的监测系统状态,用户的关机动作在这里被截获后处理。具体的流程可以参见本人的linux关机重启流程分析。3)linux中电源管理的文档在哪里?在linux/documentation名目下的pm.txt中具体定义了linux驱动电源管理接口实现方式,并且有具体的例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论