【UEFI基础】Resource Descriptors for ACPI

综述

在ACPI中,描述设备的时候需要知道它需求的资源,这个时候就需要使用到Resource Descriptor这样一种结构。

在ASL语言中,有一大类的操作符就是用来创建Resource Descriptor的,如下图所示(来自《ACPI Spec》, 下同):

关于这些Resource Descriptor,大致可以分为两类,它们是根据Resource Descriptor结构体占据的大小作区分的,分别是Small Resource Data Type和Large Resource Data Type 。

Small Resource Data Type

这种类型的Resource Descriptor总大小一般是2到8个字节,具体各个字节的描述如下图所示:

第一个字节表示了Resource Descriptor的类型(包括是Small还是Large以及具体是那种设备或者功能类型)、长度(3个BIT,所以最长是8个字节,包括第一个字节)以及类型(BIT3-6共4个字节,所以最多有16个类型)

之后的字节对于不同类型的Resource Descriptor有不同的表示。

Small Resource Data Type有如下的几种类型:

下面具体说明每一种类型以及对应的ASL操作符。

IRQ Descriptor

这种类型的Resource Descriptor表示了设备支持的中断号及其它相关信息。

这个Descriptor只能处理IRQ个数为15的情况(两个8259控制器级联,可以参考【UEFI基础】x86架构中断基础介绍),它包含16位共两个字节来表示IRQ个数。

另外描述中断信息还需要一个字节。因此最多四个字节,如下所示:

需要注意的是Byte 3是可选的,如果没有就使用默认的配置。

IRQ Descriptor对应的ASL操作符是IRQ和IRQNoFlags,其中IRQNoFlags就对应Byte 3不存在的情况。这两个操作符的用法如下所示:

DMA Descriptor

这种类型的Resource Descriptor描述了设备使用的DMA资源,包括DMA Channel和相关的属性,如下图所示:

DMA Descriptor对应的ASL操作符是DMA,具体的用法和举例如下所示:

Start Dependent Functions Descriptor和End Dependent Functions Descriptor 

这两个Descriptor是用来描述逻辑设备的资源的,它描述的是系统在为逻辑设备分配资源时需要处理的依赖关系(这些资源要被同时生成和释放)。

至于逻辑设备是怎么样的,目前不是很清楚,至于所谓的依赖关系是什么,也不是很清楚......

Start Dependent Functions Descriptor的结构如下所示:

其中Byte 1是可选的,如果没有则是默认的Acceptable。

Start Dependent Functions Descriptor对应的ASL操作符是StartDependentFn和StartDependentFnNoPri。后者就是没有Byte 1的情况。

具体的使用方法如下:

End dependent Functions Descriptor的结构如下所示:

它没有额外的字节表示。

对应的ASL操作符是EndDependentFn,其使用方式如下所示:

I/O Port Descriptor

用来描述设备的IO资源,包括IO地址的最小值、最大值(都是16位的),对齐值和长度,以及16BIT还是10BIT解析(即IO地址中的这16位是全用还是只用其中10位)。

这是其中的一种形式,后面还会讲到另外一种。这是最全面的一种,甚至已经覆盖了后一种。它的结构如下:

对应的ASL操作符是IO,使用方式如下所示:

Fixed Location I/O Port Descriptor

这个就是前面说的另一种表示设备IO资源的描述符。它主要用于老的ISA卡那种使用固定的IO地址且10位Decode的设备。

它的结构体如下所示:

对应的ASL操作符是FixedIO,它的使用方式如下所示:

Fixed DMA Descriptor

Fixed DMA descriptor使系统可以给跟共享DMA控制器连接的设备分配静态的DMA Request Line和Channel。

相比DMA Descriptor,它支持更多的Line和Channel。

下面是Fixed DMA descriptor结构体的表示:

它对应的ASL操作符是FixedDMA,其使用方式如下:

Vendor-Defined Descriptor

这个是给OEM使用的结构体,大致是下面的样子:

它也有对应的ASL操作符VendorShort,使用方式如下:

End Tag

这个是ASL编译器自动生成的,结构如下:

因为是自动生成的,所以没有对应的ASL操作符。

Large Resource Data Type

这里Resource Descriptor与Small Resource Data Type相比也就占据的字节数更多一点而已。它有16BIT表示长度,因此最大占据64K字节。

它的结构大致如下所示:

它的种类有以下一些:

下面具体说明每一种类型以及对应的ASL操作符。

24-Bit Memory Range Descriptor 

用于描述设备需要的24位Memory空间。具体的结构如下所示:

它对应的ASL操作符是Memory24,具体的使用方式如下所示:

新版本已经不再使用这个操作符,所以不需要特别关注。

Vendor-Defined Descriptor

它与Small Resource Data Type里面的Vendor-Defined Descriptor没有本质的区别,只是变得更大了,下面是结构描述:

它对应的ASL操作符是VendorLong,使用方式如下所示:

32-Bit Memory Range Descriptor

描述了设备需要的Memory资源,使用32位地址空间。其结构如下所示:

它描述的内容包括以下的几个部分,Memory地址最小值、最大值、对齐、长度和是否可写。内容并不多,只是因为地址有32位,所以导致结构变大。

它对应的ASL操作符是Memory32,具体的使用方式如下:

32-Bit Fixed Memory Range Descriptor

它也是描述设备需要的Memory资源,也是32位地址空间。

不同之处是它里面描述的地址是固定的。其结构如下所示:

它对应的ASL操作符是Memory32Fixed,其使用方式如下所示:

Address Space Resource Descriptors

这类Descriptor下面还包含不同类型的Descriptor,分别是QWORD, DWORD, WORD, 和Extended Address Space Descriptor。

它们属于通用的地址资源描述符,可以用来表示Memory资源和IO资源。

具体的结构不再这里描述了,太多了,也太大了,可以参考《ACPI Spec》。

它们对应的ASL操作符很多,有如下的一些:

QWordIO 、QWordMemory 、QWordSpace、DWordIO 、DWordMemory 、DWordSpace 、WordIO 、WordBusNumber 、WordSpace和ExtendedSpace 。

这里也不一一介绍了。

需要注意的是没有WordMemory,而有一个WordBusNumber。

Extended Interrupt Descriptor

之前有一个IRQ Descriptor,它只能有15个中断,但是对于多于15个中断的情况,就需要使用到这里的Extended Interrupt Descriptor。

它的结构如下所示:

上述的结构中描述的中断的属性,并定义了所有的中断号。

可以看出它也可以用于8258构成的只有15个中断的系统,此时如果定义了多于15个的中断,那么多出来的部分会被忽略。

它对应的ASL操作符是Interrupt,它的使用方式如下:

Generic Register Descriptor

描述在ACPI定义的地址空间中的固定地址的某段寄存器空间。

ACPI定义的地址空间有如下的几种:System Memory、System IO、PCI Configuration Space、Embedded Controller、SMBus、PCC、Functional Fixed Hardware。

下面是具体的结构定义:

对应的ASL操作符是Register,其使用方式如下:

Connection Descriptors

这类Descriptor也包含多个,有GPIO Connection Descriptor和Serial Bus Connection Descriptors,后者又分为I2C Serial Bus Connection Resource Descriptor 、SPI Serial Bus Connection Resource Descriptor和UART Serial Bus Connection Descriptor 。

它们对应的ASL操作符有GpioInt、GpioIO、I2CSerialBusV2、SPISerialBusV2和UARTSerialBusV2。

涉及的内容太多,这里也不一一介绍了,具体参考《ACPI Spec》。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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系统中的电源管理和硬件配置操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值