分享

i8259A中断控制器分析一

 堆泄露栈溢出 2016-03-29

 最近的工作涉及到操作i8259A中断控制器,索性我就把i8259A的使用系统地总结一下,以方便自己以后查阅。本文先对i8259A中断控制器内部结构和编程做介绍,最后以Linux对i8259A的初始化和操作为例,介绍i8259A的使用O(∩_∩)O~

前言:什么是中断?简单地说就是CPU在忙着作自己的事情,这时候硬件(比如说键盘按了一下)触发了一个电信号,这个信号通过中断线到达中断控制器i8259A,i8259A接受到这个信号后,向CPU发送INT信号申请CPU来执行刚才的硬件操作,并且将中断类型号也发给CPU,此时CPU保存当前正在做的事情的情景现场,然后去处理这个申请,根据中断类型号找到它的中断向量(即中断程序在内存中的地址),然后去执行这段程序(这段程序已经写好,在内存中),执行完后再向i8259A发送一个INTA信号表示其已经处理完刚才的申请。此时CPU就可以继续做它刚才被打断做的事情了,将刚才保存的情景现场恢复出来,CPU继续执行接下来下面的程序。

上面的情景设计到四个关键词:

  • 中断源:这里的中断源是指打断CPU的事件,没有中断源中断无从谈起,它可以是来自硬件,也可以是软件。
  • CPU:真正处理中断的部件
  • 中断控制器i8259A:硬件中断源与CPU之间的桥梁,没有它中断就无法被CPU所识别。
  • 中断服务程序:中断打断了CPU,CPU就得根据这个程序来为该中断办事

中断的分类:上面提到的中断只是中断家族中的一种叫硬件中断,总的来说可以将中断分为内部中断和外部中断,内部中断也叫软中断是由CPU产生的,当处理起执行时遇到了由于程序员编程而导致的错误指令时,如除数为0,这些就会产生内部中断,而外部中断(硬件中断)一般都是硬件所引起的中断比如说键盘等。

在PC中两片i8259A级联的经典结构如下:

i8259A中断控制器分析 <wbr>一
图中是由两片i8259A级联组成的,可以响应15个中断源。由图可以看出硬件接在i8259A的中断请求线上。

  • 中断号:这里所说的中断号是指外部中断即硬件中断的编号,系统为每个“中断请求线”分配了一个号,x86采用了两个8259A,一共有15个中断号,但是随着外设的增加,这些肯定不能满足需求,所以就有了多个外设共享一个中断号。中断号是用来表明是那个设备产生了中断,比如作为时钟中断的IRQ0。这样CPU就可以知道是那个设备产生了中断从而去处理它。
  • 中断向量:Inter x86共支持256个向量中断,为了很容易的识别每种中断源将它们从0到255进行编号,Inter将这个整数叫做中断向量,Linux对这256个中断向量的分配如下:

0~31:异常和非屏蔽中断

32~47:为可屏蔽中断(硬件中断)

48~255:用来表示软中断,其中Linux只用一个(即128或0x80向量)作为系统调用。

前面所述的中断号与中断向量之间的关系是:中断号+32 = 中断向量。中断向量的作用将在下面介绍。

中断描述符表(IDT):一个表,也叫中断向量表,每个表项叫做门描述符(gate descriptor)占8个字节,简单的说是用来存放中断处理程序入口函数地址,当然还包括了一些其他信息。其作用就是当一个中断发生时我们根据它的中断号确定其中断向量,然后在此表中找到它的入口函数从而执行它。这个表存放在内存中的一片区域中,中断描述符寄存器IDTR存放IDT表的基地址。在系统初始化时有一条汇编指令LIDT便可将中断描述符表的地址装进IDTR中,IDTR48位,在低字(低16位)中装的是界限,在高双字(高32位)中装的是基址。

下面先对i8259A中断控制器内部结构和编程做介绍,最后以Linux对i8259A的初始化和操作为例,介绍i8259A的使用。

第一部分 i8259A的引脚及内部结构

1.1 引脚信号

i8259A引脚信号如下图所示:

i8259A中断控制器分析 <wbr>一

