Linux电源管理详解

来源 :硅谷 | 被引量 : 0次 | 上传用户:wychenjian
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  中图分类号:TP3文献标识码:A文章编号:1671-7597(2010)0120015-01
  
  1 概述
  虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它可以降低辐射,降温,延长外设使用寿命。现在的操作系统大都内置了电源管理支持。
  2 PC机实现电源管理的方法
  要实现电源管理,最重要的有两点:第一是需要设备本身支持节电功能,比如硬盘,可以通过指令暂时关闭;第二是需要操作系统支持电源管理,这样就可以在空闲一段时间之后调用驱动的电源管理功能关闭设备。两种电源管理标准:APM和ACPI:
  传统的APM(Advanced Power Management)是一种基于bios的电源管理标准,目前的最新版本是1.2,它提供了CPU和设备电源管理的功能,但是由于这种电源管理方式主要是由bios实现,所以有些缺陷,比如对bios的过度依赖,新老bios之间的不兼容性,以及无法判断电源管理命令是由用户发起的还是由bios发起的,对某些新硬件如USB和1394的不支持性为了弥补APM的缺陷,新的电源管理ACPI应运而生,这就是ACPI(Advanced
  Configuration and Power Interface),它主要是将电源管理的主要执行者由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为主。
  为了让Linux内核中的电源管理功能够更好的被利用,我们还需要用户态daemon程序的配合。针对APM和ACPI,分别有apmd和acpid两个不同软件。他们实现的功能比较类似,都是允许用户预先定义某些策略,然后跟踪电源状态,执行特定的操作。在apmd软件包中还有一个工具apm,用户可以用它使机器主动进入standby和suspend状态,还可以查询bios的apm版本号。在使用acpi时直接对proc文件系统进行操作即可完成同样的功能。
  4 Linux下驱动的电源管理机制
  在Linux下不必为驱动分别编写与APM和ACPI相对应的代码,Linux与Windows类似,为驱动提供了统一的电源管理接口。驱动只要实现了这些接口,就可以实现电源管理的功能。操作系统在它认为合适的时候就会通知驱动完成这些操作。
  实现设备电源管理接口主要需要实现以下5点:① 使用pm_register
  对设备的每个实例(instance)进行注册;② 在对硬件进行操作之前调用pm_access(这样会保证设备已被唤醒并且处于ready状态);③ 用户自己的pm_callback函数在系统进入suspend状态(ACPI D1-D3),或者从suspend状态恢复(ACPI D0)的时候会被调用;④ 当设备不在被使用的时候调用pm_dev_idle函数,这个操作是可选的,可以增强设备idle状态的监测能力;⑤ 当被unload的时候,使用pm_unregister来取消设备的注册。
  5 对APM进行编程
  实模式中和在Linux下使用APM功能的编程方法:
  由于APM是由bios提供的,我们可以直接在实模式(如DOS下)调用int 15软中断来进行电源管理操作。
  在实模式下APM的standby、suspend和poweroff功能分别可以通过下面的汇编语言实现:
  standby:
  mov ax, 5307H
  mov bx, 1
  mov cx, 1
  int 15H
  suspend:
  改成 mov cx,2
  poweroff:改成 mov cx,3
  需要注意的一件事是在Linux内核中没有使用和实模式的一样的方法来调用int 15H中断,而是直接调用了bios的保护模式接口。所以我们如果修改了bios中的apm相关代码并且没有处理好保护模式接口的问题,可以出现这样的情况:在实模式DOS下使用apm功能一切正常,但是在Linux下调用apm功能发生内核一般保护性错误。
  在Linux下POWEROFF操作有其独特的流程,最后根据内核中apm或者acpi的存在情况来执行相应不同的流程来关闭电源。
  6 常见问题
  (1)我的系统不能被suspend,这是怎么回事呢?
  系统在suspend之前会向所有的驱动发消息,如果这个时候某个傲慢的驱动返回了一个-EBUSY,那么这次suspend的企图就被这个驱动否决了,你只有过一会再试,如果这个驱动总是否决,你就永远都无法suspend了。
  (2)我按下系统的POWEROFF开关,在ATX的主板上,系统就会自动关机了,这个处理流程是什么样子的呢?
  在内核APM模块中建立了一个核心态线程不停的监测系统状态,用户的关机动作在这里被截获后处理。
  (3)Linux中电源管理的文档在哪里?
  在Linux/document.tion目录下的pm.txt中详细定义了Linux驱动电源管理接口实现方式,并且有详细的例子,apm和acpi的实现流程需要参见Linux源码的实现。
  7 小结
  Linux中的电源管理是发展中的代码。从目前的趋势来看ACPI终将取代APM。现在使用APM则是较为成熟和稳妥的方案。我们如果现在编写驱动应该严格遵守文档中的pm.txt所规定的接口,这样可以使我们的驱动有较强电源管理的适应性和稳定性。
  
  作者简介:
  田冰超(1978-),男,河北辛集人,本科,就职于河北省廊坊市武警学院,研究方向:计算机应用、数据库管理开发、计算机软件开发。
其他文献
本文通过对荣华二采区10
期刊
[摘要]“科学无神论”是人类在近代产生的最伟大的思想成果之一,又是马克思主义世界观的基础。试图从科学无神论发展历程、进行科学无神论教育的迫切性,来阐释在构建社会主义和谐社会进行科学无神论教育的重要性。  [关键词]科学无神论教育  中图分类号:G77文献标识码:A文章编号:1671-7597(2010)0110216-01
再生障碍性贫血(以下简称再障),是临床上较为多见的血液病之一。为寻找敏感的实验指标,我院血研室对20例再障及9例再障胎肝单细胞静脉输注治疗前盾进行了抗碱血红蛋白(简称H
用5%盐酸苯肼溶液按40mg/kg给大鼠腹腔注射,共5天,造成溶血性贫血后,随机分成3组(每组14只):(1)654-2治疗组:654-2 20mg/kg腹腔注射,共7天;(2)激素治疗组:地塞米松2mg/kg腹腔
[摘要]介绍一种基于LonWorks總线技术的分布式区域交通信号灯控制系统。系统采用STC12C5410AD单片机作为核心控制器,自动进行车流量检测,以此单片机合理控制交通灯的停、行时间。分布式测控系统中监控主机通过FT3120智能收发器进行通信,实现多路口交通灯的分布式控制。  [关键词]LonWorks智能控制单片机智能收发器  中图分类号:TP2文献标识码:A文章编号:1671-7597(2
IDEALENS启视K2是全球首款电池仓后置的VR一体机,其采用独创的斐波那契黄金螺旋设计,使得主机部分(不合佩戴方案)重量只有295g,重心后移,大幅减少了颈部压力,是目前佩戴最为
期刊
例1:男,42岁,因上呼吸道感染入院。1986年3月10日清晨4时许,起床小便后发生晕厥,醒后感头晕、心慌。查体:体温37.9℃,咽充血,扁桃体无肿 Example 1: Male, 42 years old, a
关于心肌病,目前国内有的学者把它分为两类:原发性或原因不明和继发性或特异性,四型。扩张型、肥厚型,限制型及未定型。欧洲学者又把肥厚型心肌病分型如下: About cardiomy
完成文献检索、文献评价及文献总结,3轮专家问卷调查,专家论证会,专家质量方法学评价和临床一致性评价,形成《中医治未病实践指南·推拿干预小儿脾虚质》制订稿,提出推拿干预
来到上海的西大门青浦,你会被一群乳黄色的建筑所吸引,这就是国家级重点中专、上海市现代化标志性中等职业技术学校——上海工商信息学校。 Came to Shanghai’s West Gate