微型计算机的中断系统

1. 中断的基本概念

1.1 中断与异常

上一章提到了,微处理器和外设有三种基本的IO方式,分别是直接程序控制方式、中断方式、DMA方式。在中断方式中,外设满足传输条件后向处理器发送中断请求信号,然后处理器调用中断服务程序,进而提高了处理器的效率。现在,我们正式地认识一下中断,中断是指微处理器在正常执行程序的过程中,当出现某些意外情况或某种外部设备请求时,暂停正在执行的程序,转而去执行某一个特定的程序,并在执行后返回原来暂停执行的程序继续执行的过程。

而我们平时经常提到的异常其实是传统意义上的内部中断,也叫做异常中断,即因内部意外条件而改变程序执行流程以报告出错情况和非正常状态的过程;相反的,把因外部事件而改变程序执行流程的这个过程称为外部中断,也叫做硬件中断

广义上的中断包括异常,二者的区别在于:中断处理异步发生的外部事件,异常处理同步发生的内部事件。

异常的类型:

  1. 故障(Faults):有时称为失效,是在引起异常的指令执行前被检测和处理,故障异常可以正确执行下去。如除法出错、界限检查、无效操作码、协处理器不存在等。
  2. 陷阱(Traps):在引起异常的指令执行之后被报告,在服务程序完成后,返回主程序中引起异常指令的下一条指令继续执行。如用户定义的软件中断:单步陷阱、断点异常、溢出、INTn、BOUND等。
  3. 夭折(Abort):是一种不能确定引起异常指令确切位置的异常。

中断的分类:

  1. 内部中断:即异常。
  2. 外部中断 / 硬件中断:主要包括不可屏蔽中断(NMI)和可屏蔽中断(INTR)。
    不可屏蔽中断:不能用软件来控制是否允许中断,常见的NMI中断有电源掉电、存储器检验出错、总线奇偶错。为这些紧急请求设置了不可屏蔽中断输入引脚NMI,这些重要的故障信号传至该引脚。
    可屏蔽中断:可用软件控制是否允许中断的外部中断,即STI使IF=1,允许中断;CLI使IF=0,禁止中断。所有外设中断都属于INTR,如键盘中断、串并口中断、硬盘中断等。系统中所有外设的中断请求信号都通过外接的中断控制器与微处理器的INTR相连
  3. 系统管理中断:与系统管理方式对应的中断源叫做系统管理中断-SMI。

在这里插入图片描述

1.2 中断过程

中断过程分五步走:

第一步,中断请求。 外部中断源发出中断请求或者内部产生某种异常都会通知微处理器。

第二步,中断判优。 很好理解,如果微处理器同时收到多个中断请求,总得有个处理顺序,这就是中断判优,微处理器首先响应优先级最高的中断请求。

第三步,中断响应。 这步有点麻烦,指的是当微处理器收到那个优先级最高的中断请求后,到开始处理它(进入中断服务程序)之前的这段时间。
对于可屏蔽中断,当这个中断申请到达了处理器,处理器执行完当前指令,就开始进入中断响应周期,这期间CPU做了这些事情:

  1. 向外部中断控制器发送两个脉冲响应信号(INTA):第一个INTA告诉中断控制器已经响应外部中断请求,赶紧把中断类型号准备好;第二个INTA,CPU拿走中断类型号。
  2. 将标志位寄存器内容压栈,清IF、TF以禁止INTR和陷阱、单步中断。
  3. 将断点地址压栈(CS:IP),断点地址就是原来CPU执行的程序中的下一条指令的地址。
  4. CPU根据中断类型号找到中断服务程序入口地址,执行中断服务程序。

第四步,中断处理。 第三步结束,微处理器顺利地找到了中断服务程序,于是CPU开始执行中断服务程序。

  1. step1 保护现场。 在上一步中断响应这个阶段,CPU已经自动完成了对标志位寄存器内容和断点地址的保护,这一步要做的是:将寄存器信息压栈保护,基本原则是,如果某些主程序用到的寄存器,中断程序也用到了,那么这些寄存器信息必须压栈保护,
  2. step2 开中断。 在上一步中断响应阶段,微处理器进行了清IF、TF标志位,是为了防止在中断响应过程中又有新的中断来干扰。那么现在已经进入了中断服务程序,该做的工作都做好了,已经不怕打扰了,所以开放所有可屏蔽中断,目的是允许中断嵌套。
  3. step3 执行中断服务程序。 针对外设请求,CPU执行I/O;针对内部异常,CPU做出相应处理。在这一步,允许响应更高一级的中断。
  4. step4 关中断。 使用关中断指令CLI。
  5. step5 恢复现场。

第五步,中断返回。 中断服务程序最后一条指令无一例外使用中断返回指令(如IRET或IRETD),该指令将第三步中压栈的标志位寄存器信息和断点地址一次从堆栈中弹出。

1.3 外部中断源的管理

在微机系统中,中断优先级从高到低依次为:在这里插入图片描述
其中NMI通过某种硬件结构确定多个不可屏蔽中断的优先级;INTR利用外部中断控制器决定和管理多级中断。

