完全解读:Advanced Configuration and Power Interface
Advanced:为什么说它是advanced呢,主要是它替代了以前的APM,APM全称是 Advanced Power Management(高级电源管理),他是一种基于BIOS的系统电源管理方案,它提供CPU和外设电源管理并通过设备工作超时设定来决定何时将设备切换到低功耗模式。目前最新的版本是1.2,相对于1.0和1.1版来说,最新版的APM方案由操作系统来定义管理实践,实际的执行动作还是由BIOS来做。由于缺陷逐渐明显,ACPI就产生了。
Configuration and Power:说明这个接口的作用,配置和电源相关
Interfac:表明是个interface, 一种工业标准规范或接口,连接OS, BIOS, 驱动和硬件
电源管理是做什么的:通过Event 进行low power state和normal working state的相互切换
当sleepbutton按下以后,SLPBTN_STS寄存器会被置1,SLPBTN 是默认置1,这样就会产生Event ,进行一系列动作保证系统按照下面的设置进行电源的控制。
下图展示OSPM/ACPI相关软、硬件组件以及它们彼此之间的关联。
• 虚线框起来的,是ACPI规范所涉及的,主要有三部分组成: ACPI Registers, ACPI BIOS, ACPI Tables
全局状态(Global System States)
电源状态是系统或设备的各种省电状态的统称, 类似于S3, S4等
G0 Working, G0 = S0, 系统正常执行状态
G1 Sleeping,消耗少量的电源,不需要重新启动就可以直接回到working状态
G2 Soft Off, G2 = S5,即关机状态,相对于G3来说,插了电源,需要重新启动系统才能进入working状态
G3 Mechanical Off, 所有的电都拔掉,可以任意拆机 (注意RTC)
S0, 正常工作状态
S1,Sleeping with processor context maintained,其实就是Windows下的standby。CPU停止工作,不执行指令,但是,CPU, Chipset 以及RAM内容没有丢。此状态可以快速恢复到working状态。
S2,类似S1,比S1睡的更深,更省电。CPU停止工作, CPU和Cache上下文内容丢失,RAM处于带电状态。(基本不会接触)
S3,suspend to RAM, 除了内存外的其它电源,如CPU, chipset 都移除。除了内存外,未保存其它所有系统上下文,如CPU, Cache, chipset等。系统内容和状态暂存于RAM中,如果wake event发生,BIOS不会再初始化CPU, chipset, RAM,而是直接从S3中恢复系统。RAM带电,如果电源掉电,RAM内容丢失。
S4,suspend to disk, 电源完全关闭,系统内容和状态储存disk,当系统收到唤醒信号后,首先从Disk中恢复memory. 电源掉电,内容不丢失。
S5,soft off, 电源完全关闭,相对于S4来说,系统内容和状态不被储存,需要一个完整的启动过程才能到工作状态。
Device state设备电源状态
D0(Fully-On),device电源消耗最大状态,工作状态,设备可以完全操作和响应(The device is completely active and responsive),设备可以记住上下文(context)。
D1(Optional),比D2耗电,定义依不同device而不同。
D2(Optional),比D1更省电的状态,定义依不同device而不同。
D3(Off),device电完全移除,device context 丢失,要到D0状态必需OS software重新对其初始化。
CPU state
C-state是APIC SPEC定义的CPU在G0下的power states。这些状态都是在G0下,也就是说是在system active下的。其中只有C0下,CPU才执行指令,其它C状态,
CPU处于sleep状态。
C0,CPU工作中,执行命令
C1,CPU 大部分clock停止,执行halt指令后
C2,CPU clock停止
C3,CPU clock停止,且cache snoop 停止
C4, C5, … C10
Performance state
设备和处理器性能状态,是指设备和处理器在active/executing状态,也就是设备是D0,处理器是C0,在这种情况下对性能的评比。也就是让OSPM在性能和功耗之间找到折中。
P0,当设备或处理器在此状态时,会达到最高的性能,当然消耗的电量也是最大的
P1,在些状态,设备或处理器的性能被限制在最高能力之下,设备或者处理器消耗的电量比P0时小一点。
Pn,在此状态,设备或处理器的性能处于最低,当然,电量消耗也是最少的。n 是性能状态数。
ACPI table就是一个个在内存中的结构体, 每个结构体都有固定的表头格式 (下图), 以及自己特有的格式
ACPI spec定义了一些固定格式的table, 如XSDT, RSDT, FACP, DSDT等, OEM可以新增属于自己的特殊table, 格式可自定
常见ACPI table及其关系
OS初始化时,OSPM先找到RSDP,然后,再由RSDP中定义的物理地址来定位RSDT or XSDT,再由RSDT or XSDT定位其它table
OSPM是如何找到RSDP的,legacy下,在内存空间0E0000H到0FFFFFH之间找到 RSD PTR; UEFI 下,OS loader找ACPI 的GUID。
Extended System Description Table, XSDT结构以signature “XSDT” 开始,里面有很多指向其它表头的物理地址。这些物理地址是64bit,相对于RSDT的32bit。有了这些地址,就可以找到其它表。在HE.exe 里可以直接查看
Fixed ACPI Description Table, FADT是所有ACPI表中最重要的表。一开始叫FACP,ACPIready都在这个部分里
FADT包含了很多重要的filed。
Preferred_PM_Profile, 首选的电源管理轮廓,由BIOS填写,装系统时, OSPM根据这个字段来设置默认的电源管理策略。 1, desktop; 2, mobile; 3, workstation; 4, server, …
以Desktop为例;在ACPI spec的 FADT Format中阐述了每一位的具体作用,结合HE.exe就可以读出该设备是台式机 笔记本或者其他。
SCI_INT, SCI对应的中断向量,一般是IRQ9
SMI_CMD, SMI 命令所在的系统端口地址, default情况下, intel 是0xb2, AMD 是0xb0
ACPI_ENABLE, 将此值写入SMI_CMD port,用来通知BIOS, OS要由SMI模式切换到ACPI模式。
ACPI_DISABLE, 将些值写入SMI_CMD port,用来通知BIOS, OS要由ACPI模式切到SMI模式
PM1a_EVT_BLK, PM1a_EVT_BLK的port address
PM1b_EVT_BLK, PM1a_CNT_BLK , ……… , GEP1_BLK, 这些都是port address
PM1_EVT_LEN, ……, GPE1_BLK_LEN,这些都是长度
GPE1_BASE,
P_LVL2_LAT, 进入和退出C2状态的最长硬件延时,如果值大于100,则表示不support C2状态。
P_LVL3_LAT, 进入和退出C3状态的最长硬件延时,如果值大于1000,则表示不support C3状态。
IAPC_BOOT_ARCH, OS初始化时,会根据此字段的值判断硬件平台上有没有这些legacy设备,有的话就初始化,没的话,就跳过。 Bit0=1,表示主板支持LPC或ISA总线上挂的设备; Bit1 = 1, 表示主板上有KBC(8042 OR EC);等等
PWR_BUTTON, 表示power button功能是否属于fixed hardware feature
重要性2: 包含了其它两个表的地址,FACS, DSDT。其中DSDT中包含了所有OEM ASL,也就是OEM厂商在BIOS中使用ASL语言定义的自己的对象和控制方法,都可以在DSDT表中找到。
语法规则
Method(JINT, 2) //定义一个函数,函数名是JINT,输入参数有2个
{
//函数实体
//Arg0, fist parameter, 无需定义, 可直接用
//Arg1, second parameter, 无需定义, 可直接用
Store(Arg0,Local0)
Store(Arg1,Local1)
Add(Local0,Local1,Local1)
Return (Local1)
}