图1 i8259A引脚图
  • D7~D0:双向、三态数据线,与系统数据总线相连。对i8259A编程时,命令字由此写入,在第二个中断响应总线周期中,中断类型码由此传给CPU。
  • RD (上划线):读信号,输入,与系统控制总线IOR(上划线) 相连。RD (上划线) =0时,CPU对i8259A进行读操作。
  • WR(上划线) :写信号,输入,与系统控制总线IOW(上划线) 相连。当WR(上划线)=0时,CPU对i8259A进行写操作。
  • A0:片内寄存器寻址信号,输入,用于对片内寄存器端口寻址。每片i8259A有两个寄存器端口,A0=0时,选中偶地址端口,A0=1时,选中奇地址端口。在与8088系统相连时,可将该引脚与地址总线的A0连接;与8086系统连接时,可将该引脚与地址总线的A1连接。
  • CS (上划线):片选信号,输入。CS (上划线) =0时,i8259A被选中。在与8088系统相连时,系统地址信号A15~A1经译码器译码后为i8259A产生片选信号。
  • SP/EN(上划线) :双功能双向信号。当8259A工作在缓冲模式时,它作为输出,用于控制缓冲器的传送方向。当数据从CPU送往i8259A时,SP/EN(上划线) 输出为高电平;当数据从i8259A送往CPU时,SP/EN(上划线) 输出为低电平。当8259A工作在非缓冲模式时,它作为输入,用于指定8259A是主片还是从片(级联方式)。SP/EN(上划线) =1的8259A为主片,SP/EN(上划线) =0的8259A为从片。

备注:在Linux中, i8259A均工作在非缓冲模式下。

  • INT:中断请求信号,输出,与CPU的中断请求信号线INT相连。在级联方式下,从片的INT与主片的IR7~IR0中的某一根连接在一起。
  • INTA(上划线) :中断响应信号,输入,与CPU的中断响应信号线INTA(上划线) 相连。
  • CAS2~CAS0:级联控制线,主片的CAS2~CAS0与从片的CAS2~CAS0对应相连。对于主片,CAS2~CAS0为输出信号;对于从片,CAS2~CAS0为输入信号。当从片发起的中断请求被响应时,主片通过CAS2~CAS0送出相应的编码给从片,告诉从片该中断请求被允许
  •  IR7IR0中断请求输入信号,由外设输入。上升沿(边沿触发方式)或高电平(电平触发方式)表示有中断请求到达。
  • VCC:+5V电源输入信号。   
  • GND:电源地
1.2 i8259A内部结构

i8259A的内部结构如下图所示:

i8259A中断控制器分析 <wbr>一

图2 i8259A内部结构
  • 数据总线缓冲器:数据总线缓冲器为三态、双向、8位寄存器。数据线D7~D0与CPU系统数据总线连接,构成CPU与8259A之间信息传送的通道
  • 读/写控制逻辑:读/写控制逻辑用来接收来自系统总线的读/写控制信号和端口地址寻址信号,用于控制8259A内部寄存器的读/写操作。 
  • 级联缓冲/比较器:8259A既可以工作于单片方式,也可以工作于多片级联方式。级联缓冲/比较器提供多片8259A的管理和选择功能,其中一片为主片,其余为从片。
  • 中断控制逻辑:中断控制逻辑按照编程设定的工作方式管理中断,负责向片内各部件发送控制信号,向CPU发送中断请求信号INT和接收CPU回送的中断响应信号INTA ,控制8259A进入中断管理状态。
  • 中断请求寄存器(interrupt request register,IRR):IRR是一个8位(D0~D7)寄存器,它接受并锁存来自IR0~IR7的中断请求信号,也就是说它记录着当前的中断请求。D0~D7与中断请求信号IR0~IR7对应,当IRi(i=0~7)上出现中断请求信号时,对应的Di置1。因为同一时刻可能有多个中断请求到达,因此IRR可能有多个位置1。第一个中断响应信号INTA (上划线)到达后(CPU在对8259A的中断请求INT进行响应时,会连续返回两个中断响应信号INTA (上划线) ,产生两个中断响应总线周期),如果8259A决定使IRi得到响应,则会将对应的Di清除。第一个中断响应脉冲IINTA (上划线) 到达后,IRR锁存功能失效,不接受IR0~IR7上的中断请求信号;直到第二个中断响应脉冲INTA (上划线) 结束后,IRR锁存功能才得以恢复。
  • 中断服务寄存器(interrupt service register,ISR):ISR是一个8位(IS0~IS7)寄存器,用于记录CPU当前正在服务的中断。IS0~IS7与中断请求信号IR0~IR7对应。第一个中断响应脉冲IINTA (上划线)达到后,如果i8259A决定使IRi得到响应,则会将对应的ISi(i=0~7)置1,表示IRi正在被服务。ISi的复位则由i8259A中断结束方式决定。若i8259A被设置为自动结束方式,ISi会在第二个中断响应脉冲INTA 的后沿被自动复位为0;若8259A被设置为非自动结束方式,则Di应由其对应的中断服务程序发送来的中断结束命令(EOI)复位。ISi置1可阻止与其同级或更低优先级的中断请求被响应,但不能阻止比其优先级高的中断请求被响应,即允许中断嵌套。因此,ISR中可能不止一位被置1。