当多个中断源共用一根中断请求线时,就涉及到了中断源的识别问题。有软件查询和硬件处理法:

  • 软件查询即按优先级从高到低依次查询,看看到底是哪一个。
  • 硬件处理,就是采用如编码器和比较器的优先权排队电路以及中断控制器等硬件来管理中断。

2. 实地址方式和保护方式下的中断

核心问题是怎么找到中断服务程序的入口地址,分两种方式。

2.1 实地址方式

先明确两个概念:

  • 中断向量: 中断服务程序的入口地址。每个中断服务程序对应一个中断向量。
    组成及格式:4个字节;低地址存偏移量,高地址存段地址(牢记!)
    在这里插入图片描述

  • 中断向量表: 顾名思义,存中断向量的地方,即中断向量表里面存着所有中断服务程序的入口地址。由于系统有256个中断类型号,每个中断类型号对应一个中断服务程序,每个中断服务程序对应一个4字节的中断向量,所以中断向量表大小为1KB。另外,它固定在内存的起始位置:00000H~003FFH,这就意味着中断向量表的基地址为0。

所以从上面的分析可知,求一个中断类型号对应的中断服务程序入口地址的方法为:

  1. 算出它的起始地址和末地址分别为:4n,4n+3;
  2. 由中断向量的格式可以找到段地址和偏移量
  3. 入口地址就是:段地址 × 16 + 偏移量。(实地址下的寻址方式)

2.2 保护方式

很绕,先说几个概念,结合后面的例题看会清楚一点:

  • 中断描述符:主要为了提供中断服务程序在内存中的偏移地址段选择子
    组成及各式:8个字节;如下:
    在这里插入图片描述
  • 段选择子:偏移地址有了,就差段基地址了,段选择子就派上用场了。段选择子共16位,左边13位是索引,1位TI位,2位RPL位。其中TI位就用来指示在GDT还是LDT中找段描述符,一旦确定了之后,断描述符表的基地址就确定了(题目给你),再加上前面13位索引位就可以找到段描述符,从段描述符中可以找到段基地址;再加上中断描述符中的偏移地址,就得到了中断服务程序的入口地址。
  • 中断描述符表:系统有256个中断类型,每个中断类型的中断描述符8个字节,所以这个表有2KB。但是它不像实地址下的中断向量表在内存最低端,它有IDT(中断描述符表)首地址。

例1:已知保护方式下,内存单元中有关单元存放的内容如右图所示,IDT的首地址为00280000H,GDT的首地址为00500000H,求20H号中断服务程序入口地址。
在这里插入图片描述

  1. 找到20H号的中断描述符。 起始地址:20H * 8 + 00280000H = 00280100H,持续8个字节,即红框标出来的部分 (注意顺序)
  2. 在中断描述符里面找出偏移地址和段选择子。 分别是:00422012H,0013H。
  3. 拆开段选择子,找到索引值(段描述符偏移量)和TI值。 0000,0000,0001,0011B。
    高13位:0000,0000,00010B;
    TI:0,所以选择GDT(1对应LDT)。
  4. 通过索引值和段描述符基址(本题中是GDT)找到段描述符。
    段描述起始地址为:00500000H + 0000,0000,00010B * 8 = 00500010H,持续8位为段描述符,即蓝框部分。通过段描述找到段基址:39423400H。
  5. 通过偏移地址和段基址找到中断服务程序入口。 39423400H + 00422012H = 39845412H

题目一般会给IDT、GDT、LDT基地址,中断描述符和段描述符格式,理一理这几个概念:

  • IDT是中断描述符表,它的基地址用来找中断描述符。
  • 中断描述符:存了中断服务程序在内存段内的偏移地址段选择子。而段选择子里面又存了选哪个段描述符表(TI)段描述符在段描述符表里面的偏移地址(索引值)
  • GDT/LDT是全局/局部段描述符表,用哪个是段选择子里面的TI位决定的,决定好了之后,这个表的基地址 + 索引值 = 段描述符
  • 段描述符:存了需要的这个内存段的基地址,这个内存段的基地址 + 偏移地址 = 入口地址

例2:已知内存单元中有关单元存放的信息如表,CR0=60000001H,IDTR=6500000007FFH,GDTR=001000007FFFH,求类型号为11H的中断服务程序入口地址。
在这里插入图片描述

  1. CR0的最低位PE=1,说明保护模式;最高位PG=0,说明不分页。
  2. IDTR高32位为IDT首地址,低16位为表长度,所以中断描述符地址为:65000088H。
  3. 取8个字节,由低到高排序(注意顺序) 得到中断描述符:0042EE0081132012H。
  4. 偏移地址:00422012H,段选择子:8113
  5. 段选择子展开,索引值:8110,TI=0:选GDT
  6. GDT首地址为GDTR前32位,所以段描述符地址:00100000+8110=00108110
  7. 取8个字节为段描述符:0144F20070001FFFH,段基址:01007000H
  8. 入口地址:01007000H+00422012H=01429012H

