1. Overview
PIC全称Programmable Interrupt Controller,通常是指Intel 8259A双片级联构成的最多支持15个interrupts的中断控制系统。APIC全称Advanced Programmable Interrupt Controller,APIC是为了多核平台而设计的。它由两个部分组成IOAPIC和LAPIC,其中IOAPIC通常位于南桥中 用于处理桥上的设备所产生的各种中断,LAPIC则是每个CPU都会有一个。IOAPIC通过APICBUS(现在都是通过FSB/QPI)将中断信息分派给每颗CPU的LAPIC,CPU上的LAPIC能够智能的决定是否接受系统总线上传递过来的中断信息,而且它还可以处理Local端中断的pending、nesting、masking,以及IOAPIC于Local CPU的交互处理。
2. PIC
基于Intel 80x86的PC使用两片8259A级联的方式组成了可以管理15级中断向量的一个中断系统,下图是它的一个连接示意图。两片8259A,一片为Master,另一片为Slaver。其中Slaver的INT接到Master的IRQ2上。8259A有两种工作模式分别为编程和操作模式。BIOS初始化的时候会先通过IO port对8259A进行编程配置,在此之后8259A就可以响应来自外部设备的中断请求了。Master的IO address是0x20 0x21; Slaver的IO address是0xA0 0xA1。
为了能够正常的使用PIC来管理系统中断,就需要对它进行初始化。8259A支持两种类型的命令字,一类是初始化命令字ICW1~4,另一类是操作命令字OCW1~3,其中每一个命令字的各个bit都有其代表的特定意义。下述是一个初始化Master的一个sample code:
MOV AL,00010001b ;级联,边沿触发,需要写ICW4 OUT 20H,AL ;写ICW1 MOV AL,01000000B ;中断类型号40H OUT 21H,AL ;写ICW2 MOV AL,00000100B;主片的IR2引脚从片 OUT 21H,AL ;写ICW3 MOV AL,00010001B;特殊完全嵌套,非缓冲,自动结束 OUT 21H,AL ;写ICW4
3. APIC
Intel APIC由一组中断输入信号,一个24*64bit的Programmable Redirection Table(PRT),一组register和用于从APIC BUS(FSB/QPI)上传送APIC MSG的部件组成,当南桥的IO device通过IOAPIC的interrupt lines产生interrupt,IOAPIC将根据内部的PRT table格式化成中断请求信息,并将该信息发送给目标CPU的LAPIC,再由LAPIC通知CPU进行处理。下图是一个基于Intel APIC的连接示意图,如下图所示IOAPIC上有24个interrupt pin,每一个pin都对应一个RTE,所以针对每一个interrupt pin都可以单独设定它的mask,触发方式(level,edge trigger),中断管脚的极性,传送方式,传送状态,目的地,中断向量等。
另附上, PIC彻底走进历史的日子已经不远,Windows已经开始叫嚣要放弃对PIC系统的支持,新的架构也彻底和PIC说byebye(例如我们伟大的IA64^_^)。当然,PIC还会继续在单片机、嵌入式领域发挥余热,这就不是我们所能理会的了。但目前PIC和APIC共存的情况还普遍存在,MP spec为PIC和APIC共存的平台规定了三种模式:PIC mode、Virtual Wire Mode、Symmetric I/O Mode。 笔者:Symmetric这个单词打着甚为麻烦,下文把Symmetric I/O Mode称为APIC mode。 三种模式中,PIC mode和Virtual Wire Mode互斥存在,所谓有你没它。APIC mode是所有MP平台最终进入的模式。Spec规定,为了PC/AT compatibility,系统在RESET后首先进入PIC mode或者Virtual Wire mode,操作系统(或BIOS)在适当时候切换入APIC mode。 3.1.1 PIC modeIMCR,Interrupt Mode Configuration Register,中断模式配置寄存器,控制当前系统的中断模式——PIC?还是APIC?当系统RESET后,该寄存器清0,系统默认进入PIC模式。此时BSP(Boot Startup Processor,多处理器系统中第一个启动的CPU)的NMI和INTR脚为硬连线,直接从外部接入,不经过APIC。下图显示了这个结构: 图3-1 PIC模式中断连接图 注意图中的虚线,PIC模式下,外部中断通过PIC直接到达BSP的INTR脚,而NMI直接连接BSP的NMI脚。 对IMCR写1,可将系统切换至APIC模式。此时外部中断直接通过APIC到达CPU,NMI则连接LAPIC的LINT1脚。 题外话 —— IMCR的访问 MP spec规定,I/O端口22h和23h用于支持IMCR寄存器。对22h端口写70h可选中IMCR,此时对23h端口读/写即可。此外,如果PIC mode没有实现,IMCR则可能没有实现。MP table的MP feature information字节的IMCRP bit报告平台是否有ICMR。 笔者:IMCR和PIC mode可能已被埋入了历史的黄土。笔者查阅了ICH9(ICH即南桥)的spec,没有找到该寄存器的描述。Google了一下,除了mp spec其它地方都没提到它。窃以为,此物已死。 顾名思义,该模式有一条“虚导线”。这条“虚导线”就是APIC——LAPIC或IOAPIC。除此之外,该模式和PIC模式没有大的区别。 IOAPIC用作“虚导线”情况如下: 图3-2 Virtual Wire Mode —— IOAPIC 如图虚线,外部中断通过PIC连接的IOAPIC管脚,最终到达BSP。当然,连接PIC的这个管脚需要被配置成ExtINT模式。 笔者:spec对IOAPIC用作Virtual Wire的描述只有寥寥数语。根据前面介绍IOAPIC的内容,我们来猜测一下IOAPIC是什么样的。首先,IOAPIC的PRT表已经配置好了,不然无法向LAPIC发中断消息。其次由于外部中断即连接PIC又连接IOAPIC,为了避免出现中断复接的情况,IOAPIC中除了连接PIC的管脚,其它的都应该被mask。连接PIC的管脚delivery mode配置成ExtINT。再来猜猜PIC是什么样的。图中没有话出,但PIC的INTA脚肯定是连到了BSP的,因为对于配置成ExtINT的中断消息,CPU要通过INTA脚应答PIC,并接收中断的vector …… 以上纯属个人猜测 LAPIC用作Virtual Wire的情况: 图3-3 Virtual Wire Mode —— LAPIC 还是看图中虚线,这次PIC接的是BSP的LINT0脚,当然,该管脚也要配置成ExtINT模式。 笔者:MP spec没说如何从Virtual Wire Mode切换到APIC模式。我们再猜测一下,重新配置模式为ExtINT(LAPIC或IOAPIC)的管脚,将PIC的所有管脚mask掉? |
|