分享

pic lapic ioapic

 会结网的小蜘蛛 2018-07-17

1. Overview

 

PIC全称Programmable Interrupt Controller,通常是指Intel 8259A双片级联构成的最多支持15interrupts的中断控制系统。APIC全称Advanced Programmable Interrupt ControllerAPIC是为了多核平台而设计的。它由两个部分组成IOAPICLAPIC,其中IOAPIC通常位于南桥中 用于处理桥上的设备所产生的各种中断,LAPIC则是每个CPU都会有一个。IOAPIC通过APICBUS(现在都是通过FSB/QPI)将中断信息分派给每颗CPULAPIC,CPU上的LAPIC能够智能的决定是否接受系统总线上传递过来的中断信息,而且它还可以处理Local端中断的pendingnestingmasking,以及IOAPICLocal CPU的交互处理。

                                                                                              

2. PIC

 

基于Intel 80x86PC使用两片8259A级联的方式组成了可以管理15级中断向量的一个中断系统,下图是它的一个连接示意图。两片8259A,一片为Master,另一片为Slaver。其中SlaverINT接到MasterIRQ2上。8259A有两种工作模式分别为编程和操作模式。BIOS初始化的时候会先通过IO port8259A进行编程配置,在此之后8259A就可以响应来自外部设备的中断请求了。MasterIO address0x20 0x21; SlaverIO address0xA0 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*64bitProgrammable Redirection Table(PRT),一组register和用于从APIC BUS(FSB/QPI)上传送APIC MSG的部件组成,当南桥的IO device通过IOAPICinterrupt lines产生interruptIOAPIC将根据内部的PRT table格式化成中断请求信息,并将该信息发送给目标CPULAPIC,再由LAPIC通知CPU进行处理。下图是一个基于Intel APIC的连接示意图,如下图所示IOAPIC上有24interrupt pin每一个pin都对应一个RTE,所以针对每一个interrupt pin都可以单独设定它的mask,触发方式(level,edge trigger),中断管脚的极性,传送方式,传送状态,目的地,中断向量等。

 



另附上,

PIC彻底走进历史的日子已经不远,Windows已经开始叫嚣要放弃对PIC系统的支持,新的架构也彻底和PICbyebye(例如我们伟大的IA64^_^)。当然,PIC还会继续在单片机、嵌入式领域发挥余热,这就不是我们所能理会的了。但目前PICAPIC共存的情况还普遍存在,MP specPICAPIC共存的平台规定了三种模式:PIC modeVirtual Wire ModeSymmetric I/O Mode

笔者:Symmetric这个单词打着甚为麻烦,下文把Symmetric I/O Mode称为APIC mode

三种模式中,PIC modeVirtual Wire Mode互斥存在,所谓有你没它。APIC mode是所有MP平台最终进入的模式。Spec规定,为了PC/AT compatibility,系统在RESET后首先进入PIC mode或者Virtual Wire mode,操作系统(或BIOS)在适当时候切换入APIC mode

3.1.1 PIC mode

IMCRInterrupt Mode Configuration Register,中断模式配置寄存器,控制当前系统的中断模式——PIC?还是APIC?当系统RESET后,该寄存器清0,系统默认进入PIC模式。此时BSPBoot Startup Processor,多处理器系统中第一个启动的CPU)的NMIINTR脚为硬连线,直接从外部接入,不经过APIC。下图显示了这个结构:

3-1 PIC模式中断连接图

注意图中的虚线,PIC模式下,外部中断通过PIC直接到达BSPINTR脚,而NMI直接连接BSPNMI脚。

IMCR1,可将系统切换至APIC模式。此时外部中断直接通过APIC到达CPUNMI则连接LAPICLINT1脚。

题外话 —— IMCR的访问

MP spec规定,I/O端口22h23h用于支持IMCR寄存器。对22h端口写70h可选中IMCR,此时对23h端口读/写即可。此外,如果PIC mode没有实现,IMCR则可能没有实现。MP tableMP feature information字节的IMCRP bit报告平台是否有ICMR

笔者:IMCRPIC mode可能已被埋入了历史的黄土。笔者查阅了ICH9ICH即南桥)的spec,没有找到该寄存器的描述。Google了一下,除了mp spec其它地方都没提到它。窃以为,此物已死。

3.1.2 Virtual Wire Mode

顾名思义,该模式有一条虚导线。这条虚导线就是APIC——LAPICIOAPIC。除此之外,该模式和PIC模式没有大的区别。

IOAPIC用作虚导线情况如下:

3-2 Virtual Wire Mode —— IOAPIC

如图虚线,外部中断通过PIC连接的IOAPIC管脚,最终到达BSP。当然,连接PIC的这个管脚需要被配置成ExtINT模式。

笔者:specIOAPIC用作Virtual Wire的描述只有寥寥数语。根据前面介绍IOAPIC的内容,我们来猜测一下IOAPIC是什么样的。首先,IOAPICPRT表已经配置好了,不然无法向LAPIC发中断消息。其次由于外部中断即连接PIC又连接IOAPIC,为了避免出现中断复接的情况,IOAPIC中除了连接PIC的管脚,其它的都应该被mask。连接PIC的管脚delivery mode配置成ExtINT。再来猜猜PIC是什么样的。图中没有话出,但PICINTA脚肯定是连到了BSP的,因为对于配置成ExtINT的中断消息,CPU要通过INTA脚应答PIC,并接收中断的vector …… 以上纯属个人猜测

LAPIC用作Virtual Wire的情况:

3-3 Virtual Wire Mode —— LAPIC

还是看图中虚线,这次PIC接的是BSPLINT0脚,当然,该管脚也要配置成ExtINT模式。

笔者:MP spec没说如何从Virtual Wire Mode切换到APIC模式。我们再猜测一下,重新配置模式为ExtINTLAPICIOAPIC)的管脚,将PIC的所有管脚mask掉?

3.1.3 APIC mode

没什么好说的,直接看图:

3-4 APIC mode

一个要求,进入APIC模式后要将PIC的所有管脚mask掉。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多