UEFI/BIOS"/>
UEFI/BIOS
文章目录
- 什么是ACPI
- APCI系统架构流程
- ACPI定义的电源状态转化结构图
- ACPI表
- 什么是ASL
- ACPI睡眠状态之S3
什么是ACPI
高级配置和电源管理接口,APCI是一套协议标准,软硬件都需要实现以配合使用。
大致作用:
ACPI在BIOS中负责管理计算机的电源状态和配置,支持系统休眠、唤醒等高级电源管理功能
APCI系统架构流程
由上面的结构可知:它的规范所设计主要是由上图红框,ACPI registers组成、ACPI BIOS、ACPI Tables三部分组成。首先需要硬件支持,并提供ACPI需要使用的寄存器,然后还需要一系列的表来规定划分模块和定义接口,最后接着bios需要支持ACPI,实现并提供相应的回调。
ACPI可以实现的功能包括:
1.系统电源管理(System power management)
2.设备电源管理(Device power management)
处理器电源管理(Processor power management)
3.设备和处理器性能管理(Device and processor performance management)
4.配置/即插即用(Configuration/Plug and Play)
5.系统事件(System Event)
6.电池管理(Battery management)
7.温度管理(Thermal management)
8.嵌入式控制器(Embedded Controller)
9.SMBus控制器(SMBus Controller)
ACPI定义的电源状态转化结构图
G0/G1/G2/G3表示整体的状态,S1/S2/S3/S4/S5表示睡眠状态, C1/C1…/Cn和P0/P1…Px就是Pstates(EIST)和CStates,D0/D1/D2/D3表示不同的设备电源状态。G/C/S等状态,后接的数字越大,系统耗能越少。
ACPI表
ACPI表是一组数据结构,每个结构体都有固定的表头格式,以及自己特有的格式,它们提供了有关系统硬件的信息,以便操作系统能够识别和管理硬件设备。这些表包括一些预定义的表,如DSDT(Differentiated System Description Table)、FADT(Fixed ACPI Description Table)和SSDT(Secondary System Description Table),以及其他可选的表。
-
DSDT(Differentiated System Description Table):这是最重要的ACPI表,它描述了系统的主要硬件配置,包括主板、CPU、内存、PCI设备等。操作系统启动时会首先解析DSDT表,以获取系统硬件信息。
-
FADT(Fixed ACPI Description Table):这是ACPI规范必需的表,它定义了ACPI系统的基本硬件特性,如电源状态、睡眠状态、唤醒设备等。FADT表用于指导操作系统如何管理系统电源。
-
SSDT(Secondary System Description Table):这是可选的表,用于描述某些特定的硬件设备,如温度传感器、风扇控制器、专用硬件设备等。如果系统中有这些特殊设备,则会包含对应的SSDT表。
-
MADT(Multiple APIC Description Table):这是可选表,用于描述高级可编程中断控制器(APIC)以及中断源。如果系统使用APIC,则会包含MADT表。
-
MCFG(PCI Express Memory Mapped Configuration Space Base Address Description Table):这是可选表,用于描述PCI Express总线上的PCI Express配置空间。如果系统使用PCI Express,则会包含MCFG表。
-
XSDT(Extended System Description Table):这是可选表,与DSDT表类似,描述系统的全部ACPI表。XSDT表支持更大的表地址空间,可引用更多的ACPI表。
-
其他可选表:如BERT(Boot Error Record Table)、CPEP(Corrected Platform Error Polling Table)、EINJ(Error Injection Table)等。
为了让OSPM能够控制计算机上的设备的资源和热插拔,ACPI提供了一种描述这些设备的信息和控制方式的结构,称为ACPI Definition Blocks,它们按照一种层级结构组织,这种组织方式成为ACPI Namespace。这个命令空间的开始是ROOT,符号“/”,下面又分配了几个预定义的命令空间:
ACPI Definition Blocks包含在DSDT(Differentiated System Description Table)和很多的二级表(SSDT,Secondary System Description Tables)之中。
ACPI中二级表可以又很多,并且可以不断增加。
ACPI表由BIOS创建,并存放在内存中,OS需要一个入口去获取到所有的表。
入口由BIOS放在某个固定的位置(对于Legacy BIOS和UEFI,OS获取的方式不同),这个入口被称为RSDP,Root System Description Pointer。它是一个结构体,其结构如下:
struct acpi_table_rsdp {char signature[8]; /* ACPI signature, contains "RSD PTR " */u8 checksum; /* Checksum of the first 20 bytes */char oem_id[6]; /* OEM identification */u8 revision; /* Must be 0 for 1.0, 2 for 2.0 */u32 rsdt_address; /* 32-bit physical address of the RSDT */u32 length; /* Length of table in bytes, including header */u64 xsdt_address; /* 64-bit physical address of the XSDT */u8 extended_checksum; /* Checksum of entire table */char reserved[3]; /* Reserved, must be 0 */
};
该结构体中,重要的字段有:
- signature:必须为"RSD PTR ",用以标识该表
- revision:RSDP规范版本,0表示1.0版,2表示2.0版
- rsdt_address:32位RSDT表的物理地址
- xsdt_address:64位XSDT表的物理地址
举例:
// 找到RSDP表
struct acpi_table_rsdp *rsdp;
rsdp = search_rsdp();// 找到DSDT表
if (rsdp->revision == 0) dsdt = (struct acpi_table_header *)rsdp->rsdt_address;
elsedsdt = (struct acpi_table_header *)rsdp->xsdt_address;
首先搜索得到RSDP表的地址,然后根据revision字段判断RSDT地址是32位还是64位,从而得到DSDT表的地址,这样就可以解析DSDT表,获取系统ACPI信息了。
=-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=
上面的RSDP结构体中,提供了两个主要的物理地址,一个是RSDT表,另外一个是XSDT表。
RSDT表全称Root System Description Table,它存放了许多的指针,指向其它的描述系统信息的表。RSDT的结构如下:
typedef struct {EFI_ACPI_DESCRIPTION_HEADER Header;UINT32 Entry;
} RSDT_TABLE;
XSDT表全称Extended Root System Description Table,它的作用于RSDT一样,区别在于两者包含的指针地址一个是32位的,一个是64位的。XSDT表结构如下:
typedef struct {EFI_ACPI_DESCRIPTION_HEADER Header;UINT64 Entry;
} XSDT_TABLE;
RSDT和XSDT在本质上没有区别,它们都是OS用来找到ACPI表的地图:
XSDT(RSDT)指向的第一张表都是FADT,Fixed ACPI Description Table。这个表里面包含了OS需要知道的所有ACPI硬件相关寄存器(ACPI Hardware Register Blocks,就是下图的GPx_BLK等),还包含DSDT,Differentiated System Description Table,该表包含大量的硬件信息。
这些信息包含在称为Differentiated Definition Block的结构中,它使用一种特殊的语言AML(ACPI Machine Language)表示,而AML语言又通过ASL(ACPI Source Language)编译而成,OEM厂商通过自己写ASL来表示自己的硬件设备信息供OS使用。OS可以利用这些Definition Block来进行各种相关的操作
什么是ASL
ASL(ACPI Source Language)是ACPI的源代码语言,用来定义ACPI表如DSDT,SSDT等。
ASL语言具有以下特征:
- 类似于C语言,同时也支持ACPI定义的关键字和数据类型
- 用来定义ACPI表中包含的对象,如设备,方法,操作区等
- 支持宏定义,条件编译等
- 支持继承,一个定义可以扩展前一个定义
- 支持 Default 关键字,为对象提供默认值
举个简单的例子:
例如:
DefinitionBlock ("SSDT.aml", "SSDT", 2, "ACPI", "Subsystem", 0x00000000)
{External (\_SB.PCI0, DeviceObj)External (\_SB.PCI0.GFX0, DeviceObj)Scope (\_SB.PCI0.GFX0){Method (_DOD) {Return (2) // Device On, Device Stay On}Method (_DOS, 1) {Store (Arg0, \_SB.PCI0.GFX0._FUN023) // Set Display State}// Other definitions...}
}
该例子定义了一个SSDT表,其中包含_SB.PCI0.GFX0域的_DOD方法和_DOS方法,这两个方法就是用ASL语言定义的。
编译ASL代码,可以得到ACPI表的二进制数据,这就是操作系统最终加载和解析的ACPI表数据了。OS到时候就不需要直接去与底层硬件沟通,它只要直接操作这些Asl生成的内容就可以了
所以,ASL是ACPI实现的基石,通过它我们可以根据系统硬件特性,灵活定制ACPI表,为操作系统提供丰富的电源管理功能。
具体学习ASL博客链接:
.html
ACPI睡眠状态之S3
ACPI的睡眠状态S3对应于系统的挂起到RAM(Suspend to RAM)状态。
S3睡眠状态的主要特征是:
- 系统的主存储器内容会被保留,所以睡眠后可以很快恢复运行状态
- CPU和大部分周边设备被关闭,可以省电
- 恢复运行后,系统状态与睡眠前基本相同,运行环境不变
该状态由BIOS和操作系统共同管理。当系统进入S3状态时,操作系统会:
- 停止大部分硬件设备运作
- 将内存内容保留
- 将CPU置于低功耗状态
- 通知BIOS系统已进入S3状态
BIOS收到通知后,会关闭除必要设备外的其他所有设备,如USB控制器,网络卡等,使系统进入极低功耗状态。
当唤醒系统时,BIOS会重新打开硬件设备,然后操作系统继续从S3前的状态恢复运行。
所以S3状态需要操作系统与BIOS的配合,才能实现低功耗且快速恢复的目的。这也体现了ACPI规范对系统电源管理的设计思想。
总结来说,ACPI中定义的S3睡眠状态,对应于操作系统实现的Suspend to RAM功能。通过该状态,系统可以在短时间内快速恢复,同时也可以节约较多功耗,实现良好的低功耗特性。
更多推荐
UEFI/BIOS
发布评论