备注:在Linux内核中,i8259A采用非自动结束方式
  • 中断屏蔽寄存器(interrupt mask register,IMR):IMR是一个8位(IM0~IM7)寄存器,用来存放IR0~IR7的中断屏蔽标志。IM0~IM7与中断请求信号IR0~IR7对应,用于屏蔽IRi。当IMi=1时,对应的IRi中断请求被禁止;IMi=0时,对应IRi中断被开放。
  • 优先权判决器(priority register,PR):优先权判决器将IRR中记录的当前中断请求与ISR中记录的CPU正在服务的中断按中断优先级排队并进行比较,如果IRR中优先级最高者的优先级高于ISR中优先级最高者,则由中断控制逻辑向CPU发出中断请求信号INT,使CPU暂停当前的中断服务,转而响应IRR中优先级最高者,即进行中断嵌套;否则8259A不向CPU发起中断请求INT,CPU继续当前的工作。
第二部分 i8259A工作过程
2.1 i8259A处理中断的过程
  1. 接受来自IR0~IR7的中断请求,使IRR的对应位置1。
  2. PR对IRR中记录的且未被屏蔽的中断和ISR中记录的中断进行优先权判决,并决定是否向CPU发起中断请求INT。如果IRR中优先级最高者的优先级高于ISR中优先级最高者,则向CPU发出中断请求信号INT,否则不发出。
  3. CPU收到INT,如果IF=1,则待当前执行的指令结束后连续返回给8295A两个中断响应信号INTA(上划线) 。
  • i8295A收到第一个中断响应信号INTA(上划线) 后:                                                
  • (1)使IRR的锁存功能失效,不再接受中断请求,直到第二个中断响应信号INTA(上划线)结束后恢复;     
  • (2)对IRR中记录的优先级最高的中断请求进行响应:使其对应的ISR位置1,并使其对应的IRR位复位。
  • i8295A收到第二个中断响应信号INTA 后: 
  • (1)将被响应中断的中断类型码送CPU。CPU用中断类型码乘以4就得到了该中断的中断向量的地址,然后      从该地址中取出中断向量,转而执行该中断的中断服务程序,即对该中断进行服务。                
  • (2)如果i8295A工作在自动结束方式,在第二个中断响应脉冲INTA 的后沿,会使被响应中断对应的ISR位      复位。如果i8295A工作在非自动结束方式,则中断服务程序在结束之前,应通过中断结束命令(EOI)      使中断对应的ISR位复位。
2.2 i8259A工作方式
i8259A的中断管理功能很强,单片可以管理8级外部中断,在多片级联方式下最多可以管理64级外部中断,并且具有中断优先权判优、中断嵌套、中断屏蔽和中断结束等多种中断管理方式。
2.2.1 中断优先方式
一般情况下,i8259A总是响应优先级最高的中断请求,而且使CPU暂停对低优先级中断的服务,转而服务高优先级的中断,即中断嵌套。i8259A的中断优先方式分为两种:
  1. 固定优先级方式:在固定优先级方式中,IR0~IR7的中断优先级是固定不变的,除非通过编程重新设置优先级别。i8259A在加电后就工作在固定优先级方式,刚加电时,IR0~IR7默认的优先级顺序是:IR0,IR1,IR2,…,IR7,其中,IR0的优先级最高,IR7的优先级最低。
  2. 自动循环优先级方式 :在自动循环优先级方式中,IR0~IR0优先级是可以改变的。其变化规律是:当某个中断请求的服务结束后,它的优先级自动降为最低,原来比它低一级的中断则变为最高级,IR0~IR7的优先级按右循环方式改变。例如,若初始优先级从高到底依次为IR0,IR1,IR2,…,IR7,此时如果IR4和IR6有中断请求,则先服务IR4。在IR4被服务之后,它自动降为最低级,IR5变为最高级,这时中断优先级顺序变为:IR5,IR6,IR7,IR0,IR1,IR2,IR3,IR4。这种优先级管理方式,可以使8个中断请求都可享受同等优先服务的权利。
