8.4-中断系统
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.4-中断系统相关的知识,希望对你有一定的参考价值。
【README】
1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;
2.采用一问一答的方式对中断进行总结(中断7问题),refer2
【1】概述
【1.1】引起中断的各种因素
0)中断系统作用:
第5章,我们用中断系统实现了数据的输入输出上;还可以用于程序调试,计算机系统的异常事件,都可以用中断系统来处理;
1)引起中断的各种因素
- 人为设置的中断;
- 程序性事故,如java异常;
- 硬件故障,如硬盘坏道;
- Io设备,如数据输入输出;
- 外部事件,如键盘中断按钮,调试程序;
【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;
|
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)中断服务程序的工作内容包括:
- 保护现场;push指令;
- 其他服务程序(中断服务程序剩余部分);
- 恢复现场;pop指令;
- 中断返回;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-中断系统的主要内容,如果未能解决你的问题,请参考以下文章