ACPI

好久没有跟新博客了,今天抽时间更新一下,内容只要是以前学的ACPI,主要是基础概念,后续的应用会陆续推出,由于水平有限,难免存在错误,望指正,感谢CSDN提供的学习平台。(最近发生一些事情,有一句歌词说的很对:人们总是在犯错之后才肯相信,错的是自己!每一天都去热爱,好好珍惜身边的每一个人。)

1  ACPI简介

1.1  ACPI的诞生
    高级配置与电源接口(Advanced Configuration and Power Interface),简称ACPI,1997年由Intel、Microsoft、Toshiba 所共同制定提供操作系统应用程序管理所有电源管理接口。
    2000年8月推出 ACPI 2.0规格。2004年9月推出 ACPI 3.0规格。2009年6月16日则推出 ACPI 4.0规格。2011年12月推出ACPI5.0规格。
       早先,Advanced Power Management模型(APM)将电源管理几乎完全分配给BIOS控制,这大大的限制了操作系统在控制电能消耗方面的功能。
       当前,ACPI的电源管理特性从以前只适用便携式计算机(例如膝上型计算机)到桌上型电脑、工作站和服务器。

ACPI_第1张图片

系统电源管理


在OSPM下,OS可以根据实际需要来改变当前系统或者设备的工作状态,将其配置进入一个耗能较低的水平,从而达到节能的目的。


设备电源管理

ACPI_第2张图片

为了实现OS对各个设备的电源管理,各个设备都会由一个相互通讯的I/O进行通讯,OS可以实现设置好的电源管理的标准,产生一个相应的指令通过这个I/O给相应的设备,从而实现对该设备的电源管理。



处理器电源管理

ACPI_第3张图片



为了能够更进一步的减少能耗,OS在空闲时,会将CPU配置进入一种低能耗的状态,即C1,C2…Cn。OS会读取ACPI电源管理时钟,从而精确的知道OS进入空闲状态的时间,根据这个时间的不同,OS会决定将CPU配置进入不同的状态下。

 

电池管理

每一个电池的设计都会向OS报告设计的电池容量,最近一次满电时的容量,当前剩余的电池容量,制造商设置的初始警告电量,制造商设置的初始低电量。

ACPI_第4张图片

电池的几个相关数据的计算


剩余电量百分比的计算


剩余使用时间的计算



电池低电量

ACPI_第5张图片


配置功能
ACPI除了电源管理,还提供给了OSPM去配置资源的功能。配置的内容主要有两个,分别是Differentiated System Description Table (DSDT) , Secondary System Description Tables (SSDTs)。通过这个配置可以实现device对资源的分配。如:


ACPI_第6张图片

对以上资源的配置需要和其他设备不冲突。


配置功能的实现
 Root System Description Pointer (RSDP) 

ACPI_第7张图片

ACPI的配置由上图的table架构指出,PSDP存放部分信息,以及其他table的地址,通过该地址可以找到其他的table,查询相应的信息。



描述表的结构

ACPI_第8张图片



所有的system description table都有相同的header信息,这些table的目的是为OSPM提供详细的信息说明,第一个table是Fixed ACPI Description table (FADT),FADT包含一些硬件的ACPI信息,以及会涉及到Differentiated System Description Table (DSDT),在DSDT中则会描述相关的系统特性。


DSDT

ACPI_第9张图片

DSDT所定义的table和其他的table的区别不太,都是紧跟着一个相同的头文件,但是,DSDT这个table是不可卸载的。在系统进入初始化的时候,会通过Fixed ACPI Description Table 当中的指针来找到DSDT,并且根据DSDT的内容来定义ACPI Namespace。

利用RW这个tool可以在OS下查看相关的table,DSDT如下:

ACPI_第10张图片


SSDT

ACPI_第11张图片

Secondary System Description Tables (SSDT) 是紧跟着DSDT之后的,在ACPI Namespace创建完成之后,每一个SSDT都会在RSDT/XSDT中装载出不同的OEM Table ID。

查看OS下的SSDT,结果如下:


ACPI_第12张图片


FACS 

ACPI_第13张图片

ACPI_第14张图片

ACPI_第15张图片

ACPI_第16张图片


FACS是在读写内存中的一种结构,BIOS用它来实现固件和OS之间的信息交换(handshaking )。通过FADT(Fixed ACPI Description Table),FACS被转到兼容ACPI的OS中。FACS包含上次启动时的系统硬件签名,firmware waking vector,和Global Lock。

OS下的FACS

ACPI_第17张图片