自动循环优先级方式分为普通自动循环方式和特殊自动循环方式两种:
  1. 普通自动循环方式的特点:IR7~IR0的初始优先级顺序由系统指定,即优先级从IR0到IR7依次降低。以后随着中断的产生,它们的优先级顺序将按右循环方式自动改变。
  2. 特殊自动循环方式的特点:通过编程人为地将某个中断请求降为最低级,而其它中断请求的优先级也随之改变,以后随着中断的产生,它们的优先级顺序将按右循环方式自动改变。例如,通过编程将IR4降为最低级后,IR7~IR0的优先级顺序则变为:IR5,IR6,IR7,IR0,IR1,IR2,IR3,IR4。
2.2.2 中断嵌套方式
无论是固定优先级方式而是自动循环优先级方式,它们都允许中断嵌套,即允许更高优先级的中断打断CPU当前的中断服务过程,使CPU转而为更高优先级的中断进行服务。i8259A允许两种嵌套方式:
  1. 普通全嵌套方式:普通全嵌套方式是i8259A最常用的工作方式,简称为全嵌套方式,它是8259A初始化后默认的工作方式。其特点是:在CPU进行中断服务时(即执行中断服务程序过程中),若有新的中断请求到来,8259A只允许比当前服务的中断请求的优先级“高”的中断请求进入(也就是为比当前服务的中断请求的优先级“高”的中断请求向CPU发出INT信号),而不允许“同级”或“低级”的中断请求进入。
  2. 特殊全嵌套方式:特殊全嵌套方式是i8259A在多片级联方式下使用的一种嵌套方式。其特点是:在CPU进行中断服务时,8259A除了允许更高优先级的中断请求进入外,还允许同级中断请求进入,从而实现了对同级中断请求的特殊嵌套。
级联方式下,主片通常设置为特殊全嵌套方式,从片设置为普通全嵌套方式。这样设置的好处在于:当从片的某个中断请求得到响应并进入中断服务期间后,来自该从片的“更高级”的中断请求仍能被主片响应。这是因为从片的所有中断请求都是通过同一个IRi引入主片,对于主片来说,来自从片的所有中断请求都属于同级,而特殊全嵌套方式允许同级的中断请求进入,因此主片能响应来自从片的“更高级”的中断请求。
2.2.3 中断屏蔽方式
中断屏蔽方式是对i8259A的中断请求IR0~IR7进行屏蔽的一种中断管理方式,有普通屏蔽方式和特殊屏蔽方式两种。
  • 普通屏蔽方式:普通屏蔽方式是通过i8259A的中断屏蔽寄存器(IMR)来实现对中断请求IRi的屏蔽。通过编程写入操作命令字OCW1,将IMR中的IMi位置1,以达到对相应的IRi(i=0~7)中断请求的屏蔽。一旦IRi被屏蔽,它就不可能被i8259A响应。
  • 特殊屏蔽方式:在某些应用场合,我们希望正在被CPU服务的中断能够被更低优先级的中断请求打断。为达到这个目的,自然会想到使IMR中的相应位置1,使本级中断受到屏蔽,从而为更低优先级的中断请求进入提供可能,但是这样做有一个问题:每当一个中断请求被响应时,8259A会使该中断对应的ISR位置1,只要CPU没有对该中断发出中断结束命令(EOI),i8259A就会禁止所有比它优先级低的中断请求进入。如果i8259A工作在特殊屏蔽方式,使IMR的某位置1,就会同时使ISR的对应位自动复位。这样就可以使更低优先级的中断请求进入,当然未被屏蔽的更高优先级的中断请求也可以进入。可以通过编程写入操作命令字OCW3来设置或取消特殊屏蔽方式。 
