【UEFI基础】ACPI基础

本文详细介绍了ACPI(高级配置和电源管理接口)的概念、作用及其实现方式。包括ACPI的各种状态(G、C、S等状态)、ACPI表的结构与获取方法、以及ACPI中的AML语言等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是ACPI

配置和源管理接口(Advanced Configuration and Power Management Interface)。

ACPI是一套协议标准,软硬件都需实现以配合使用。

ACPI的作用

ACPI提供了一整套的API供OS使用,使OS能够替代BIOS来进行电源管理,当然前提是软硬件都需要支持。

另外,实际上也不只是电源管理,还有很多的事情是ACPI可以做的,比如:

1  系统电源管理(System power management)

  ACPI定义了一套使计算机作为一个整体出入睡眠状态(G状态S状态,G0/S0表示正常状态,数字越大表示睡得越深),通过设备唤醒计算机的机制。

2  设备电源管理(Device power management)

  ACPI表描述了计算机包含的设备以及它们的电源状态(D状态,D0表示正常状态,数字越大性能和耗能越小),使设备进入不同电源状态的控制方式。

3  处理器电源管理(Processor power management)

  OS在空闲状态时,OSPM通过ACPI使CPU进入不同的电源状态(C状态,C0是正常状态,数字越高表示越low-power)。

4  设备和处理器性能管理(Device and processor performance management)

  当系统处于活动状态时,OSPM通过ACPI可以将设备和CPU设置成不同的性能状态,以达到性能和功耗的平衡。

5  配置/即插即用(Configuration/Plug and Play)

  ACPI定义了一系列的设备信息,它们按照层级结构组织,通过这些信息OS可以知道设备的状态以及插拔情况。

6  系统事件(System Event)

  ACPI提供的一种事件机制用于处理温度变化,电源管理和设备插拔等事件。

7  电池管理(Battery management)

  电池管理从BIOS转到了支持ACPI的OS,OS可以通过管理电池的接口直接管理电池。

8  温度管理(Thermal management)

  因为OS控制了设备和CPU的电源和性能,所以也需要通过ACPI来管理温度,ACPI中可以方便的定义温度区域,温度指示器和冷却温度区域的方法。

9  嵌入式控制器管理(Embedded Controller)

  ACPI定义了一套软硬件接口,可以使OS可以和计算机上的其他嵌入式控制器方便地交流。

10  SMBus控制器管理(SMBus Controller)

  ACPI定义了一套软硬件接口,可以使OS可以和计算机上的SMBus控制器及其连接的设备方便地交流。

等等。

由于ACPI规范已经到了第六版,不同版本的支持不一样,需要根据实际的版本来确定支持的功能。

ACPI的实现

OS能够使用ACPI需要硬件、BIOS和设备驱动的支持。

下图是ACPI在处理器架构中的位置。

或者更复杂的结构:

上图红框部分就是ACPI需要实现的东西。

首先需要硬件的支持,并提供ACPI需要使用的寄存器。

接着需要一系列的表来规定划分模块和定义接口。

接着BIOS需要支持ACPI,实现并提供相应的回调。

ACPI定义的状态

ACPI中定义了大量的电源状态,且根据不同的角度又有不同的分类,且不同的分类之间又所有交叉,总的来说有这么几种状态:

G-States:这个是总的系统状态,Global System States。

有下面的几种:

C-States:C状态是在G0状态下的一种分类,它的主要方式是通过改变CPU的工作模式来降低功率。下面是几种分类:(C1E=C1+最低频率的P-State)

P-States:也称为EIST(Enhanced Intel Speed Step Technology),或者dynamic frequency and voltage scaling,它主要通过控制CPU频率和电压来进行电源管理。它可以使能和去使能,而P-States的真正含义就是(频率,电压)这么一个表达式。

S-States:睡眠状态,主要是G1和G2状态下的分类。比较常见的有S3,即System to RAM,系统挂起到内存。

下面是几种状态的一个关系表:

几点说明:

1.G/C/S等状态,后接的数字越大,系统耗能越少。

