8.4-中断系统

Posted PacosonSWJTU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.4-中断系统相关的知识,希望对你有一定的参考价值。

【README】

1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;

2.采用一问一答的方式对中断进行总结(中断7问题),refer2

8.4-中断系统小结(cpu响应中断)_PacosonSWJTU的博客-CSDN博客_cpu响应中断的步骤【README】本文转自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;【1】中断系统1)作用:用中断系统实现了外设数据的输入输出; 还可以用于程序调试,计算机系统的异常事件,都可以用中断系统来处理;2)中断因素人为设置的中断;程序性事故,如java异常;硬件故障,如硬盘坏道;Io设备,如数据输入输出;外部事件,如键盘中断按钮,调试程序;3)中断系统需要解决的问题序号问题1https://blog.csdn.net/PacosonSWJTU/article/details/1235392163.本文首先给出中断全流程


【1】概述

【1.1】引起中断的各种因素

0)中断系统作用
第5章,我们用中断系统实现了数据的输入输出上;还可以用于程序调试,计算机系统的异常事件,都可以用中断系统来处理;

1)引起中断的各种因素

  1. 人为设置的中断;
  2. 程序性事故,如java异常;
  3. 硬件故障,如硬盘坏道;
  4. Io设备,如数据输入输出;
  5. 外部事件,如键盘中断按钮,调试程序;

【1.2】中断系统需解决的问题

序号

问题

1

各中断源如何向cpu提出请求?

2

各中断源同时提出请求,怎么办?

3

Cpu在什么条件,什么时间,以什么方式响应中断?

4

如何保护现场

5

如何寻找入口地址?

6

如何恢复现场,如何返回?

7

处理中断的过程中又出现新的中断 怎么办?


【2】中断请求标记和中断判优逻辑

【2.1】中断请求标记

 【问题1】多个中断源如何提出中断请求
给每一个中断源设置一个触发器,用触发器来标记这个中断源是否提出了中断请求;
(一个中断源对应一个中断请求触发器INTR)多个触发器组成了中断请求标记寄存器;

中断触发器可以做在中断源的接口电路,或做在cpu内部;


【2.2】中断判优逻辑

【问题2】多个中断源同时提出中断请求,怎么办
Cpu如何响应,响应对系统影响最大的中断源;

对中断源进行分级;响应优先级最高的中断源(对中断源的级别进行排队)

排队器可以在中断源接口电路,或在cpu内部;
上图由硬件实现的排队器;也可以软件实现排队器;如下


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

【3.1】硬件向量法

  排队器输出:只有1根线是高电平1,其他全部为低电平0;
向量地址形成部件:根据排队器输出,确定需要响应的中断源,从而确定执行哪一个中断服务程序(通过中断向量地址确定);

【问题3】如何寻找中断服务程序的入口地址?(硬件向量法,或软件查询法)

用硬件查找中断服务程序入口地址有两种方法

  • 方法1: 在中断向量地址的存储单元中存放一条跳转指令 如 jmp 200,则200就是中断服务程序的入口地址;
  • 方法2: 在中断向量地址的存储单元中存放的就是中断服务程序的入口地址,如中断向量地址12H,其保存的入口地址200;

【3.2】软件查找法

用软件如何查找中断服务程序入口地址?
通过执行中断识别程序,进行查找;
利用软件方法更加灵活;

中断识别程序查询步骤:

步骤

指令

说明

1

SKP DZ 1#

SKP表示跳过下一条指令;

指令功能:查询第1号中断源的完成触发器D;看触发器是等于0还是等于1;

  1. 若等于1,说明中断源已经准备好了,提出了中断请求,cpu就要去执行响应的中断服务程序(步骤2)
  2. 若等于0,说明1号中断源没有准备好,则跳过指令2,进入2号中断源的查询(步骤3)

2

JMP 1#SR

执行中断服务程序

3

SKP DZ 2

……

4

JMP 2SR

……


 【4】中断响应 

 【问题4】Cpu在什么条件,什么时间,以什么方式响应中断

1)cpu在什么条件下响应中断请求 ?

  • 为了表示cpu是否响应中断请求,有一个允许中断触发器EINT,值=1表示允许cpu响应中断源发出的中断请求;

