PIC(Programmable Interrupt Controller,可编程中断控制器)用于对硬件产生的外部中断进行控制。i386中的可编程中断控制器是8259A芯片。随着技术的进步,现代CPU中的中断控制芯片的能力越来越强,人们称之为APIC(Advanced Programmable Interrupt Controller,高级可编程中断控制器),但x86体系中的APIC依然保持着对8259A的兼容。所以了解8259A的工作原理是十分必要的。
PIC的作用是将外部中断和中断向量号对应起来,例如通过对8259A的设置可以将时钟中断信号IRQ0与中断号0x20进行绑定。8259A的芯片结构如图2-11所示。
图2-11 8259A芯片图
外部中断分为NMI(Non-maskable interrupt,非屏蔽中断)和可屏蔽中断两种,其中NMI由CPU的NMI引脚接收,可屏蔽中断由INTR引脚接收。机器出现电源故障、CPU内部奇偶校验错误等不可恢复的硬件故障才会导致NMI发生。而INTR引脚与8259A芯片相连。
两片8259A芯片以串联的方式进行连接,主8259A芯片的IRQ2连接着从8259A芯片。一个8259A芯片有8个中断信号线,两片芯片级联就可以处理15种不同的中断信号。在BIOS初始化时,设置IRQ0~IRQ7的对应向量号为0x8~0xf,但在保护模式下,0x8~0xf已经被占用了,所以操作系统进入保护模式以后需要对8259A重新进行初始化。
对8259A的初始化是通过向对应的端口执行ICW(Initialization Command Word,初始化命令字)来实现的。ICW共有4个,分别是ICW1、ICW2、ICW3、ICW4。每个ICW都是1字节大小。8259A对每个ICW的格式和设置顺序都有严格的定义,下面介绍各个ICW的格式。
(1)ICW1
ICW1的各个位的含义说明如表2-3所示。
表2-3 ICW1各个位的含义说明
每一位的作用表格里都有详细说明,这里就不再多加解释了。
(2)ICW2
ICW2主要用来设置中断向量号,即标识每个中断信号线和中断向量号的对应关系。因为8259A有8个IRQ,所以低三位必须是0。这里只需要向21h或者A1h端口写入一个起始向量号,8259A芯片就可以根据IRQ的个数确定每个IRQ对应的中断向量号。
(3)ICW3
ICW3主要用于记录8259A的连接信息,主片的哪个IRQ连接了从片,对应的位就需要被设置成1,同时从片的ICW3也要将低3位设置为连接主片的IRQ号。例如按照图2-11中的连接方式,主片的ICW3的第2位就应该设置为1,其他位设置为0,而从片的ICW3为0x2,也就是第1位设置为1,其他设置为0,代表从片连接了主片的IRQ2。
(4)ICW4
ICW4用于设置8259A的其他工作模式,它的各个位的含义如表2-4所示。
第0位表示和处理器架构相关的工作模式:1表示8086处理器工作模式;0表示MCS80/85处理器工作模式。
第1位表示中断结束方式:为1表示自动结束方式,为0表示手动结束方式。如果是手动结束方式,那么在中断处理程序的末尾向8259A写入OCW2,以便告诉8259A中断处理程序执行结束。如果是自动方式结束,那么是由硬件自动完成这个工作的,不过自动方式只适用于在中断请求信号持续时间有限制,并且没有中断嵌套的场景。
表2-4 ICW4的各个位的含义
第2位表示缓冲模式下的主片或者是从片,为1表示主片,为0表示从片。
第3位表示是否为缓冲模式,如果8259A通过总线驱动器和系统数据总线连接,则应选择缓冲方式。如果8259A的数据线与系统数据总线直接相连,那么应选择非缓冲方式。
第4位表示中断嵌套方式,为0表示普通全嵌套方式,为1表示SFNM嵌套方式。
8259A芯片还需要写入OCW(Operation Control Word,操作控制字)来对中断进行控制。OCW共有三个,分别是OCW1,OCW2和OCW3。OCW3则是用来设置和使能特殊屏蔽方式的,暂时可以不用关注。
(5)OCW1
OCW1是用来屏蔽或者打开外部中断的。主片的端口号是0x21,从片的端口号是0xa1。若想屏蔽一个中断,可将对应那一位设成1即可。例如,若想屏蔽其他所有中断,只打开时钟中断,就需要将OCW1的第0位设置为0,其他位设置为1。实际上,OCW1被写入了IMR(Interrupt Mask Register,中断屏蔽寄存器),当一个中断到达,IMR会判断此中断是否应被丢弃。
(6)OCW2
OCW2是8259A芯片用来接收EOI的。主片的端口号是0x20,从片的端口号是0xa0。每当一个中断处理程序结束后,就需要通知8259A,以便继续接收中断。OCW2的第5位代表EOI,这里并不需要关心其他位,所以中断结束以后,就需要向相应的端口号发送0x20。
中断的过程还和特权级有密切的关系,下一节将介绍CPU特权级的相关知识。