Hi~朋友,输出不易,点点关注,置顶防止错过消息
摘要
关于中断可以点击这里。
中断控制器的作用
中断控制器相当于一个代理,我们外部设备产生的中断事件不会直接通过INTR总线进入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的工作原理
芯片工作原理如下图:
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内部寄存器分类?
8259A的编程分为初始化和操作两部分。
ICW1作用?
由于8529A可以级联使用,ICW1用来初始化8259A的连接方式(单片工作还是多片级联工作)以及中断信号的触发方式(电平触发还是边沿触发)。
ICW1需要写入到主片的0x20端口和从片的0xA0端口,ICW1的结构图如下:
ICW2的作用?
ICW2是用来设置起始中断向量号的,IR0~IR7是逻辑上的向量号(0~7),实际的向量号=设置的起始中断向量号+逻辑上的向量号。
ICW2需要写入到主片的0x21端口和从片的0xA1端口,结构如下:
高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端口,结构如下图:
OCW1的作用?
OCW1用来设置屏蔽中断信号,OCW1要写入主片的0x21和从片的0xA1端口,结构如下图:
OCW1的值最终会被写入IMR寄存器。
OCW2的作用?
整个OCW2就L2~L0配合R、SL、EOI来形成一定的工作逻辑,如下图:
OCW3的作用?
OCW3的结构图如下:
ICW和OCW写入的地址端口为?