2.不同系统支持的状态不一样,上图中的这些状态仅用于说明,具体支持状态还是需要查相关的手册。

3. 各个状态之间的切换:

ACPI表

为了让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。它是一个结构体,其结构如下:

typedef struct {
  UINT64  Signature;
  UINT8   Checksum;
  UINT8   OemId[6];
  UINT8   Revision;
  UINT32  RsdtAddress;
  UINT32  Length;
  UINT64  XsdtAddress;
  UINT8   ExtendedChecksum;
  UINT8   Reserved[3];
} EFI_ACPI_6_1_ROOT_SYSTEM_DESCRIPTION_POINTER;

其中提供了两个主要的物理地址,一个是RSDT表的,另一个是XSDT表的。

RSDT表全称Root System Description Table,它存放了许多的指针,指向其它的描述系统信息的表。RSDT的结构如下:

typedef struct {
 EFI_ACPI_DESCRIPTION_HEADER Header;
 UINT32                      Entry;
} RSDT_TABLE;

它实际上是一个可变数组,后面可以接很多的表项。而该结构的前面部分又被定义为EFI_ACPI_DESCRIPTION_HEADER:

typedef struct {
  UINT32  Signature;
  UINT32  Length;
  UINT8   Revision;
  UINT8   Checksum;
  UINT8   OemId[6];
  UINT64  OemTableId;
  UINT32  OemRevision;
  UINT32  CreatorId;
  UINT32  CreatorRevision;
} EFI_ACPI_DESCRIPTION_HEADER;

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来进行各种相关的操作(具体操作已经列在ACPI的作用那一节)。

ACPI定义了很多的表,这里不一一说明,下面是其中的一些:

• 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 Feature Table (RASF)
• Memory Power State Table (MPST)
• Platform Memory Topology Table (PMTT)
• Boot Graphics Resource Table (BGRT)
• Firmware Performance Data Table (FPDT)
• Generic Timer Description Table (GTDT)
• NVDIMM Firmware Interface Table (NFIT)

ACPI Spec的第五章ACPI Software Programming Model中对它们有介绍。

下面是一个笔记本上得到的所有APCI表:

上述的表中只有DSDT和SSDT中包含Difinition Blocks,比如其中的一个SSDT:

更详细的介绍在http://uefi.org/acpi网站中的LINKS TO ACPI-RELATED DOCUMENTS。

如何获取ACPI表

在Windows系统中,可以通过RW工具来查看。

可以在如下的网站下载到:

RWEverything – Read & Write Everything

当然这个工具的功能很丰富,ACPI读取只是其中的一个部分。

ASL

前面已经讲到了ASL语言用来编写用于表示Definition Block的AML。AML会被内核中的AML解析器解析,并根据解析得到的内容来完成相应的操作。

所以需要了解ASL语言的基本用法,具体可以参考ACPI Spec的第十九章ACPI Source Language(ASL) Reference。 

也可以参考【UEFI基础】ASL语言,这是我自己写的,因为自己也在学习中,难免有理解错误的地址,有错请指正。

