日期:2014-05-16  浏览次数:21026 次

linux 电源管理

linux 电源管理
2011年06月16日
  目录 [隐藏] 1 电源管理 1.1 高级配置与能源接口(ACPI) 1.1.1 ACPI规范介绍 1.1.2 ACPI 一些基本概念 1.1.3 ACPI的运行 1.1.4 ACPI驱动程序分析 1.1.5 pci的ACPI电源管理的实现 1.1.6 ACPI的事件响应 1.2 APM电源管理模式 电源管理 目前比较流行的电源管理技术主要有两种:高级电源管理(APM)、高级配置与能源接口(ACPl)。其中ACPI在两者之中比较先进,它将电源管理交由操作系统负责,可以有更灵活的管理方式。能否使用电源管理,以及是否可以启用ACPI,不仅仅要求操作系统进行支持,同时也依赖于硬件环境。例如计算机的主板如果不支持ACPI的话,操作系统也不可能利用ACPI进行电源管理。 在linux操作系统的比较新的内核中,缺省的配置均是使用ACPI进行电能管理。但是要注意一点,就是APM与ACPI两种管理方式中只能有一种进行实际的控制管理。如果在编译系统内核时两种管理方式都选择了,那么系统内核将会自动判断该计算机的硬件配置适合两种方式中的哪一种。如果该计算机的硬件配置对这两种管理方式都支持,那么操作系统将会自动选择ACPI方式进行管理。 高级配置与能源接口(ACPI) ACPI规范介绍 ACPI能使软、硬件、操作系统(OS),主机板和外围设备,依照一定的方式管理用电情况,系统硬件产生的 Hot-Plug 事件,让操作系统从用户的角度上直接支配即插即用设备,不同于以往直接通过基于 BIOS 的方式的管理。图 11 7:ACPI 体系结构 ACPI体系结构如上图,根据ACPI 规格定义的 ACPI 驱动体系(简称 ACPI CA),主要目的在于让操作系统和 ACPI 硬件隔离开,让 Linux 中通过一系列的接口来访问 ACPI 层。在 ACPI 规范中将 ACPI 体系分割成 ACPI 核心层(Core subsystem)和OS 服务层(OS service),ACPI 核心层用于提供基本的 ACPI 服务(AML 翻译和名字空间管理等),OS 服务层提供ACPI 单元针对不同的操作系统的接口服务,ACPI体系框架图如下图。图 11 8:ACPI体系框架图图 11 9:ACPI 核心层框架 下面介绍ACPI 核心层: 1. ACPI 核心层: ACPI 核心层分成几个相互关联的逻辑模块,每个模块之间包含一些相关的 ACPI API,当用户在编写相关的含有 ACPI 服务的驱动程序的时候,会调用这些相关模块的接口。 (1) AML Interpreter AML分析器负责分析和运行从本地计算机 BIOS 提供的 AML 文件流,一般说来 AML 翻译器为其他的 ACPI 服务模块提供方法节点运行和获得名字空间中某个方法节点的对象服务。 (2) ACPI Table Management 是一个负责载入,管理,分析,校验 ACPI 模块中所使用的各种来自系统 BIOS 的一些特殊的支持 ACPI 服务的表格,例如:RSDT,FSDT,FACS,DSDT等等,这些表在操作系统进行初始化的时候被载入内存。 (3) Namespace Management 在AML 翻译器之上提供名字空间服务,它负责创建和管理内部的名字空间。 (4) Resource Management 资源管理提供建立在名字空间资源的配置和获取,其中包括了 PCI的设备的地址区间,中断等重要参数。它所提供的服务包括:获取和设定当前的资源,获取设备上可能存在的地址区间以及 PCI 设备的中断路由表(IRQ Routing Tables),获取当前设备的电源支持能力(例如是否支持 S1-S5 状态)。 (5) ACPI H/W Management该模块用于控制对桥芯片上 ACPI 寄存器和时钟以及其他 ACPI 关联硬件的访问,例如 ACPI GPE 状态寄存器和使能寄存器,系统状态获得。 (6) Event handling:事件管理模块是用于管理系统控制中断(SCI)的发生和 GPE 事件的响应,SCI 包括 ACPI 时钟中断,以及 GPE 事件管理。这个单元负责"分发"地址空间和操作空间(OperationRegion)的事件到当前的操作系统层,并负责调用相关的句柄来进行处理。 2.OS 服务层: ACPI OS 服务层(OSL)可以让 ACPI 逻辑模块独立于操作系统上运行。OS 服务层通过驱动程序接口,将从 ACPI 核心的服务转换成本地操作系统的访问和调用。 OSL 的组成模块介绍: (1)OS 启动时的引导服务:在 OS 载入过程中引导服务包括ACPI 子系统的初始化,ACPI硬件初始化及各种设备在ACPI名字空间的_INI控制方法的运行。它在大多数其它的操作系统初始化之前执行。 (2)设备驱动程序载入服务: 对于出现在 ACPI 名字空间中的设备,操作系统必须有一个机制检测它们并装载将设备驱动程序。ACPI系统提供发设备和总线的编号、资源检测和资源设置。 (3)操作系统运行服务: 运行服务包括大部分 ACPI 系统和 OS 交互的外围接口,包括事件管理日志和电源管理功能。 (4)异步服务 异步功能包括中断服务(系统控制中断),事件处理和分发(固定事件,GPE 事件,通知事件和操作区访问事件),以及错误处理。 ACPI 一些基本概念 DSDT: DSDT 称做 Differentiated Definition Block,存在于 BIOS 中并与当前的硬件平台兼容的,提供了系统的硬件特性(例如某些设备的内部寄存器和存储器)的应用策略和配置,在系统初始化的时候,DSDT 被当前系统启动时初始化到名字空间中。 FADT:FADT 中包含了 ACPI 的硬件寄存器组(GPE)的应用和配置(包含它们的硬件地址)也包括DSDT表的硬件地址。 ACPI Namespace: ACPI名字空间是一个大的数据结构,被ACPI核心子系统构建并维护。ACPI名字空间数据来自用AML语言在DSDT中的定义。ACPI名字空间装有称为ACPI对象的体系结构。 在ACPI名字空间每对象有固定4个字节的名字,根对象是"/"。对象的范围是这个对象的所有孩子。 说明范围、名字和对象的例子如下: 下面是ASL语言源代码,它是对象_GPE 的范围,这个范围装有对象_L08 和 _L0A。 Scope (\_GPE) { Method (_L08) { Notify (\_SB.PCI0.DOCK, 1) } Method (_L0A) { Store (0, \_SB.PCI0.ISA.EC0.DCS) } } 这个例了中有三个ACPI名字空间的对象,它们描述如下: ?? 三个对象的名字是 _GPE, _L08, 和 _L0A。 ?? 父对象_GPE的孩子对象是 _L08 和 _L0A。 ?? 对象_L08的绝对路径是 "\_GPE._L08"。 ?? 对象 _GPE范围包括 _L08 和 _L0A 对象。 ?? 在名字空间对象 _L08 和 _L0A 没有与它们相关的范围。 ?? 对象_L08 和 _L0A 的类型是 ACPI_TYPE_METHOD. ?? 在样例中,在_GPE的范围里,对象 _L08的后面的对象是对象 _L0A。 ?? 对象 _GPE 的父对象是根对象 预定义的对象 在名字空间中有几个预定义的对象,它们一直存在ACPI名字空间中,把它们列出如下: "_GPE", ACPI_TYPE_ANY // General Purpose Event block "_PR_", ACPI_TYPE_ANY // Processor block "_SB_", ACPI_TYPE_ANY // System Bus block "_SI_", ACPI_TYPE_ANY // System Indicators block "_TZ_", ACPI_TYPE_ANY // Thermal Zone block "_REV", ACPI_TYPE_NUMBER // Revision "_OS_", ACPI_TYPE_STRING // OS Name "_GL_", ACPI_TYPE_MUTEX // Global Lock 下面图显示了ACPI名字空间的逻辑图:图 11 10:ACPI名字空间的结构 SCI 中断:(System Control Interrupt) 系统控制中断,SCI 中断是一种源自 ACPI 兼容芯片系统中断,系统映射不同的 ACPI 事件中断向量以便共享此中断,当底层硬件产生 SCI 中断的时候(例如设备插入事件引发中断),根据通知 OSPM 层处理相对应的 ACPI 事件,OSPM 层会调用预先安装的中断句柄。 GPE Block Device 和 GPE 事件:GPE Block Device 是平台设计者可按照 FADT(Fixed ACPI Descriptor Table) 描述表中响应 GPE 的寄存器组,GPE 的输入脚作为 GPE 设备描述块中的地址存在于 FADT 中,每个 GPE Block Device 可以容纳 128 个 GPE 事件,ACPI 层上提供两个通用目标寄存器组--GPE0_BLK 和 GPE1_BLK,(也就是说可以响应 256 个 GPE 事件)每个寄存器组中包含两个等长度的寄存器 GPEx_STS,GPEx_EN,他们的系统地址