好久没有跟新博客了,今天抽时间更新一下,内容只要是以前学的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的电源管理特性从以前只适用便携式计算机(例如膝上型计算机)到桌上型电脑、工作站和服务器。
系统电源管理
在OSPM下,OS可以根据实际需要来改变当前系统或者设备的工作状态,将其配置进入一个耗能较低的水平,从而达到节能的目的。
设备电源管理
为了实现OS对各个设备的电源管理,各个设备都会由一个相互通讯的I/O进行通讯,OS可以实现设置好的电源管理的标准,产生一个相应的指令通过这个I/O给相应的设备,从而实现对该设备的电源管理。
处理器电源管理
为了能够更进一步的减少能耗,OS在空闲时,会将CPU配置进入一种低能耗的状态,即C1,C2…Cn。OS会读取ACPI电源管理时钟,从而精确的知道OS进入空闲状态的时间,根据这个时间的不同,OS会决定将CPU配置进入不同的状态下。
电池管理
每一个电池的设计都会向OS报告设计的电池容量,最近一次满电时的容量,当前剩余的电池容量,制造商设置的初始警告电量,制造商设置的初始低电量。
电池的几个相关数据的计算
剩余电量百分比的计算
剩余使用时间的计算
电池低电量
配置功能
ACPI除了电源管理,还提供给了OSPM去配置资源的功能。配置的内容主要有两个,分别是Differentiated System Description Table (DSDT) , Secondary System Description Tables (SSDTs)。通过这个配置可以实现device对资源的分配。如:
对以上资源的配置需要和其他设备不冲突。
配置功能的实现
Root System Description Pointer (RSDP)
ACPI的配置由上图的table架构指出,PSDP存放部分信息,以及其他table的地址,通过该地址可以找到其他的table,查询相应的信息。
描述表的结构
所有的system description table都有相同的header信息,这些table的目的是为OSPM提供详细的信息说明,第一个table是Fixed ACPI Description table (FADT),FADT包含一些硬件的ACPI信息,以及会涉及到Differentiated System Description Table (DSDT),在DSDT中则会描述相关的系统特性。
DSDT
DSDT所定义的table和其他的table的区别不太,都是紧跟着一个相同的头文件,但是,DSDT这个table是不可卸载的。在系统进入初始化的时候,会通过Fixed ACPI Description Table 当中的指针来找到DSDT,并且根据DSDT的内容来定义ACPI Namespace。
利用RW这个tool可以在OS下查看相关的table,DSDT如下:
SSDT
Secondary System Description Tables (SSDT) 是紧跟着DSDT之后的,在ACPI Namespace创建完成之后,每一个SSDT都会在RSDT/XSDT中装载出不同的OEM Table ID。
查看OS下的SSDT,结果如下:
FACS
FACS是在读写内存中的一种结构,BIOS用它来实现固件和OS之间的信息交换(handshaking )。通过FADT(Fixed ACPI Description Table),FACS被转到兼容ACPI的OS中。FACS包含上次启动时的系统硬件签名,firmware waking vector,和Global Lock。
OS下的FACS
在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的电源状态
G2:Soft Off,对应S状态的S5状态,是软关机状态,在软关机状态下的特点如下: ·不可运行应用程序和操作系统(保留在G2状态中)。 ·除了主要的电源供电单元,基本上会关闭整个系统。 ·功耗约等于零。 ·需重启系统,唤醒延迟时间比较长。
G3:Mechanical Off,机械性关机,即硬件关机,其特点如下: ·通过切断总电源来彻底关闭计算机。 ·只有实时时钟工作。 ·不考虑电池,功耗为零。 ·切换到工作状态的时间比较长。
全局状态总结如下表所示:
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能耗,完全关闭设备。
设备电源状态总结如下:
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。
· 唤醒需要将系统进行重新启动
睡眠状态总结如下:
工作状态,睡眠状态,软关机状态转换图
1.3.4 处理器电源状态
ACPI在G0状态下定义了4种不同的处理器电源状态,分别为C0,C1,C2,C3,其转换关系如下图:
处理器电源状态C0:在这个状态下,CPU正常工作,执行指令。
处理器电源状态C1:即挂起状态,这个状态下CPU的唤醒极快。
处理器电源状态C2:这个状态比C1更加节能,但唤醒时间也略大一点。
处理器电源状态C3:深度睡眠状态,唤醒时间长。
除以上几个状态外,ACPI还可选择C4,C5…Cn等状态,其区别在下表简略说明:
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)函数可以获知使用的是哪一种数据类型:
2.2.3 ASL的常用函数
1.定义变量的函数 name(x,****);
前面提到定义变量不需要定义变量类型,直接使用函数定义即可,如
name(temp,100) //定义一个整数
name(str,“hello”) //定义了一个字符串
2.赋值函数 store(),如
store(0x99, Local0)
store(“Hello”, Local1)
在ASL中算数运算也不是采用+,—,*,/等,而是使用函数,常用的如下表所示:
2.2.4 ASL的域
在root下一共存在5个不同的域,用来负责不同的事件
\_GPE, 主要负责ACPI的事件处理
\_PR, 处理器相关
\_SB, 所有的设备和总线
\_SI, 系统指示灯
\_TZ, Thermal相关,用于读取某些温度值
2.2.5 ASL的设备配置
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!