在ACPI中,定义了许多table以实现各种功能,这些table除以上提到的之外,还有许多,枚举如下所示:
• Root System Description Pointer (RSDP)
• System Description Table Header
• Root System Description Table (RSDT)
• Fixed ACPI Description Table (FADT)
• Firmware ACPI Control Structure (FACS)
• Differentiated System Description Table (DSDT)
• Secondary System Description Table (SSDT)
• Multiple APIC Description Table (MADT)
• Smart Battery Table (SBST)
• Extended System Description Table (XSDT)
• Embedded Controller Boot Resources Table (ECDT)
• System Locality Distance Information Table (SLIT)


• System Resource Affinity Table (SRAT)
• Corrected Platform Error Polling Table (CPEP)
• Maximum System Characteristics Table (MSCT)
• ACPI RAS FeatureTable (RASF)
• Memory Power StateTable (MPST)
• Platform Memory Topology Table (PMTT)
• Boot Graphics Resource Table (BGRT)
• Firmware Performance Data Table (FPDT)
•  Generic Timer Description Table (GTDT)


1.3  ACPI的电源状态

ACPI_第18张图片



1.3.1  全局系统状态(Global System State)
       全局系统状态一共有4个不同的状态,分别是G0,G1,G2,G3,这四个状态的具体描述如下:
       G0:Working,处于正常的工作状态,在这一状态下可运行应用程序,整个计算机系统都可以运行,但外设、CPU都可动态改变各自的功耗。G0也是四个G状态中功耗最大的。
       G1:Sleep,对应S状态的S1-S4。在G1状态下无法运行应用程序。计算机在用户的视角去看会呈现出“关闭”状态。G1状态的特点如下:
      ·不用重新启动,操作系统会切换到正常状态(G0)。      ·计算机的大部分内容都会保存在RAM内存或硬盘中。      ·唤醒延迟(从G1切换到G0)有很多种,这取决于G1状态下的S-State选择。      ·功耗很小,可能降低至几瓦(由S-State决定)。 

G2:Soft Off,对应S状态的S5状态,是软关机状态,在软关机状态下的特点如下:      ·不可运行应用程序和操作系统(保留在G2状态中)。      ·除了主要的电源供电单元,基本上会关闭整个系统。      ·功耗约等于零。      ·需重启系统,唤醒延迟时间比较长。
      G3:Mechanical Off,机械性关机,即硬件关机,其特点如下:      ·通过切断总电源来彻底关闭计算机。      ·只有实时时钟工作。      ·不考虑电池,功耗为零。      ·切换到工作状态的时间比较长。

全局状态总结如下表所示:

ACPI_第19张图片


1.3.2  设备电源状态(Device Power State)
        设备电源状态一共有4个,分别为D0,D1,D2,D3hot,D3off,其详细描述分别如下:
        (PS:设备电源状态是在G0状态下的)
        D0 (Fully-On):在这个状态下,电源能耗处于最高水平,设备处于全功耗,全功能的工作状态下。
        D1:这个状态由其设备的Class所定义的,有些设备没有定义这个状态,这个状态下,相对于D0,会节省一定的功耗,但又在一定程度上会保持设备运行,比如说,在不使用的情况下,会将DVD—ROM光驱关闭,但驱动仍在运行,唤醒时间短。
        D2:这个状态也是在相应Class中定义的,有的设备没有定义这个状态,相对于D1,D2状态更加节能。
        D3hot:他比D2更加节能,这个状态在所有设备的Class中都会定义出来。
        D3:0能耗,完全关闭设备。


设备电源状态总结如下:

ACPI_第20张图片

1.3.3  睡眠状态
          睡眠状态一共有5个不同的状态,分别为S1-S5,其中S1-S4对应的是G1状态,S5对应的为G2状态。睡眠状态有如下几个特点:
          ·CPU不执行指令。
          ·在没有产生唤醒事件之前,硬件不工作。
          ·部分配件处于睡眠状态,方便唤醒
          ·唤醒之后,系统也将继续执行。

  S1状态    ·唤醒时间短,所有的内容都会被保存。    ·CPU的输入时钟关闭。    ·系统内存进入自我更新的状态。
          ·关闭所有的系统时钟,只有RTC继续保持工作。
  S2状态    ·与S1状态相似——但系统内存会丢失。    ·在S2中,CPU和缓存被关闭。    ·S2状态中的唤醒延迟比S1长,但更省电。
  S3状态(这就是我们熟悉的STR:Suspend to RAM)    ·除了RAM,CPU、缓存、芯片组、外设均被关闭。    ·需要调用内存的设备仍然运行。    ·RAM转入低功耗、自我更新模式。    ·唤醒延迟为5-6秒。   
         

S4状态(STD:Suspend to Disk)    ·包括RAM在内的所有部件均被关闭。    ·只保留平台设置,其他部分设置被保存在硬盘的特殊位置中。    ·成功切换至S4平台后,系统会关闭。    ·因为几乎所有的程序和配置都已经停止运行,因此功耗<3W。    ·唤醒计算机时需要再次进入“BIOS Boot Sequence”。    ·不需重启系统,计算机会继续执行。
S5状态(soft off)    ·操作系统不去保留任何内容。    · 功耗基本为0。
          · 唤醒需要将系统进行重新启动


