中断控制器
摘要
- 为什么需要中断代理
- 为什么需要中断控制器
- 为什么要采用级联来组织8259A
- 8259A的芯片工作原理
- 8259A的内部寄存器
关于中断可以点击这里。
中断控制器的作用
中断控制器相当于一个代理,我们外部设备产生的中断事件不会直接通过INTR总线进入CPU,而是先发送给中断控制器,中断控制器再转交给CPU,中断控制器的主要作用如下:
- 管理和控制可屏蔽中断
- 对可屏蔽中断进行优先权判定
- 发送中断向量号给CPU
为什么需要中断控制器 ?
总结下来:减少CPU的负载,让CPU更加专注于计算。
可屏蔽中断的事件源大多是外部设备,理想情况下我们的CPU可以为每一个外设准备一个引脚,理想丰满,现实骨感。
外设数量的不受限制决定了CPU中准备多少引脚都不够用,并且还会增大CPU的体积。
CPU每一次只能执行一个任务,如果同时有多个中断发生,CPU需要维护一个中断等待队列,中断还有优先级,维护队列和判定优先级都会占用CPU的时间,降低我们CPU的效率。
因此我们把上述的一些维护和判定操作都交给一个专业的中断控制器来做,其中比较流行的就是Intel的8259A芯片。
为什么要采用级联来组织8259A
Intel的CPU支持256个中断,但一个8259A芯片最多管理8个中断(因为只有8条信号线IRQ0~IRQ7),因此为了支持更多设备的中断,需要将多个8259A芯片组合进行使用。
这种组合的方式成为级联,级联最多支持9个芯片级联,n个芯片通过级联可以支持7n+1个中断源,也就是最多支持64个中断。
级联时只能有一个芯片是主片master,其余的是从片slave,来自主片的中断只能传递给从片,再由主片将INT中断信号传递给CPU。
个人计算机通常由两片组成,我们可以看一下示意图如下:
8259A的工作原理
芯片工作原理如下图:
- IMR:中断屏蔽寄存器,宽度为8位,用来屏蔽某个中断,如果IMR寄存器中某一位为1,表示来自该IRQ信号线上的中断会被屏蔽
- IRR:中断请求寄存器,宽度为8位,用来接收没有IMR屏蔽掉的中断,等待处理的中断队列
- PR:优先级仲裁器,用来找出优先级更高的中断
- ISR:中断服务寄存器,宽度8位,用来保存正在处理的中断
- INT:用来给CPU发送中断信号
- INTA:用来接收CPU的INTA中断响应信号
PR如何进行优先级裁定?
PR优先级的判断很简单,IRQ接口号越低,优先级越高,因此IRQ0的优先级最高。
发送了INT信号的中断一定会被处理么?
答案是NO。
首先INT信号中并没有中断向量号,该信号只是通知CPU中断发生了,CPU会响应INTA给8259A芯片请求告知中断向量号,假设此时更高级的中断(IRQ接口号更低)发生,那么旧的中断将会被替换(IRQ对应的IRR位再次置1也就是说又放回了中断等待队列)。
中断处理程序完成以后需要进行哪些扫尾工作?
如果中断结束通知(EOI)是自动模式,则不需要人工介入,因为CPU在向8259A获取向量号的INTA中,8259A会自动将中断的ISR对应的BIT置0。
如果中断结束通知(EOI)是手动模式,中断处理程序结束的位置必须要想8259A发送此通知,8259A在收到EOI通知以后会自动将ISR中对应的BIT置0。
ISR的作用
当中断被处理时,对应的BIT被置1(表示中断处理中)。
8259A内部寄存器
可编程中断控制器除了控制中断还体现在可编程,如何提现可编程呢?即我们可以对其内部的寄存器进行设置,已达到控制8259A工作逻辑的目的。
8259A内部寄存器分类?
- 初始化命令寄存器组:ICW1~ICW4,用来保存初始化命令字
- 操作命令进村器组:OCW1~OCW3,保存操作命令字
8259A的编程分为初始化和操作两部分。
ICW1作用?
由于8529A可以级联使用,ICW1用来初始化8259A的连接方式(单片工作还是多片级联工作)以及中断信号的触发方式(电平触发还是边沿触发)。
ICW1需要写入到主片的0x20端口和从片的0xA0端口,ICW1的结构图如下:
- IC4:表示是否写入ICW4,1位写入,0为不需要
- SNGL:1表示单片,0表示级联
- ADI:用来设置8085的调用时间间隔,x86不需要
- LTIM:用来设置中断检测方式,0表示边沿触发,1表示电平触发
- 第4位:固定位1,ICW1的标记
- 第5~7位:8085专用,x86不用,直接置为0
ICW2的作用?
ICW2是用来设置起始中断向量号的,IR0~IR7是逻辑上的向量号(0~7),实际的向量号=设置的起始中断向量号+逻辑上的向量号。
ICW2需要写入到主片的0x21端口和从片的0xA1端口,结构如下:
- 低3位:有8259A自动导入,IRQ0为000,IRQ1为001,依次类推
- 高5位:用来设置中断其实向量号
高5位和低3位可以表示任意一个IRQ接口实际分配的中断向量号。
ICW3的作用?
ICW3只有在8259A级联工作的时候才有效,用来指定主片和从片用哪个IRQ连接。
ICW3需要写入主片的0x21端口及从片的0xA1端口,由于主从片差异,ICW3结构对于主片和从片也有不同的定义,主片的ICW3如下图:
S0~S7的BIT为1的表示用来连接从片,其余为0的表示连接外部设备。
从片的ICW3如下图:
ICW3的高5位无效,低3位用来设置自己连接到主片上IRQ的序号,比如主片IRQ1和从片相连,那么此ICW3的值就为00000001。在中断响应时,主片会想从片发送级联的IRQ接口,从片只需要对比接口号与ICW3中的值是否一致即可,一致则认为是发给自己的。
ICW4的作用?
ICW4只有在8259A芯片为单片工作时才有效,用来设置其工作模式。
ICW4需要写入主片的0x21和从片的0xA1端口,结构如下图:
- 第5~7位:无意义,置0就可以
- SNFM:0表示全嵌套模式,1表示特殊嵌套模式
- BUF:0表示采用非缓冲模式工作,1表示采用缓冲工作模式
- M/S:当多个芯片级联工作时,如果工作在缓冲模式下,M/S为1表示是主片,0表示为从片,如果工作在非缓冲模式下,M/S无效
- AEOI:0表示中断需要手动结束,需要中断处理程序结束处向芯片的主从片发送EOI信号,1表示自动结束中断。
- uPM:0表示处理器为8080或8085,1表示x86处理器
OCW1的作用?
OCW1用来设置屏蔽中断信号,OCW1要写入主片的0x21和从片的0xA1端口,结构如下图:
OCW1的值最终会被写入IMR寄存器。
OCW2的作用?
- R:表示是否按照循环方式设置中断优先级,1表示优先级自动循环,0表示优先级固定
- SL:表示是否指定优先级,等级是用低3位来指定的,SL为1时低3位有效,SL为0低3位无效
- EOI:中断结束命令位,该BIT位1时,会自动将ISR寄存器中对应的位清0
- L2~L0:用来确定优先级的编码,一种用于EOI时,表示被中断的优先级别,用在优先级循环时,指定起始最低的优先级别
整个OCW2就L2~L0配合R、SL、EOI来形成一定的工作逻辑,如下图:
OCW3的作用?
OCW3的结构图如下:
- ESMM和SMM:组合使用用来启用或禁用特殊屏蔽模式。ESSM为0,SMM无效,ESMM为1,SMM为1表示工作在特殊屏蔽模式。
- P:当P为1时,设置8259A为中断查询方式,这样便可以读取寄存器,查看中断的处理情况
- RR:读取寄存器指令,和RIS配合使用,只有RR为1时,才可以读取寄存器
- RIS:读取中断寄存器选择位,如果为1,表示读取ISR寄存器,如果为0,表示读取IRR寄存器。
ICW和OCW写入的地址端口为?
- ICW1和OCW2、OCW3写入的是主片的0x20端口或者从片OxA0端口
- ICW2~ICW4和OCW1吸入的是主片的0x21端口或者从片的0xA1端口