综述
在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控制器级联,可以参考BIOS/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》