首页 理论教育微软PnP设备规范及ACPI中断实现机制简介

微软PnP设备规范及ACPI中断实现机制简介

【摘要】:[5]微软规定了一系列PnP设备规范,详见http://www.microsoft.com/whdc/system/pnppwr/pnp/default.mspx。而SCI中断也被称为ACPI中断,下文将详细介绍该中断的实现机制。[11]ACPI 4.0规范的第5.6节APIC Event Programming Model中定义了一系列回调号。[12]在FACP.dsl文件中存放SCI Interrupt使用的中断向量。[13]该函数为ACPICA提供的OS服务层接口函数。[20]如第14.1.3节所示,pci_legacy_init函数在执行过程中需要检查pcibios_scanned参数,当该参数为1时,该函数将直接返回。PCIe设备可以通过INTx中断消息报文,向I/O APIC提交中断请求,详见第6.3.4节。

本节主要介绍了PCI设备的中断请求在Linux系统中的处理过程。Linux系统的更新速度较快,并不断加入新的功能。本章的内容基于Linux系统,目前Linux系统支持多种架构的处理器系统,而且得到了极大的普及。对于有志于学习体系结构的工程师而言,深入了解几种操作系统是必须的。而在这些操作系统中,Linux无疑最为开放,读者也最容易了解其实现细节。但是值得注意的是,在体系结构的学习过程中,不要拘泥于Linux系统本身,Linux系统仅包含了体系结构的部分内容,也只是一种实现方法。

本书到此告一段落,而PCIe总线仍然继续向前发展,PCIe V3.0规范即将发布,其中增加了许多新的功能,而这些新的功能在许多处理器系统中并没有意义。这些新的功能在本书中多有提及,但并不是本书的重点。本书的重点是以PCIe总线为例说明处理器的体系结构,是对PCIe体系结构进行导读,更准确地说,是以PCIe总线为例说明处理器体系结构中局部总线的设计原理与使用方法。

[1]x86处理器使用的BIOS也是Firmware的一种。

[2]Linux PowerPC在setup_arch函数中也做了一些有关PCI总线的初始化工作,如初始化HOST主桥。

[3]将设备驱动程序编译到Linux内核中。

[4]System.map文件存放Linux内核使用的符号表,包括当前Linux系统使用的所有函数指针和全局变量。

[5]微软规定了一系列PnP设备规范,详见http://www.microsoft.com/whdc/system/pnppwr/pnp/default.mspx。

[6]x86处理器接收SMI中断请求后,将进入SMM模式,此时将由BIOS处理ACPI中断请求。而SCI中断也被称为ACPI中断,下文将详细介绍该中断的实现机制。

[7]EC可以连接PS2口鼠标、键盘,并可以扩展其他自定义接口。在x86处理器中,EC由一个简单的MCU(Micro Control Unit)实现。

[8]处理器系统没有打开电源开关时,处理器系统处于S5状态。通常这个开关在ATX电源模块中。

[9]这段源代码来自ACPI规范4.0,在一个实际的x86处理器系统中,电源按钮的处理可能与此不同。

[10]_PRW是Power Resources for Wake的缩写,可以将处理器从休眠状态唤醒的设备需要使用_PRW。

[11]ACPI 4.0规范的第5.6节APIC Event Programming Model中定义了一系列回调号。

[12]在FACP.dsl文件中存放SCI Interrupt使用的中断向量。

[13]该函数为ACPICA提供的OS服务层接口函数。

[14]该表由Microsoft定义,详情见http://www.microsoft.com/whdc/resources/respec/specs/simp_boot.mspx。

[15]Itanium处理器系统含有多个对等HOST主桥;而在多数x86处理器系统中,仅含有一个HOST主桥。(www.chuimin.cn)

[16]resource参数存放HOST主桥管理的存储器和I/O地址空间,secondary参数存放Secondary总线号。

[17]Linux PCI将递归调用pci_scan_child_bus函数。

[18]这些处理器的Linux系统,将在pcibios_assign_resources函数中初始化BAR空间,详见下文。

[19]如果当前PCI桥为HOST主桥,pci_read_bridge_bases函数将直接返回。因为HOST主桥使用的pci_bus结构已经在pci_create_bus函数中进行了初始化。

[20]如第14.1.3节所示,pci_legacy_init函数在执行过程中需要检查pcibios_scanned参数,当该参数为1时,该函数将直接返回。

[21]pcibios_irq_init函数需要检查pcibios_enable_irq参数,如果该参数不为NULL,该函数也将直接返回。

[22]该机制由Sun Microsystems引入,广泛应用于Sun、Apple、IBM和Freescale的非x86处理器系统中。

[23]MPC8572的PCIe总线控制器可以作为RC,也可以作为EP。

[24]I/O APIC将这种方式称为PCI Message。PCIe设备可以通过INTx中断消息报文,向I/O APIC提交中断请求,详见第6.3.4节。

[25]Linux IA在引导时可以加入“noapic”参数关闭I/O APIC,此时处理器系统将使用8259A中断控制器。

[26]在Linux系统中,该结构为irq_desc,该结构记录与irq号相关的信号。

[27]如果Linux x86并没有使用8825A作为中断控制器,irp号和中断向量并没有直接的对应关系。

[28]如果在一个处理器系统中,irp号大于16,那么irp号等于CSI号。

[29]对应Else之后的这段代码。

[30]使用8859A中断控制器的情况。

[31]使用APIC中断控制器的情况。