2.3 两种方式下中断的主要区别

  1. 表的大小不同。 中断向量表1KB,中断描述符表2KB。因为同样有256个中断类型,实地址方式下中断向量4B,而保护模式下中断描述符有8B。
  2. 表的位置不同。 实地址方式下1KB的表基地址为内存空间的最低端,即放在0000H~03FFH;保护方式下2KB表的基地址由中断描述符寄存器IDTR决定。
  3. 中断服务程序存放位置不同。实地址只能存在1MB以下的内存区域,保护方式下可以在内存中随便放。

3. 可编程中断控制器8259

这块片子就是前面所说的通过硬件来管理中断的那个“硬件”。

3.1 内部结构

在这里插入图片描述
拿到一块片子,肯定先搞清楚内部结构和外部引脚,下面介绍一下。

数据总线缓冲器:

  1. CPU向8259发送命令;
  2. 8259向CPU传送状态信息;
  3. 在中断响应周期,CPU从中获取中断类型号。

读写逻辑:平平无奇,不需要解释

级联缓冲/比较器:一个8259只能容下8个中断请求,如果不够用就需要多个片子级联,这时就需要存放和比较设备的主从关系,这个部分就是干这个的。

控制逻辑:控制8259内部各个部件的主要逻辑电路。

  1. 根据CPU传过来的命令字产生内部控制信号
  2. 对应于当时最高优先级的中断源,向CPU发中断请求信号INT,以便让CPU进行中断响应。
  3. 接受CPU在第一个脉冲赐予的中断响应信号(-INTA),并在此时让ISRi=1,IRRi=0。
  4. 把相应的中断类型号准备好,CPU在第二个脉冲的时候来取。

中断请求寄存器 IRR:记录外部中断源的中断申请状态。

  1. 1 = 对应引脚有中断请求但是还没响应;
  2. 0 = 对应引脚无中断请求或者是刚刚有请求但是被响应了。

优先权分辨器 PR:选出最高优先中断源的中断请求给控制逻辑,然后控制逻辑给CPU发INT。

中断服务寄存器 ISR:记录外部中断源的中断申请是否在被处理。

  1. 1 = 对应引脚的中断请求已经被响应了,CPU正在处理但是还没处理完;
  2. 0 = 对应引脚的中断请求还没被响应

中断屏蔽寄存器IMR: 设置外部中断源的屏蔽状态,对应引脚为1就给它屏蔽了,反之没屏蔽。需要注意的是,只有IMRi对应位=0且IF=1,CPU才有可能响应可屏蔽中断。

3.2 工作过程

顺着结构,介绍一下工作过程,挺重要的。

  1. 当外部中断源产生中断请求后,IRR对应引脚的IRRi = 1;
  2. PR判别优先级,将当前最高优先中断源的请求通知控制逻辑,控制逻辑向CPU发送INT信号。
  3. CPU决定响应该中断后,先在第一个时钟脉冲发送INTA信号,表示可以响应该中断;控制逻辑收到该响应后,将ISRi置位,将IRRi复位,同时准备中断类型号。
  4. CPU在第二个脉冲时取走中断类型号。
  5. CPU处理完中断服务程序后发送中断结束命令,控制逻辑使对应ISRi复位,结束中断过程。

几个思考题,也写一下吧:

  1. 什么情况下IRR=FFH?
    所有中断源都发出中断请求但都还没被响应。
  2. 什么情况下ISR=FFH?
    八级中断嵌套的情况,从最低到最高优先级的中断源发出的中断请求依次被响应,但都还没结束。
  3. IMR=FFH,计算机会怎样?
    所有硬件中断全部被屏蔽,系统瘫痪。
  4. IRR=0AH,ISR=0AH是否有可能出现?
    有可能,对应IR1和IR3的中断请求都已被响应且没结束,IR1和IR3又产生了新的申请的情况。

3.3 多片级联

  • 级联时,有一个主8259,最多八个从8259 ;
  • 级联时,主8259的三条级连线CAS0~CAS2作为输出线,连至每个从8259A的CAS0~CAS2;
  • 每个从8259的中断请求信号INT,连至主8259的一个中断请求输入端IR;主8259的INT线连至CPU的中断请求输入端;
  • -SP/-EN,在非缓冲方式下,规定该8259是主片(-SP=1)还是从片(SP*=0)。

3.4 8259编程

老规矩,先初始化编程(ICW Initialization Command Word),再写命令字(OCW Operation Command Word)。直接按照格式写写程序就好了,注意只有ICW1是往偶端口写,其余的都是往奇数端口写,没什么难度。
初始化编程流程:
在这里插入图片描述
对8259进行了初始化之后,8259就进入了工作状态,准备就收中断请求信号。可以通过操作命令字OCW使其以不同的方式工作,有三个操作命令字:

  • OCW1:中断屏蔽命令字,用于向中断屏蔽寄存器IMR写入屏蔽信息。
  • OCW2:用于非自动中断结束方式下发出中断结束命令和设置优先级循环方式。
  • OCW3:屏蔽查询状态命令字,用于管理特殊的屏蔽方式和读取8259状态寄存器中的内容。
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值