首页 理论教育了解与应用PCIExpress体系结构导读

了解与应用PCIExpress体系结构导读

【摘要】:ACPI规范是x86处理器使用的Firmware接口标准,操作系统需要获得的处理器底层信息基本上都可以从ACPI表中获得。目前在x86处理器中,新引入的一些与处理器体系结构相关的特性,基本上都只使用ACPI机制进行描述,而不再使用BIOS。因此为了深入理解x86处理器平台,需要了解一些与ACPI相关的基本知识。因为这些“非标”外设的管理由ACPI BIOS完成,x86处理器使用ACPI表描述这些“非标”外设,并将这个ACPI表存放到BIOS中。

在x86处理器中,ACPI(Advanced Configuration and Power Interface)是一个非常重要而且较为复杂的概念。最初ACPI规范由Intel、Microsoft和Toshiba公司共同制定,后来HP和Phoenix公司也参与了ACPI规范的制定,该规范主要包括x86处理器系统的资源配置和电源管理两方面内容。

ACPI规范整合了之前的OSPM(Operating System directed Power Management)、MultiPro-cessor规范和Plug and Play BIOS规范,并定义了一系列数据结构与电源管理状态,提供了电源管理接口、硬件及其Firmware接口,以描述处理器系统的设备和电源管理策略。ACPI规范在1996年12月发布1.0版本,目前的稳定版是4.0版。

ACPI规范是x86处理器使用的Firmware接口标准,操作系统需要获得的处理器底层信息基本上都可以从ACPI表中获得。在ACPI诞生之前,基于x86处理器的操作系统需要使用BIOS才能获得相应的信息。而不同厂商提供的BIOS之间并没有一个统一标准,从而在某种程度上造成硬件资源管理与使用上的混乱。

产生这种混乱的主要原因是由于x86处理器系统为了实现向前兼容,有许多不得已;而部分原因是在x86处理器系统中,有许多外部设备本身就挂接在一些“不可配置的”总线上,如ISA/EISA总线,还有一些外部设备本身就是不标准的,如电源按钮和在笔记本上使用的一些“特殊功能键”。

在ACPI规范没有出现之前,BIOS厂商通常按照某种“自定义”的方式使用这些外部设备,因此需要为操作系统提供各类驱动程序,并由操作系统集成这些并不属于任何标准的驱动程序,从而给操作系统的开发与维护带来了极大的困难。

ACPI机制在这种背景下应运而生。ACPI机制提供了一组与处理器硬件和操作系统的相关接口,对处理器平台以及设备的电源进行管理,并可以配置和管理外部设备使用的系统资源。ACPI机制主要管理以下系统资源。

●Legacy PNP设备[5],如ISA设备、串并口等设备。

●笔记本使用的一些外部设备,如电源开关、风扇、电源和一些快捷键。

●系统电源管理,包括处理器和外部设备的电源管理。这部分内容也是ACPI规范的设计重点。

●系统的热插拔管理。热插拔是ACPI规范的设计重点,ACPI系统热插拔可以覆盖小到“从笔记本插拔CDROM”,大到“NUMA(Non-uniform Memory Access)结构处理器系统热插拔PE(Processor Element)、存储器节点(Memory Node)和I/O节点”这些应用。不过许多NUMA处理器系统并没有使用ACPI规范进行热拔插管理。本节对ACPI的热插拔管理不做深入介绍。

●PCI设备的中断向量分配。在x86处理器平台中,中断向量的分配始终是一个问题。x86处理器由于一些历史遗留问题,中断向量的分配并不尽善尽美,而x86处理器为了实现向前兼容,必须保留这些不完美。本章将在第15.1.1节详细介绍中断向量的分配。

●一些集成在MCH和ICH中的外部设备。x86处理器使用PCI配置空间存放这些外部设备的寄存器,但是这些设备并不都是严格意义上的PCI设备,甚至不是一个外部设备。如在x86处理器中的使用存储器映射寻址的一些寄存器,这些寄存器被存放在某个PCI设备的配置空间中,如TOLUD寄存器存放在Bus号、Device号和Function号都为0的PCI设备中,但是这个PCI设备并不是处理器系统的标准PCI设备。ACPI规范需要管理这类“伪PCI设备”中的寄存器。

目前在x86处理器中,新引入的一些与处理器体系结构相关的特性,基本上都只使用ACPI机制进行描述,而不再使用BIOS。因此为了深入理解x86处理器平台,需要了解一些与ACPI相关的基本知识。ACPI规范所涉及的内容非常广泛,与ACPI规范有关的全部知识可以独立成书,本节仅简要介绍ACPI规范中与PCI总线相关的部分内容。ACPI规范的各部分内容相对较为独立,除了ACPI规范的开发者和从事与此相关的系统程序员之外,绝大多数程序员不需要了解与ACPI规范相关的全部知识。

从系统软件的角度上看,ACPI的组成结构如图14-1所示。从图中可以发现,ACPI用以连接系统硬件平台与操作系统,在屏蔽了硬件的实现细节的同时,提供了一系列系统资源,包括ACPI寄存器(ACPI Registers)、ACPI BIOS和ACPI表(ACPI Tables)。

