什么是ACPI?
ACPI的全称是Advanced Configuration and PowerInterface。它是由早期的APM发展和改进起来的,其主要作用是为操作系统提供一套标准的电源管理接口。
ACPI关键概念:
什么Gx State, Cx State, Sx State:
Power Management State(电源管理状态)
为了方便电源管理,ACPI Specification 中定义了四种关键的电源管理状态:
- G0 --Working State 工作态(S0)
- G1 --Sleeping State 睡眠态(S1-S4)
- G2 --Soft-off State (S5)
- G3 --Mechanical -off State
- S0 --对应G0,运行态
- S1 --系统时钟停止,处理器停止
- S2 --系统 Cache清除,处理器停止
- S3 --Suspend to RAM
- S4 --Suspend to Disk
- S5 --Soft-off
- C0 -- 工作态,全速运行
- C1 -- CPU停止工作
- C2 -- 低功耗,高延时
- C3 -- 更低功耗,更高延时
- D0 -- Full Power 全速
- D1 -- 中间态
- D2 -- 比D1能耗低,延时高
- D3 -- Off
- ASL & AML Language
ASL是一种解释性的语言,由它可以编译成支持ACPI的OS认识的AML语言。
- ACPI Control Method (ACPI控制方法)
类似于C语言中的函数,AML的函数叫做Method. 跟据ACPI的规范,BIOS提供了一些标准的Method给OS调用。例如_PTS, _WAK等等。
ACPI常用的寄存器,及寄存器位的含义
ACPI_ENABLE, 当向SMI_CMD写入这个值的时候,系统将触发事件进入ACPI模式 GPE0_BLK, GPE1_BLK General Purpose Event 0 and General Purpose Event 1 Block P_BLK Processor Controlling features. 处理器功能相关 SCI_EN 如果置1,将使用SCI中断, 如果清零,将使用SMI中断 SLP_EN 用于切换Sleeping State,一般和SLP_TYPE一起使用 SLP_TYPE 当SLP_EN置1的时候,系统将进入到SLP_TYPE所定义的状态 SMI_CMD SMI Command Port WAK_STS 当系统由睡眠态被唤醒时,此位被置位 X_GPE0_BLK, X_GPE1_BLK Extended General Purpose E vent X_Firmware_Waking_Vector 64 bits firmware waking vector
SCI 和 SMI的区别?
SCI是针对ACPI的叫法,SMI是针对APM的叫法。
SCI is a system interrupt used by hardware to notify the OS of ACPI events.
SMI is OS-transparent interrupt generated by interrupt event on legacy systems
常用的ACPI Table名称及含义
ACPI BIOS主要使用ACPI Table来描述主板上的所有资源,OS以此来对系统进行电源管理。
ACPI的主要结构如下所示:
常见的ACPI Table如下:
FACS:Firmware ACPI Control Structure
FACS是BIOS用来完成firmware与OS之间交互的这样一种内存结构, 它主要包含了以下三个部分:
- Hardware Signature:
- Firmware Waking Vector : 在Waking Vector中主要保存了唤配系统后应该执行的程序的物理地址。
- Global Lock:主要用于OS和firmware在访问硬件资源的时候同步。
FADT:
RSDT:
MADT:
DSDT: Differentiated System Description Table
SSDT: Secondary System Description Table
PSDT:
DSDT首先被OS加载,然后是SSDT。
先说BIOS初始化的流程吧,BIOS由Boot Vector启动后,首先要判断一下Sleep Type,
Sleep Type == S2: 如是要是从S2状态被唤醒的,则只用初始化CPU, Enable内存和配置一下cache就可以直接时Waking Vector了;
Sleep Type != S2: 初始化CPU, 初始化内存控制器,使能内存,配置Cache,使能Cache,初始化Chipset
再判断Sleep Type是否等于S3:
Sleep Type == S3: 直接跳到Waking Vector
Sleep Type != S3: 判断Sleep Type 是否等于S4:
Sleep Type == S4BIOS: 重新装载memory image, 然后转入Waking Vector
Sleep Type != S4BIOS: 说明从S4 Boot, 需要重新post然后时OSBootloader
图figure 16-74中显示了OS初始化的流程:
这里可以看到,有两条路径可以进入到OS:
一条是通过OS boot loader, 这条路径是S4进入时走的
另一条是通过Waking Vector,这条路径是由S2, S3状态被唤醒时走的