可编程中断控制器PIC8259A
可编程中断控制器(PIC)
中断的产生有两种原因,一个是外部中断(由硬件产生的中断),另一个是由指令int n
产生的中断,指令int n
中n位向量号(IDT中定义),外部中断有些复杂些,因为需要建立硬件中断和向量号之间的对应关系,外部中断分为不可屏蔽中断(NMI
)和可屏蔽中断两种,分别由CPU的两根引脚NMI
和INTR
来接受,Intel处理器只有一个外部中断引脚INTR,为了处理器能够同时接收多个硬件设备发送来的中断请求信号,因此将所有外部设备的中断请求汇总到中断控制器,由中断控制器处理后,由选择性的将中断请求一次发往外部中断引脚INTR
在多核处理器之前,8259A(PIC Programmable Interrupt Controller)是PC中最普遍的中断控制器,自多核处理器之后,8259A对多核的支持越来越差,随后出现APIC(Advanced Programmable Interrupt Controller,高级可编程中断寄存器),以及x2APIC(x2apic为Intel提供的xAPIC增强版,针对中断寻址、APIC寄存器访问进行改进优化)在本节中我们介绍PIC和APIC并编写PIC对应的结构(APIC会出一篇单独文章)
8259A PIC
通常情况下PC都会采用两片8259A芯片级联(级联指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率),将外部硬件设备的中断请求与处理器的中断接收引脚关联起来
在两个8259A芯片级联过程中,一个8259A作为主芯片(主片),与CPU的INTR引脚相连,另一个8259A作为从芯片(从片)与主8259A的IR2引脚相连,其他中断请求引脚IR将外部设备的中断请求引脚相连,每个8259A有8根中断信号线,两片级联总共可以挂接15个不同的外部设备,我们可以通过对8259A的设置使得设备发出的中断请求与中断向量对应起来。
对8259A的设置主要是通过相应的端口写入特定的ICW(Initialization Command Word,初始化命令字)来实现的,主片对应的端口地址位0x20和0x21从片对应的端口地址为0xA0和0xA1
8259A编程
8259A可接受两种命令字:
- ICW(初始化命令字):在执行普通操作之前,系统中的每个8259A必须通过2到4个字节的WR定时脉冲序列到达起始点
- OCW(控制命令字):这些命令字完成8259A不同的模式切换,这些模式为
- 完全嵌套模式(Fully nested mode)
- 轮换优先模式(Rotating priority mode)
- 特殊掩码模式(Special mask mode)
- 轮询模式(Polled mode)
OCW可以在初始化后的任意时间写入
8259A初始化
8259A的初始化过程如下
总结一下初始化过程就是这样的:
- 往主片(0x20)或从片(0xA0)写入ICW1
- 往主片(0x21)或从片(0xA1)写入ICW2
- 往主片(0x21)或从片(0xA1)写入ICW3
- 往主片(0x21)或从片(0xA1)写入ICW4
这4步不能颠倒的
ICW1-ICW4的结构如下
ICW1
8259A的ICW1都固定化为0001_0001B(0x11)
ICW2
主片的中断向量号设置为0x20(IRQ0)具体对应关系如下
IRQ中断对应的向量号如下
IRQn | 中断号 |
---|---|
IRQ0 | 0x20 |
IRQ1 | 0x21 |
IRQ2 | 0x22 |
IRQ3 | 0x23 |
IRQ4 | 0x24 |
IRQ5 | 0x25 |
IRQ6 | 0x26 |
IRQ7 | 0x27 |
IRQ8 | 0x28 |
IRQ9 | 0x29 |
IRQ10 | 0x2A |
IRQ11 | 0x2B |
IRQ12 | 0x2C |
IRQ13 | 0x2D |
IRQ14 | 0x2E |
IRQ15 | 0x2F |
ICW3
主片的ICW3用于记录各IR引脚与从片的级联状态,从片的ICW3用于记录与主片的级联状态,主片的ICW3的值应该设置为0x04从片的ICW3的值被设置为0x02