978-7-111-29822-9-Part03-15.jpg

图14-1 ACPI的组成结构(www.chuimin.cn)

当一个处理器系统使能ACPI机制后,操作系统访问ACPI管理的“非标”外设时,首先通过ACPI机制提供的一套标准API,并由这些API将访问存放在系统内存中的ACPI表,并通过执行ACPI表中的程序读写ACPI寄存器,或者对这些寄存器进行操作。在ACPI表中,除了含有处理器系统的资源信息之外,还包括管理这些资源信息的操作函数,因此BIOS厂商通过ACPI表即可实现一些简单的设备驱动程序。

操作系统使用这些API,并通过ACPI Driver/AML Interpreter访问ACPI提供的系统资源,包括ACPI Registers、ACPI BIOS和ACPI表。ACPI表对于理解ACPI机制较为重要,在第14.2.2节和第14.2.3节将专门介绍该表的组成与实现。

在x86处理器系统中,系统资源由ACPI BIOS维护,操作系统使用ACPI提供的标准API从ACPI BIOS中获得这些资源,而不必关心这些“非标”外设的具体实现方式,因此也不需要使用特定的驱动程序访问这些“非标”外设。

因为这些“非标”外设的管理由ACPI BIOS完成,x86处理器使用ACPI表描述这些“非标”外设,并将这个ACPI表存放到BIOS中。OEM厂商需要在标准PC处理器平台上添加一些“自定义”的功能时,只需改动ACPI表即可,而不需要改动操作系统,从而极大地降低了操作系统的集成与维护难度。

ACPI机制使用的“标准API”在ACPICA(ACPI Component Architecture Programmer Refer-ence)规范中定义。这些标准API与操作系统相对独立,从而便于ACPICA在不同操作系统中的实现。

如图14-1所示,ACPI机制所覆盖的内容包括ACPI寄存器组、ACPI BIOS和ACPI表。在ACPI寄存器组中含有电源管理、处理器控制和GPE(General-Purpose Event)寄存器组。其中处理器控制寄存器组是可选的,而电源管理和GPE寄存器组是必须实现的。这些与ACPI机制相关的寄存器在Intel的ICH中定义。

电源管理寄存器组由PM1a_STS、PM1a_EN、PM1b_STS、PM1b_EN、PM1_CNTa、PM1_CNTb等寄存器组成。在这些寄存器中,PM1a_STS、PM1_CNTa寄存器和PM1a_EN是必须支持的,而其他寄存器是可选的。在Intel的ICH9中,PM1a_STS寄存器与PM1_STS寄存器对应,PM1_CNTa寄存器与PM1_CNT寄存器对应,而PM1a_EN寄存器与PM1_EN寄存器对应。这些寄存器的简单描述如下,有兴趣的读者可以参考[Intel I/O Controller Hub9]的第13.8节以获得这些寄存器的详细说明。

●PM1_STS寄存器包含当前处理器被唤醒的原因,以及一些与电源按键(Power Button)相关的信息。

●通过操作PM1_CNT寄存器可以使处理器进入不同的休眠状态,并确定ACPI中断请求使用SCI中断请求还是SMI[6]中断请求。

●PM1_EN寄存器设置SCI(System Control Interrupt)中断使能位,决定当PM1_STS寄存器的状态有效时,是否向处理器提交SCI中断请求。SCI中断请求由ACPI规定的相应事件使用,并缺省使用中断向量9向处理器提交中断请求,操作系统使用中断服务程序进一步处理来自ACPI的中断请求。

GPE寄存器组是ACPI寄存器组的一个重要组成部分,由GPE0_STS、GPE0_EN、GPE1_STS和GPE1_EN寄存器组成。在Intel的ICH9中,由General Purpose I/O寄存器组实现ACPI规范的GPE寄存器组。General Purpose I/O寄存器组的使用方法非常简单,对此有兴趣的读者可以参考[Intel I/O Controller Hub 9]的第13.10节。

ACPI的GPEx_STS和GPEx_EN寄存器的使用方法较为简单。其中GPEx_STS寄存器的每一位在GPEx_EN寄存器中都有一个使能位,当GPEx_STS寄存器的某位有效时,表示产生了一个GPE事件,如果与该位相对应的使能位也有效时,ICH将向处理器提交SCI中断请求,由中断服务程序进一步处理这个GPE事件。

ACPI BIOS与操作系统中的ACPI驱动程序/AML解释器(ACPI Driver/ACPI Machine Lan-guage Interpreter)密切相关。操作系统可以使用ACPICA提供的标准API,再通过ACPI驱动程序/AML解释器访问ACPI BIOS,并从ACPI BIOS获得相应的信息后执行与底层硬件相关的代码操纵实际的设备,有关这部分内容的详细说明见下文。

ACPI表描述处理器平台使用的资源和管理这些资源的执行操作,操作系统可以通过标准的API函数访问ACPI表并执行相关的程序,从而维护整个ACPI系统的运转。ACPI表是BIOS提供给系统软件的重要资源。