2)cpu在什么时间响应中断请求 ?
通常情况下,cpu只有在指令的执行阶段结束以后,才能够响应中断请求;
但cpu的某些指令的执行阶段比较长,这种情况就允许cpu在指令执行过程中,响应中断请求;
问题: 为什么cpu要把响应中断的时间放在指令执行阶段以后呢?

3)cpu响应中断过程:

  • 在指令执行以后,cpu发送查询信号到中断源的中断请求触发器;查询信号把中断请求触发器的输出端设置为1,把中断请求信号发送到排队电路;

【4.3】中断隐指令

1)中断隐指令:说的是保存程序断点,寻找中断服务程序入口地址,关中断这3个步骤是计算机硬件来完成的,并不是在某一条具体指令的驱动下完成的;即,中断隐指令并不是指令集中的指令;但在响应中断过程中,这些硬件操作都要执行;  

EINT,允许中断的R-S触发器; (值为1,表示允许中断)
INT,中断标记的R-S触发器;(值为1,表示相应中断;只要INT设置为1,EINT就要被设置为0) 

 【4.3.1】中断响应过程中要解决的3个问题

问题1)保护程序断点: 断点就是中断服务程序执行完成后,返回执行的指令;

  • 方法1:断点存到特定地址(0号地址)内;
  • 方法2:断点进栈;

问题2) 寻找中断服务程序入口地址;

  • 方法1)采用硬件向量法:把中断向量地址发送到PC寄存器;PC中保存了向量地址,这个向量地址保存了中断服务程序的入口地址,或跳转指令,该指令会跳转到中断服务程序;
  • 方法2)软件查询法:中断识别程序的入口地址发送到PC寄存器;计算机执行中断识别程序来查找中断服务程序的入口地址;

问题3)硬件关中断(把中断允许触发器的值设置为0);

  • 关中断的目的:避免在单重中断的机器中,在执行中断服务程序的过程中,有新的中断源会打断当前的中断服务程序的执行;

另外,即使在多重中断的cpu中,采用关中断的方式,也是为了保存程序断点,保存程序现场的一个过程;


【4.3.2】中断响应步骤

步骤

描述

1

Cpu完成指令执行阶段后,通过硬件向量法查找中断源;各个中断源的信号送入排队器;

2

排队器把中断源信号(只有一根线为1)送给中断标记触发器,从而把INT设置为1,而EINT设置为0;

3

此外,排队器还要把中断信号送给向量地址形成部件,这个向量地址送给PC,为执行中断服务程序做准备;(向量地址保存了中断服务程序的入口地址)


【5】保护现场与恢复现场

1)保护现场

  • 1.1 )保存断点:由中断隐指令(硬件)来做,包括3个步骤(保存断点,形成中断服务程序的入口地址,硬件关中断) ;
  • 1.2)保存寄存器内容(由中断服务程序来做,软件):cpu当中的一些寄存器在执行中断服务程序的时候需要用到;这些寄存器的内容也要进行保存 ;因为这些内容将来中断返回的时候,主程序还要用到;

2)恢复现场

  • 2.1)由中断服务程序完成;因为中断服务程序在保存现场的时候,可以吧寄存器内容压入到堆栈中;在中断服务程序恢复现场时,可以出栈;

3)中断服务程序的工作内容包括

  1. 保护现场;push指令;
  2. 其他服务程序(中断服务程序剩余部分);
  3. 恢复现场;pop指令;
  4. 中断返回;IRET指令;

【6】 多重中断

【6.1】多重中断概念

【问题7】处理中断的过程中又出现新的中断,怎么办
再问:如果新的中断源的优先级,高于当前正在处理的中断源的优先级,又要如何处理?处理过程如下

  • 处理中断1时,发生了中断2,且中断2优先级大于中断1,则停止中断1的服务程序,转而执行中断2的服务程序;
  • 处理中断2时,发生了中断3,且中断3优先级大于中断2,则停止中断2的服务程序,转而执行中断3的服务程序;
  • 上图中: 产生了3次中断,和3个断点,分别是 k+1, l+1, m+1 ;

【6.2】实现多重中断的条件

1)要允许cpu在执行某个中断服务程序时,响应新的中断请求;就要提前打开 EINT允许中断触发器(设置 EINT=1);