2.2.4 中断结束方式
当一个中断请求IRi得到响应时,i8259A会将其对应的ISR位置1,CPU服务完该中断后,应及时清除其对应ISR位,否则就意味着CPU仍在为该中断服务,致使比它优先级低的中断请求无法进入。i8259A提供了以下三种中断结束方式:
  1. 自动结束方式:如采用自动结束方式,则刚被响应的中断请求对应的ISR位会在第二个中断响应脉冲INTA(上划线) 的后沿被复位。这种中断服务结束方式是由硬件自动完成的。需要注意的是:尽管中断请求对应的ISR位被清除,但其中断服务程序并不一定真正结束,若在中断服务程序的执行过程中有另外一个比其优先级低的请求信号到来,而i8259A并没有保存任何标志来表示当前中断服务尚未结束,致使低优先级中断请求进入,从而打断当前中断服务程序的执行。因此这种方式只适合用在没有中断嵌套的场合。
  2. 普通结束方式:如采用普通结束方式,则中断服务程序在结束之前应向i8259A写入一个包含了普通EOI命令的操作命令字OCW2,该命令不指定需复位的ISR位。收到该命令后,i8259A会清除ISR中已置1的优先级最高的那一位。在普通全嵌套方式下,因为CPU正在服务的中断只会被优先级更高的中断请求打断,因此当前结束的中断必定是所有正在服务的中断中优先级最高的,它对应着ISR中已置1的优先级最高的那一位,因此普通结束方式适用于普通全嵌套方式下的中断结束。
  3. 特殊结束方式:特殊结束方式要求中断服务程序在结束之前向8259A写入一个包含了特殊EOI命令的操作命令字OCW2,该命令要指定需复位的ISR位。由于在特殊EOI命令中明确指出了复位ISR中的哪一位,因此,它可以用于普通全嵌套方式下的中断结束,更适用于优先级嵌套结构有可能遭到破坏时(CPU正在服务的高优先级中断被低优先级/同级的中断请求打断)的中断结束。 
备注:对级联系统中的从片的中断结束处理做一些说明。在主片设置为特殊全嵌套方式,从片设置为全嵌套方式的情况下,从片可能出现中断嵌套。来自从片的任意中断的中断服务程序在结束之前,都应先向从片发出一个普通EOI命令,使其本身对应的ISR位复位,然后读出ISR的内容,如果为0,则向主片发出一个特殊EOI命令,清除主片中与引入从片的IRi对应的ISR位;如果从片ISR的内容不为0,则说明从片中仍有中断服务尚未完成,此时,则不需要向主片发出特殊EOI命令。

 2.2.4 中断触发方式

 中断请求输入端IR0~IR7可采用的中断触发方式有电平触发和边沿触发两种,由初始化命令字ICW1中的LTIM位来设定。

  • 当LTIM设置为1时,为电平触发方式。i8259A检测到IRi(i=0~7)端有高电平时产生中断。如采用这种触发方式,中断请求信号在被响应后应及时撤除,否则可能引起不该有的第二次中断。
  • 当LTIM设置为0时,为边沿触发方式。8259A检测到IRi端有由低到高的跳变信号时产生中断。

备注:无论采用哪种中断触发方式,中断请求信号都应维持足够的宽度,即在第一个中断响应信号INTA 到达之前,都必须保持高电平。

2.2.5 级联工作方式
当中断源超过8个时,就无法用一片i8259A来管理,这时可采用i8259A的级联工作方式。指定一片i8259A为主控芯片(主片),它的INT输出端接到CPU的INT输入端,而其余的i8259A芯片均作为从属芯片(从片),其INT输出端分别接到主片的不同IR输入端。由于i8259A有8个IR输入端,故一个主片可连接8个从片,最多允许有64个IR中断请求输入。由一片主片和两片从片构成的级联中断系统如下图所示,其中省略了用于产生片选信号的译码器。
i8259A中断控制器分析 <wbr>一
图3 i8259A多片级联硬件连接图

在级联系统中,主片和从片都有独立的地址,而且需分别进行初始化编程来设置各自的初始工作方式。若中断请求来自于从片,该请求将通过从片的INT输出端传给主片,一旦该请求被主片响应,主片会通过CAS0~ CAS02来通知相应的从片,而从片即可把该中断请求对应的中断类型码放到数据总线上,使该中断请求得到CPU的服务。

2.2.6 总线连接方式

 i8259A数据线与系统数据总线的连接有缓冲和非缓冲两种方式: 

  1. 缓冲方式:如果i8259A通过总线驱动器和系统数据总线连接,i8259A应选择缓冲方式。当设置为缓冲方式后,SP/EN(上划线) 即为输出引脚。在i8259A向CPU传送中断类型码的时候,SP/EN(上划线) 输出一个低电平,用此信号作为总线驱动器的启动信号。
  2. 非缓冲方式:如果i8259A的数据线与系统数据总线直接相连,那么i8259A工作在非缓冲方式。
第三部分 i8259A编程

 待续。。。。。。。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多