睡眠状态总结如下:

ACPI_第21张图片


工作状态,睡眠状态,软关机状态转换图

ACPI_第22张图片



1.3.4   处理器电源状态
       ACPI在G0状态下定义了4种不同的处理器电源状态,分别为C0,C1,C2,C3,其转换关系如下图:

ACPI_第23张图片


处理器电源状态C0:在这个状态下,CPU正常工作,执行指令。
处理器电源状态C1:即挂起状态,这个状态下CPU的唤醒极快。
处理器电源状态C2:这个状态比C1更加节能,但唤醒时间也略大一点。


处理器电源状态C3:深度睡眠状态,唤醒时间长。
除以上几个状态外,ACPI还可选择C4,C5…Cn等状态,其区别在下表简略说明:

ACPI_第24张图片

1.3.5  CPU/设备性能状态
       由该状态去协调CPU/DEVICE的状态。
       当CPU和设备处于执行状态时,P-States制定出电源管理状态。
       P0:能耗最大,P-State最小化       P1,P2,P3……. :P1 > P2 > P3等等       Pn:能耗最小,P-State最大化
       P-State电源管理一般用于现代处理器和显示核心,它可以控制有效功率。

2  ASL
    2.1  ASL的简介
          ACPI(Advanced Configuration and Power Interface)中,一个特色是有自己专门的一个语言来编写ACPI的那些表。这个语言叫做:ASL(ACPI Source Language). ASL在经过编译器编译后,变成AML(ACPI Machine Language)。然后由OSPM(一般也就是OS)来执行。
          AML是一种BYTECODE,类似JAVA BYTECODE。也就是说,他并不是直接在机器上执行的2进制代码,而是需要OS来解释后执行。这样做的好处是方便错误检查,减少由于代码没写好而带来的负面影响。          


2.2  ASL的使用
     2.2.1  ASL的基本准则
a)  变量名必须由4个字符组成,第1个字符不能是数字。
b)  变量名和函数名不区分大小写。
c)  Scope和Device都会形成自己的作用域。
d)  所有以”_”开头的函数都是Reserved的,给系统使用,不能给自己的函数起这样的名字
e)  ASL中的路径有相对路径和绝对路径之分。其结构有点像文件目录。
f)  对于函数,最多只能传递8个参数(Arg0~Arg7),只能用这8个名字,不能自己起名字
g)  对于局部变量,最多能使用8个变量(Local0~Local7),和函数参数一样,不能自己起名字,而且在使用之前必须手动赋初值。
h)  声明变量时不需要显示声明其类型。
              

2.2.2  ASL的数据类型
           ASL语言中的数据类型与其他编程语言有所区别,其数据类型主要有以下几个:
a)  Integer  – 整数  
 b)  String   – 字符串  
 c)  Event   -- 事件  
 d)  Buffer  -- 数组  
 e)  Package – 对象结合
           可以通过使用objectType(obj)函数可以获知使用的是哪一种数据类型:

ACPI_第25张图片

2.2.3  ASL的常用函数
1.定义变量的函数 name(x,****);
    前面提到定义变量不需要定义变量类型,直接使用函数定义即可,如
    name(temp,100)         //定义一个整数
    name(str,“hello”)         //定义了一个字符串
2.赋值函数  store(),如
    store(0x99,  Local0)
    store(“Hello”,     Local1)
     
    

在ASL中算数运算也不是采用+,—,*,/等,而是使用函数,常用的如下表所示:

ACPI_第26张图片

2.2.4  ASL的域
            在root下一共存在5个不同的域,用来负责不同的事件
             \_GPE, 主要负责ACPI的事件处理
             \_PR, 处理器相关
             \_SB, 所有的设备和总线
             \_SI, 系统指示灯
             \_TZ, Thermal相关,用于读取某些温度值


2.2.5  ASL的设备配置

ACPI_第27张图片

Name(_HID,EISAID("PNP0303"))        // Standard Keyboard 101/102 
      这个是指使用的硬件为PS2 KB。
Name(_HID, EISAID(“PNP0F03”)),这个是则PS2 _MOUSE。


总结
      1:在ACPI中,各个状态都有自己的下标,下标的数值越大,则该状态所对应的能耗也就越低。
      2:部分状态只有在满足一定的条件才会呈现,比如说,C状态只有在G0下才会呈现,而P状态又呈现在C0状态下。
      3:ASL编译形成的AML镜像会对应ACPI中的各个table表,OS通过抓取这些table表就可以获取ACPI的配置和控制方法,实现其作用。


Thanks for your reaading!

你可能感兴趣的:(BIOS)