Interrupt in Linux(硬件篇)—— 硬件知识1
2019-04-15 12:06发布
生成海报
第三章 你应该知道的硬件知识3.1 APIC和PIC共存下的系统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其它地方都没提到它。窃以为,此物已死。3.1.2 Virtual Wire Mode顾名思义,该模式有一条“虚导线”。这条“虚导线”就是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掉?3.1.3 APIC mode没什么好说的,直接看图:图3-4 APIC mode一个要求,进入APIC模式后要将PIC的所有管脚mask掉。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