X86架构中断的处理

中断控制器8259A的原理和使用

 

讨论这些问题,首先要了解中断的概念,什么是中断,中断是怎么一回事。这是基础,可以查阅相关资料去学习。

中断控制器呢?就是在有多个中断源的系统中,接受外部的中断请求,并进行判断、选中优先级最高的中断请求,发从给cpu,cpu响应中断并进入响应的中断处理函数中处理相关事件。结合中断的概念,比如中断控制器接受到一个中断请求,而该中断的优先级高于cpu在处理的问题,那么中断控制器会马上将中断传递给cpu,cpu将转到新的问题上来处理。

这里,只讨论intel系列的中断控制器8259A的工作原理,这也是目前intel芯片组中集成的中断控制器。

 

有两点:

1、1颗8259A可以管理8个中断请求,在intel芯片组中一般是两个8259A级联来实现16个中断的管理。其实理论上可以实现最多9片8259A组成64级的主从式中断系统。

2、8259A是可编程的,有四个ICW(中断初始化命令字)、三个OCW(中断操作命令字)。工作模式灵活。

 

一.中断控制器8259A的引脚图

 

其中

D7~D0:八根数据线,与cpu数据总线线路,传输中断类型码给cpu。

INT: 与cpu的intr相连,用来向cpu发送中断请求。

INTA#: 接受来自cpu的中断应答信号。中断传递时,cpu会发送两个连续的负脉冲给8259A。

CS#  :8259A的片选信号,intel芯片组中有两个8259A。

IR7~IR0: 从IO设备传输中断请求。

 

二,8259A的内部结构

下图为中断控制器的内部结构图。

 

在8259A内部其实还含有7个寄存器,8bit寄存器,四个ICW寄存器(ICW1~ICW4),三个OCW寄存器(OCW1~OCW4)。主要的控制都是这7个寄存器来实现的,均为可读写。初始化命令字一旦设定,基本上不会在调整,而操作命令字侧可以多次设置。

同时,在8259A内部有四个模块:中断请求寄存器IRR、中断优先级仲裁器IPR、中断屏蔽器IMR和当前中断服务寄存器ISR。IRR有8bit,接受外部的中断请求,分别对应引脚的IR7~IR0,哪个中断引脚响应,就哪个bit置位。这个过程可以认为中断请求的锁存。当锁存完成之后,还要经过中断屏蔽寄存器的判断,到底该中断是否被屏蔽。如果对应为为0,则未屏蔽,反之,则屏蔽。然后,进入中断优先级判断寄存器中,判断是否可以中断当前的服务,因为中断服务寄存器ISR保存的是当前中断服务请求。如果判断出新来的中断优先级高于正在处理的中断,则8259A会将INT拉高,想cpu发出一个中断请求。

 

如果cpu的中断允许位IF为1,则cpu在处理完当前原子指令之后,就开始响应中断,通过INTA向8259A发出两个负脉冲。

第一个负脉冲到达8259A之后,

1、  使IRR锁存功能失效,不在接受外来的中断,直到第二个负脉冲到达。

2、  使ISR中的中断对应为置1,表示正在处理的中断请求。

3、  IRR的对应位清零。以备下次用。

第二个负脉冲到来,

1、将ICW2中的中断类型码送到D7~D0总线上,送给cpu。

2、如果icw4的中断自动结束位为1,那么第二个负脉冲结束后将ISR中上一步置的位清零。

 

三,intel芯片组中的8259A的应用

如下图,在芯片组中一般是两个8259A级联,对应的IRQ分配如图所示。

 

 

 

四,后话

以上讨论的是传统中断的分配形式,但是由于产业的不断成长,各种设备相继出现,16个中断是不够用了,比如出现了可共享中断的PCI总线,PCI IRQ routing也相应的提上议程。

以上可以认为是PIC模式,而在最新的架构中,出现APIC模式,一般呈现在OS中,具体的可查阅相关资料。

注,所有图片来自网络

你可能感兴趣的:(BIOS点滴)