中断系统


I/O设备一文中,提到过I/O的中断,实际上I/O中断只是CPU中断系统的一种,因此没有做详细的介绍。

概述

引起中断的因素

  • 人为设置的中断,如转管指令

  • 程序性事故:如溢出、操作码不能识别、除法非法等,属于由程序设计不周而引起的中断

  • 硬件故障

  • I/O设备

  • 外部事件:用键盘中断现行程序属于外部事件的中断

通常将能引起中断的各个因素称为中断源,中断源可分为两大类:

  • 不可屏蔽中断:这类中断CPU不能禁止响应,如电源掉电
  • 可屏蔽中断:对可屏蔽中断源的请求,CPU可根据该中断源是否被屏蔽来确定是否给予响应

中断请求标记和中断判优逻辑

中断请求标记

为每个中断源设置一个中断请求标志触发器INTR,当其状态为“1”时,表示中断源有请求。多个INTR可以组成中断请求标记寄存器,设置在CPU中。

尽管中断请求标记寄存器是由各中断请求触发器组成,但这些触发器既可以集中在CPU的中断系统内,也可以分散到各个中断源中,在逻辑上组成中断请求寄存器

中断判优逻辑

任何一个中断系统,在同一时间内,只能响应一个中断源的请求,但某一时刻可能有多个中断源同时请求,中断系统必须按其优先顺序予以响应,这就是中断判优。

各中断源的优先顺序是根据该中断源若得不到及时响应,致使机器工作出错的严重程度而定,比如电源掉电对机器工作影响最大,故其优先级最高。

中断判优可用硬件实现,也可以用软件实现。

硬件实现(排队器)
  • 链式排队器,它对应的中断请求触发器分散各个中断源的接口电路中

  • 中断请求触发器集中在CPU内

软件实现(程序查询方式)

软件方式是通过编写查询程序实现的,程序按中断源的优先等级,从高至低逐级查询个中断源是否有中断请求。

中断服务程序入口地址的寻找

硬件向量法

利用硬件产生向量地址,再由向量地址找到中断服务程序的入口地址。向量地址由中断向量地址形成部件产生,这个电路可分散设置在各个接口电路中,也可设置在CPU内。

有向量地址寻找中断服务程序的入口地址通常采用两种办法,一是在向量地址内存放一条无条件转移指令,CPU响应中断时,只要将向量地址送入PC,执行这条指令,便跳转到相应的中断服务程序的入口。另一种是设置向量地址表,该表设在存储器内,存储单元的地址为向量地址,存储单元的内容为入口地址,访问向量地址所指示的存储单元,便可获得入口地址。

图中12H、13H、14H为向量地址,200、300、400为入口地址。

硬件向量法寻找入口地址快,在现代计算机中被广泛使用。

软件查询法

用软件寻找中断服务程序入口地址的框图与判优逻辑中的软件实现相似。当查到某一中断源有中断请求时,安排一条转移指令,直接指向此中断源的中断服务程序的入口地址,机器便自动进入中断服务程序。

这种方法不涉及硬件,比较灵活,但查询时间较长。

中断响应

响应中断的条件

在中断系统中有一个允许中断触发器EINT,它可被开中断指令置为“1”,也可被关中断指令置为“0”,只有当EINT=1,且有中断请求(即INTR=1)时,CPU可以响应中断。

响应中断的时间

CPU总在当前指令执行周期结束后响应任何中断源的请求。CPU在执行周期结束时刻统一向所有的中断源发送中断查询信号,以获知哪个中断源有请求。

有些指令的执行周期很长,为了不错过中断请求,可在执行周期内设置若干个查询断点,CPU在每个“查询断点”时刻均发送中断查询信号,发现中断请求可及时响应。

中断隐指令

CPU响应中断后,即进入中断周期。在中断中期内,CPU要自动完成一系列操作,如:

  • 保护程序断点:将当前程序计数器PC的内容(程序断点)保存到存储器中,它可以存在存储器的特定单元(如0号地址)内,也可以存入堆栈。
  • 寻找中断服务程序的入口地址:由于中断周期结束后进入下一条指令(即中断服务程序的第一条指令)的取指周期,因此在中断周期内必须找到中断服务程序的入口地址,有两种方法:硬件向量法和转件查询法
  • 硬件关中断:CPU进入中断周期后,为了确保CPU响应后所需做的一系列操作不至于又受到新的中断请求的干扰,在中断周期内必须自动关中断,以禁止CPU再次响应新的请求。(多重中断也是如此)