2)是不是任何一个新的中断请求都能打断当前正在执行的中断服务?不是的;
只有高优先级的中断源才可以打断低优先级中断源;

3)中断过程如下:

时间

中断

请求

主程序

中断服务程序(优先级降序)

A

B

C

D

1

BC

2

保存主程序断点

3

转到中断服务程序B

执行

4

B中恢复到主程序断点

5

保存主程序断点

6

D

转到中断服务程序C

执行

7

从C中恢复到主程序断点

8

保存主程序断点

9

A

转到中断服务程序D

执行

10

保存中断服务程序D的断点

11

转到中断服务程序A

执行

12

从A恢复到中断服务程序D断点继续执行

13

从D种恢复继续执行

详细步骤解析如下:

  • 1)    主程序在运行时,中断源BC请求中断;
  • 2)    又B优先级高于C,则主程序响应B中断,保存主程序中断断点,执行B的中断服务程序;
  • 3)    恢复现场到主程序;
  • 4)    主程序响应中断C,保存主程序的中断断点,执行C的中断服务程序;
  • 5)    在执行C的中断服务程序过程中,中断D请求中断;由C的优先级高于D,所以cpu不会理会D,而是继续执行中断C;
  • 6)    恢复现场到主程序;
  • 7)    主程序响应中断D,保存主程序的断点,执行D的中断服务程序;
  • 8)    在执行D的过程中,中断源A请求中断;
  • 9)    又A的优先级高于D;所以保存D的中断服务程序为断点,转而响应中断A,执行A的中断服务程序;
  • 10)    恢复现场到D的中断服务程序;执行D的中断服务程序;
  • 11)    恢复到主程序;

【补充】 中断谁就要返回到谁的执行现场


【6.3】中断屏蔽技术

refer2  中断屏蔽技术_PacosonSWJTU的博客-CSDN博客


【6.4】多重中断的断点保护

1)断点保护有2个方法

  • 方法1:断点进栈;由中断隐指令来完成;
  • 方法2:断点存入0号或某个内存地址,由中断隐指令来完成;

2)在中断周期中,需要保存断点;如断点保存到0地址

  • 步骤1:把0地址送入MAR,主存地址寄存器;
  • 步骤2:命令存储器写操作;
  • 步骤3:把PC保存的断点值写入MDR,主存数据寄存器;之前把断点(下一条指令地址)写入0地址,断点在PC寄存器中,因为PC寄存器存储了下一条要执行的指令的地址(下一条指的是主程序或当前正在执行的程序的下一条);
  • 步骤4:把MDR的数据送入到MAR指向的内存单元中;

3)有个问题:中断周期的保存断点阶段,如果都把断点地址保存到0地址,那遇到多种中断,下一个中断周期的断点地址就会把上一个中断的断点给覆盖掉;
如何保证断点内容不丢失呢


【6.4.3】程序断点存入0地址的断点保护

上述指令列表的执行步骤如下:

向量地址

内容

说明

0

断点内容

保存程序断点到0地址;

5

JMP SERVE

serve 是中断服务程序的入口地址;

中断向量形成部件把向量地址5送入pc寄存器;

SERVE

STA SERVE

保存现场;

如保存acc寄存器的内容到SERVE指向的内存单元中;

LDA 0

把0地址的内存单元数据取出来放入acc寄存器;

0地址的内存就是程序断点;

STA RETURN

通过STA指令,把程序断点保存在RETURN单元;

(通过转存把程序断点保护起来)

置屏蔽字

设置中断屏蔽字在开中断之前;

ENI

开中断

LDA SAVE

恢复程序现场;把SAVE内存单元的内容送入acc寄存器;

恢复中断屏蔽字

在返回中断之前,要恢复中断屏蔽字;

JMP @ RETURN

通过一条间接跳转指令(间址寻址);

跳转到RETURN内存单元保存的那个地址(程序断点);

SAVE

XXX

存放ACC内容

RETURN

XXX

转存0地址内容

以上是关于8.4-中断系统的主要内容,如果未能解决你的问题,请参考以下文章

8.4 主存技术的发展

异步事件:轮询与中断

[QNX Hypervisor 2.2用户手册]8.4 处理器间中断

IO系统

先进先出调度算法处理缺页中断

虚拟存储管理中几种缺页中断算法