### 回答1: ACPI(高级配置和电源接口)是现代计算机系统中负责管理硬件和电源的重要组件。编写ACPI编程代码是深入了解和掌握系统的关键。 ACPI编程的入门首先需要了解ACPI的原理和基本概念。ACPI主要包括了ACPI表、ACPI命名空间、ACPI方法、ACPI设备和ACPI事件等组件。其中最重要的是ACPI表,它是存储ACPI配置和信息的数据结构,在操作系统启动时由固件(如BIOS或UEFI)提供。 接下来,我们需要学习如何使用UEFI提供的接口来访问ACPI表。UEFI是用于取代传统BIOS的新一代固件接口标准,它提供了许多用于操作硬件的接口函数。在UEFI内核导读中,我们可以学习到如何使用UEFI提供的接口函数,如GetSystemTable和LocateProtocol来获取ACPI表。 一旦获取了ACPI表,就可以使用ACPI编程来操作和管理系统的硬件。我们可以通过解析ACPI表的结构和字段来获取硬件信息,如处理器、硬盘和显卡等。同时,ACPI编程还可以用于配置和控制硬件,如设置电源管理策略、启用和禁用设备等。 在ACPI编程入门中,我们也需要学习如何处理ACPI事件。ACPI事件是指硬件状态或系统事件的通知,如按键事件、电源事件和温度事件等。通过注册和处理ACPI事件,我们可以编写更加智能和灵活的系统管理代码。 最后,了解ACPI编程的最佳实践和调试技巧也是非常重要的。ACPI编程常常需要谨慎处理硬件和系统的复杂逻辑,同时需要进行灵活的错误处理。熟悉ACPI规范和文档,以及使用调试工具来分析和解决问题,都是提高ACPI编程效率和质量的关键。 总之,ACPI编程是一项重要而复杂的任务,通过学习UEFI内核导读中的ACPI编程入门知识,我们可以更好地了解和掌握ACPI的原理和操作方法,为开发和管理现代计算机系统提供强大的工具和技术支持。 ### 回答2: 《UEFI内核导读》中的ACPI编程入门章节主要介绍了在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI (Advanced Configuration and Power Interface) 是一种用于操作系统和硬件之间通信的标准接口,它定义了电源管理、设备配置和配置信息传递等功能。 ACPI编程的入门主要包括以下内容: 1. ACPI的概述:介绍了ACPI的基本概念、作用和结构,说明了在UEFI中如何使用ACPI来进行设备配置和管理。 2. ACPI表:解释了ACPI表的类型和作用,如DSDT(Differentiated System Description Table)、SSDT(Secondary System Description Table)等,以及如何在UEFI中获取和使用这些表。 3. AML语言:AML(ACPI Machine Language)是一种用于编写ACPI表的高级语言,介绍了AML的基本语法和常用指令,以及如何在UEFI中加载和执行AML代码。 4. 设备电源管理:讲解了如何使用ACPI进行设备电源管理,包括睡眠、唤醒和电源状态转换等操作。 5. 事件和中断处理:说明了如何使用ACPI来处理系统事件和中断,以及如何编写ACPI方法来响应这些事件和中断。 通过学习这些内容,读者可以掌握在UEFI环境下进行ACPI编程的基础知识和技巧。ACPI编程在UEFI开发中起着重要的作用,对于实现系统设备管理和电源管理等功能非常重要,对于理解和使用UEFI内核也具有重要意义。 ### 回答3: acpi(高级配置和电源接口)是一种被广泛使用在现代计算机系统中的标准,用于管理硬件设备的电源管理和配置信息。在UEFI(统一可扩展固件接口)内核导读中,acpi编程入门是其中一个重要的主题。 acpi编程入门的目的是让开发者了解如何使用acpi来控制硬件设备的电源管理和配置操作。acpi提供了一组标准的接口和语言,使开发者可以编写具体的acpi代码来实现特定的功能。通过acpi编程,开发者可以实现诸如电源管理、设备状态监控和系统配置等功能。 在acpi编程入门中,首先需要了解acpi的基本概念和架构。acpi的核心是acpi表,它包含系统的配置信息和控制信息。开发者需要了解如何解析和读取acpi表,以获取系统的配置信息。同时,了解acpi命名空间和对象模型,可以帮助开发者理解acpi中的各个组件和其关系。 在实际的acpi编程中,开发者需要学习acpi语言(ASL)和acpi命令(AML)。ASL是一种类似于C语言的高级语言,用于编写acpi代码。AML是一种二进制格式的编码,用于实际执行acpi代码。了解如何编写和编译ASL代码,并将其转换为AML代码是开发者的关键任务。 此外,理解acpi的工作原理和常见的acpi编程技巧也是入门的重要内容。开发者需要知道如何注册和操作acpi设备,如何监听和处理acpi事件,以及如何控制电源状态和硬件配置。 总之,在UEFI内核导读中,acpi编程入门是为开发者提供的一项重要教学内容。通过学习acpi编程,开发者可以更好地理解和掌握UEFI系统中的电源管理和硬件配置操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值