【UEFI基础】ACPI基础

什么是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语言,这是我自己写的,因为自己也在学习中,难免有理解错误的地址,有错请指正。

  • 51
    点赞
  • 290
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
The Advanced Configuration and Power Interface (ACPI) specification was developed to establish industry common interfaces enabling robust operating system (OS)-directed motherboard device configuration and power management of both devices and entire systems. ACPI is the key element in Operating System-directed configuration and Power Management (OSPM). ACPI evolved the existing pre-ACPI collection of power management BIOS code, Advanced Power Management (APM) application programming interfaces (APIs, PNPBIOS APIs, Multiprocessor Specification (MPS) tables and so on into a well-defined power management and configuration interface specification. ACPI provides the means for an orderly transition from existing (legacy) hardware to ACPI hardware, and it allows for both ACPI and legacy mechanisms to exist in a single machine and to be used as needed. Further, system architectures being built at the time of the original ACPI specification’s inception, stretched the limits of historical “Plug and Play” interfaces. ACPI evolved existing motherboard configuration interfaces to support advanced architectures in a more robust, and potentially more efficient manner. The interfaces and OSPM concepts defined within this specification are suitable to all classes of computers including (but not limited to) desktop, mobile, workstation, and server machines. From a power management perspective, OSPM/ACPI promotes the concept that systems should conserve energy by transitioning unused devices into lower power states including placing the entire system in a low-power state (sleeping state) when possible. This document describes ACPI hardware interfaces, ACPI software interfaces and ACPI data structures that, when implemented, enable support for robust OS-directed configuration and power management (OSPM)
### 回答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、付费专栏及课程。

余额充值