上述保护断点、寻找入口地址和关中断的操作都是在中断周期内由一条中断隐指令完成的。所谓中断隐指令即在机器指令系统中没有的指令,它是CPU在中断周期内由硬件自动完成的一条指令。

保护现场和恢复现场

保护现场

保护现场包括保护程序断点和保护CPU内部各寄存器内容的现场两个方面。

  • 保护程序断点的现场由中断隐指令完成
  • 保护各寄存器的内容可在中断服务程序中由用户(或系统)用机器指令编程实现
恢复现场

恢复现场是指在中断返回前,必须将寄存器的内容恢复到中断处理前的状态,这部分工作也由中断服务程序完成。

多重中断

多重中断的概念

当CPU正在执行某个中断服务程序时,另一个中断源又提出新的中断请求,而CPU响应了这个新的请求,暂时停止了正在运行的中断服务程序,转而去执行新的中断服务程序,这就是多重中断,也叫中断嵌套。

多重中断的条件

  • 提前设置开中断指令,使EINT=0
  • 优先级别高的中断源有权中断优先级别低的中断源

屏蔽技术

屏蔽触发器的作用

图中D为完成触发器、INTR为中断请求触发器、MASK为屏蔽触发器,当该中断源被屏蔽时(MASK=1),此时即使D=1,中断查询信号到来时INTR也被置为0,也就是它被屏蔽。若该中断源未被屏蔽(MASK=0),则当设备工作完成时(D=1),中断查询信号将INTR置1,表示该中断源向CPU发出中断请求,该信号送至排队器进行优先级判断。

排队器集中在CPU内,加上屏蔽触发器,就组成了具有屏蔽功能的排队器,如上图所示。

屏蔽字

每个中断请求触发器对应一个屏蔽触发器,将所有屏蔽触发器组合在一起,便构成一个屏蔽寄存器,屏蔽寄存器的内容称为屏蔽字。屏蔽字与中断源的优先级是一一对应的。如:

在中断服务程序中设置适当的屏蔽字,可以起到对优先级不同的中断源的屏蔽作用。例如,1级中断源的屏蔽字全是1,意味着CPU在执行该中断源的中断服务程序时,CPU不再响应任何一个中断源(包括本级在内)的中断请求;在执行4级中断源的中断服务程序时,由于屏蔽字的1~3位为0,意味着1~3级的中断源未被屏蔽,因此在开中断指令后,比第4级中断源优先级高的1、2、3级中断源都可以中断4级中断源的中断服务程序,实现多重中断。

屏蔽字的设置应该在开中断指令之前

屏蔽技术改变处理的优先级

对中断源响应的优先级是不可改变的,它是由硬件实现的。

但可以通过重新设置屏蔽子来改变中断源处理的优先级。比如:

改变屏蔽字后,响应的优先级是ABCD降序排列,处理的优先级是ADCB降序排列。可以通过CPU的执行过程分析如何改变处理顺序的。

屏蔽技术的其他作用

可以人为的屏蔽某个中断源的请求

多重中断的断点保护

多种中断时,每次中断出现的断点都必须保存起来,可以通过两种方式保存

  • 断点进栈,用栈来保存断点,此操作由中断隐指令完成
  • 断点存入“0”地址,这里的”0”地址并不一定是物理上的0地址,而是任意地址,此操作由中断隐指令完成。中断周期内的操作为:
    1. 0->MAR
    2. CU命令存储器写
    3. PC->MDR,即断点->MDR
    4. (MDR)->存入存储器

这里有一个问题,保存断点是由中断隐指令自动完成的,因此三次中断的断点都将存入0地址,这会导致前两次存入的断点丢失,为此,在中断服务程序中的开中断指令之前,必须先将0地址单元的内容转存至别的地址单元,才能真正保存每一个断点。


文章作者: likai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 likai !
评论
 上一篇
python数据结构之双端队列 python数据结构之双端队列
概念双端队列是一种有次序的数据集合,跟队列类似,也有首端与尾端之分,但与队列不同的是,双端队列的首端和尾端都可以进行入队和出队操作,即新元素既可以添加到首端,也可以添加到尾端,同理,已有的元素也可以从任意一端移除。因此,双端队列集合了队列和
2020-07-27
下一篇 
  目录