计算机组成结构—中断和异常

news2024/11/24 16:48:25

一、基本概念和分类

        计算机在执行程序的过程中,有时会遇到一些异常情况或者特殊请求;这时就需要计算机暂停正在运行的程序,转而先去处理这些异常或特殊请求,处理结束之后再返回程序的断点处继续执行。这种处理方式就被称为 “中断”,计算机的这种功能就称为 中断处理;实现这种功能所需的软硬件技术统称为 中断技术

        很显然,对于一些突发情况和实时传来的外部信号,相比时刻查询的方式,使用中断技术可以大大地提高计算机的整体效率。

        能够引发中断的因素有很多,比如电源掉电、打印机请求、运算溢出、缺页等等。通常将能够引起中断的各种因素称为 中断源。根据各种中断源的类型,可以对中断进行不同的分类。

1.中断和异常

        从中断的来源看,直观上可以分成两类:一类是由外部设备向 CPU 发出的请求(比如打印),或者突发的外部事件或环境对计算机造成了影响(比如电源掉电),在 CPU 外部产生;另一类是 CPU 在执行指令时遇到的异常情况,在 CPU 内部产生。

        通常将 CPU 内部产生的中断称为 异常(Exception),也称作 内中断。异常一般是 CPU 的控制单元(CU)在执行指令时遇到了意外情况、因而必须暂停处理;由于一定会在一条指令执行结束后才发出中断,因此也被叫做 同步中断

        与之对应,来自于 CPU 外部其它硬件设备的中断,就被称为 外中断,或者直接叫做(狭义的) 中断(Interrupt)。它们通常是外部设备依照 CPU 时钟随机产生的,因此也被叫做 异步中断

        事实上,对于中断(狭义)和异常,CPU 的处理流程都是先中止当前正在执行的程序、转而去执行相应的中断处理程序(称为 “中断服务程序”),完成中断响应之后,再回到断点处继续执行。因此,一般可以把它们统称为(广义的)中断

2.中断和异常的分类

        中断请求并不一定都非常急迫、必须立刻响应。CPU 可以对中断进行判别、选择,屏蔽某些中断源的请求;根据是否可以被屏蔽,中断(狭义)又可以分成两类:

  • 可屏蔽中断:可屏蔽中断有 “屏蔽” 和 “非屏蔽” 两种状态;处在屏蔽状态的中断,CPU 将不予以响应。I/O 设备的中断请求都属于可屏蔽中断。

  • 不可屏蔽中断:一些急迫事件 CPU 必须予以响应,发出的中断不能屏蔽。例如电源掉电就属于不可屏蔽中断。

 

        而对于异常,由于它跟指令的执行有关,因此根据中断处理完成后、接下来指令执行的情况,可以进一步进行分类:  

  • 故障(Fault):通常可以纠正,一旦纠正则程序可以重新执行原先产生中断的那条指令;也称为 “程序性事故”。例如运算溢出、缺页异常。

  • 陷阱(Trap):这种异常是人为设置的,表示自愿停止现行程序、转入中断处理,因此也叫 “自愿中断”、“自陷”。一般计算机中都会设置陷阱指令,执行到它就会转至别处做特殊处理,完成之后就返回到陷阱指令的下一条指令继续执行。例如调试程序时的断点设置、执行系统调用等。

  • 异常中止(Abort):如果发生了严重的错误,程序无法继续执行,那么就只能把控制权交给异常中止处理程序;而现行程序只能强制停止运行。例如硬件故障、系统表中无效的值等。

3.中断系统

        中断改变了计算机执行程序的顺序,因此需要 CPU 进行特别的处理。为了实现中断处理的功能,CPU 中一般会设置专门的处理机构,这就是 中断系统

        中断系统主要需要解决以下一些问题:

  • 中断源怎样向 CPU 发出中断请求;

  • 当有多个中断源同时发出请求时,怎样确定响应顺序;

  • CPU 怎样响应中断请求;

  • CPU 响应中断之后,怎样保护现场;

  • CPU 响应中断后,怎样暂停原程序的执行、找到中断服务程序的入口地址;

  • 中断处理结束后,CPU 如何恢复现场、返回原程序的断点处;

  • 如果中断处理时又有新的中断请求,应该怎样处理。

    接下来我们就通过学习中断系统,来解决这些问题。

二、中断的检测

        在 CPU 的指令周期中,最后一个阶段就是 中断周期。在一条指令执行阶段的最后时刻,CPU 会发出 中断查询信号,检测是否有中断请求。如果有,则进入中断周期进行中断处理。

1.中断请求标记

        不同的中断源都可以向 CPU 发出中断请求,为了区分中断源,中断系统中会专门设置一个 中断请求标记触发器,简称 中断请求触发器,用 INTR 表示。当某个中断源的触发器 INTRi 为 “1” 时,就表示该中断源发来了请求。

        这些触发器可以分散在各个中断源的接口电路中,也可以集成在 CPU 中,组成一个 中断请求标记寄存器

        寄存器里的每一位就对应着一个中断源的请求触发器。任意一个触发器为 1,就表示对应的中断源发出了中断请求。  

2.中断判优

        在中断系统中,同一时刻只能响应一个中断源的请求。如果有多个中断源同时发出了请求,那就需要中断系统按照设定好的优先顺序来依次响应;这被称为 中断判优。中断源的优先级是依据重要性和急迫性而定的。

        中断判优就是要对一组中断请求按优先级进行 “排队”,可以用硬件和软件两种方式实现。

(1)硬件排队

        硬件排队是直接用硬件电路实现中断请求的排队,具体方法很多,主要有两种:一种是在 CPU 内统一设置一个 “排队器”;另一种是在中断源设备的接口电路中分别设置排队器。

        在 CPU 内设置排队器:各中断源的请求触发器按优先级依次排列,高优先级的请求信号通过接入一个多输入的与非门,来 “封住” 低优先级的中断请求。

 

        在接口电路中设置排队器:每个接口电路中都设置一个反相器和一个与非门,与非门的输出接入下一级,就可以实现对更低优先级中断请求的封锁。它们彼此之间直接连成链状,因此也称为 “链式排队器”。  

(2)软件排队

        软件排队,就是直接通过编写查询程序实现中断请求的排队。

        程序按照中断源的优先级,从高到低依次判断是否有中断请求,这样就保证了中断响应的顺序。  

三、中断的响应

1.中断响应的条件

        由于在处理中断时,CPU 不应受到新中断请求的打扰,因此需要有 “开关中断” 的功能。在中断系统中,这是由 允许中断触发器 EINT 和专门的指令来实现的。

        EINT 可以被 开中断指令 置 “1”,这时表示 CPU 打开了中断功能,允许响应中断源的请求;EINT 也可以被 关中断指令 置 “0”,这意味着 CPU 关闭中断功能,禁止响应中断。

        在 x86 架构的 CPU 中,EINT 就对应着 标志寄存器(程序状态字)efl 中的一位,用 IF 表示。

        因此可以总结,当 EINT = 1 且有中断请求(INTRi = 1)时,CPU 就可以响应中断。  

2.中断响应的时间

        很多情况下中断请求的产生是随机的,为了不影响 CPU 的正常工作,需要周期性地在统一的时刻由 CPU 发出中断查询信号,判断当前是否有中断请求。

        因此 CPU 响应中断的时间,一定是在每条指令执行阶段的结束时刻;相当于在指令周期最后又加入了一个阶段,这就是 中断周期。执行周期结束后,如果有中断请求,则 CPU 进入中断周期;如果没有则直接进入下一条指令的取指周期。

3.中断响应的过程

        CPU 响应中断之后,就会进入中断周期。在中断周期 CPU 会执行一系列的操作,这些操作都是由一条 中断隐指令 完成的。所谓的隐指令,指的是指令系统中本身没有这条指令,它是由硬件自动完成的。具体操作如下:

(1)保护程序断点

        将当前 PC 的内容(程序断点位置)保存到主存中。可以存入特定的某个地址(比如 0 地址),也可以存入堆栈中。

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

        在中断周期内,可以用两种方法寻找中断服务程序的入口地址:硬件向量法和软件查询法,分别对应着硬件和软件实现。

(3)关中断

        为了在响应中断后,不受到新的中断请求的干扰,在中断周期需要自动做 “关中断” 的操作,禁止 CPU 再次响应中断请求。关中断的具体操作就是将允许中断触发器 EINT 置 “0”,一般直接由硬件电路实现。

        对应的微操作如下:

四、中断服务程序

 1.中断服务程序的入口地址

        不同的中断请求,需要执行不同的中断服务程序。寻找中断服务程序的入口地址,通常可以采用两种方法:硬件向量法软件查询法

(1)硬件向量法

        所谓硬件向量法,就是使用硬件直接产生一个 向量地址,再用这个向量地址找到中断服务程序的入口地址。向量地址由中断向量地址形成部件产生。

        中断向量地址形成部件的输入,是来自排队器的输出 INTPi ,它的输出则是一个二进制的 中断向量。一般可以让一个中断源对应一个向量地址,因此这个部件本质上就是一个编码器。

        通过向量地址寻找中断服务程序入口地址可以采用两种方法。

 

  • 在向量地址对应内存单元放一条 无条件转移指令。这样 CPU 响应中断时,只要将向量地址交给 PC,然后执行这条指令,就可以跳转到中断服务程序入口地址了。

  • 设置 向量地址表。向量地址表存放在主存中,向量地址就是对应存储单元的地址,而存放的内容就是中断服务程序的入口地址。

        硬件向量法寻找入口地址速度快,现代计算机中普遍使用这种方法。

(2)软件查询法

        用软件寻找中断服务程序入口地址的方法,就叫做软件查询法。各个中断源对应的入口地址,是由程序员(或系统)预先定好、写入程序的;可以结合软件排队的中断判优,确定要响应某个中断请求时,直接跟上一条转移指令、跳转至定义好的入口地址就可以了。

        软件查询法不涉及硬件,更加容易维护和扩展,但查询的时间更长。

2.中断服务程序的流程

        不同的中断请求对应的中断服务程序不同,不过它们的处理流程是类似的,一般包括 保护现场中断服务恢复现场中断返回 4 个部分。

(1)保护现场

        保护现场通常包含两层含义:一是保存程序的断点,这由中断隐指令完成;二是保存通用寄存器和状态寄存器的内容,这需要中断服务程序完成。

        具体操作就是在中断服务程序的起始部分,安排几条存数(Store)指令,将寄存器的内容全部保存到主存中;或者直接用入栈(Push)指令将寄存器内容推入栈中。

(2)中断服务

        中断服务是中断服务程序的主体部分,针对不同的中断源,需要做出对应的操作内容。

(3)恢复现场

        中断服务程序的结尾部分,还需要恢复现场。对应着之前的保护现场,这一步可以用取数(Load)指令或者出栈(Pop)指令,将保存在主存中的信息恢复到寄存器中。

(4)中断返回

        中断服务程序的最后一条指令,通常是一条 中断返回指令,从而返回到原程序的断点处继续执行。

        如果在 CPU 执行中断服务程序时,又来了一个新的中断请求,这时有两种处理方式:一种是直接不予响应,即 CPU 在响应中断的过程中保持 “关中断” 状态,直到中断服务程序执行结束、返回之前才开中断;另一种则是 CPU 立即响应新的中断请求,这需要在中断服务程序的开始阶段 “开中断”。  

五、中断屏蔽技术

1.多重中断

        如果 CPU 在响应某个中断请求的时候,另一个中断源又提出了一个新的中断请求;而 CPU 立即响应这个请求,暂停正在运行的中断服务程序、转而去运行新的中断服务程序,这就是 中断嵌套,也称为 多重中断。 与之对应,如果 CPU 在响应中断时不去响应新的中断请求,则称为 单重中断

        实现多重中断,需要满足两个基本条件:

  • 提前设置 “开中断” 指令

        由于进入中断周期后,中断隐指令会自动将 EINT 置为 0,因此默认会关中断、不再响应新的中断请求;这时如果希望处理多重中断,就必须在中断服务程序的开始阶段设置 “开中断” 指令来打开中断。

  • 优先级高的中断源有权中断优先级低的中断源

        只有优先级别更高的中断源,才能打断正在执行的中断服务程序、优先被响应。


        例如,有 A、B、C、D 四个不同的中断源,优先级为 A > B > C > D。在 CPU 执行程序时,在某个指令周期,同时查询到了 B、C 发来的中断请求;之后在执行中断服务程序的过程中,又先后查询到了 D、A 的请求。那么如果允许多重中断,中断处理的时间顺序如下:  


        中断请求如果同时到来(比如上例中的 B、C),我们可以进行中断判优、利用排队器决定它们的先后顺序。但对于多重循环,还需要在中断响应过程中继续判断优先级、决定是否可以打断当前的中断服务程序。这是通过 中断屏蔽技术 来实现的。

2.中断屏蔽触发器

       为 了实现对每个中断源的屏蔽,可以在中断请求触发器 INTR 之前增设一个 中断屏蔽触发器 MASK。当 MASK 为 “1” 时,表示该中断源被屏蔽,中断请求不被响应。

        屏蔽触发器同样既可以设置在接口电路中、也可以直接集成在 CPU 内。以 I/O 设备作为中断源为例,I/O 设备的接口电路中会有一个 完成触发器 D,它为 “1” 则表示设备已经处于就绪状态、要向 CPU 发出中断请求了。一般情况下,D 的输出可以直接接到中断请求触发器 INTR 的输入;现在则可以与 MASK 的输出经与非门之后、再交给 INTR。

        这样,当设备已经准备就绪(D = 1),且设备未被屏蔽(MASK = 0)时,来自 CPU 的中断查询信号就会将 INTR 置 “1”,表示该设备发出了中断请求信号。

        同样,排队器内也可以加上屏蔽条件,就组成了具有屏蔽功能的排队器。例如集成在 CPU 内的排队器如果加上屏蔽功能,只需要另外将屏蔽信号也接入与非门就可以了:

 

3.屏蔽字和屏蔽技术

        显然,对于每个中断源,中断请求触发器 INTR 和 中断屏蔽触发器 MASK 都是成对出现的。如果将所有屏蔽触发器组合在一起,也可以构成一个 屏蔽寄存器。屏蔽寄存器的内容就称为 屏蔽字

        屏蔽字可以在中断服务程序中进行设置,屏蔽字和中断源的优先级是一一对应的。以 16 个中断源 I1 ~ I16 的屏蔽字为例,每个屏蔽字都是 16 位:

        在不同中断源的中断服务程序中,可以设置适当的屏蔽字,就能对优先级不同的中断源进行屏蔽。

        例如,在 I~1~ 的服务程序中,将屏蔽字设为全 1,就表示它的优先级最高:在响应 I~1~ 中断请求的过程中,不会再去响应任何新的请求(包括 I~1~ 自己发来的);这相当于就是单重中断。而对于 I~3~ ,在服务程序中将屏蔽字前两位设为 0、后面为 1,表示 I~1~、I~2~ 优先级更高、不被屏蔽,而后面的中断源(包括自己)被屏蔽;于是开中断之后,I~1~、I~2~ 发来的新中断请求就可以打断当前 I~3~ 的中断服务程序,实现了多重中断。

4.改变处理优先级

        使用屏蔽技术还可以改变中断源的优先等级。中断源的优先级,包括两层含义:响应优先级处理优先级

  • 响应优先级:CPU 响应各中断源请求的先后次序,跟排队器有关,一般是硬件线路设定好的,不易改动;

  • 处理优先级:CPU 实际执行中断服务程序的先后次序,可以通过屏蔽技术进行改动。

        如果不采用屏蔽技术,那么处理的优先顺序就是按照响应优先级来的。例如,A、B、C、D 四个中断源,优先级别为 A > B > C > D,根据这一次序设计出排队器之后,当它们同时发来中断请求时,处理顺序就是响应顺序:

        如果采用了屏蔽技术,就可以在不改变响应顺序的前提下,改变 CPU 处理中断的顺序。假如我们希望将它们的处理次序改为 A → D → C → B,那么每个中断源的中断服务程序中应该重新设置屏蔽字:

        这样,同样还是 A、B、C、D 同时发出中断请求,这时的处理顺序就会变为:

        显然,采用屏蔽技术改变处理优先级,需要在中断服务程序中重置屏蔽字。这样,中断服务程序的处理流程就会变为:  

        跟之前相比,增加了 置屏蔽字恢复屏蔽字 两步操作。而为了防止在恢复阶段又出现新的中断,需要先关中断、等到恢复现场和屏蔽字之后再次开中断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1689875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因,了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提,如果你通过快捷键“Ctrl D”删除了数据,那你可以从回收站中还原它们。如果你永久删除…

改进rust代码的35种具体方法-类型(十八)-不要惊慌

上一篇文章 它看起来非常复杂,这就是为什么它贴合的塑料盖上用大号友好字母印上“不要恐慌”的原因之一。——道格拉斯亚当斯 此项目的标题将更准确地描述为更喜欢返回Result而不是使用panic!(但不要惊慌更吸引人)。 Rust的panic机制主要是为…

轧神仙,沾福气!李良济中医药惠民生,为苏城市民送健康!

5月19-22日,苏州人迎来了自己的狂欢节——第六届江南文化艺术国际旅游节“轧神仙”系列活动,石路商圈人头涌动,喧闹非凡。 相传农历的四月十四日是“八仙”之一吕洞宾的诞辰,吕洞宾此日化为乞丐、小贩,混迹苏州阊门福济…

Gradle常见问题及总结

使用android studio开发项目,难免遇到gradle相关的错误,在此总结。 gradle插件与gradle home版本关系错误 参考更新 Gradle Gradle下载太慢 Index of /gradle/ (tencent.com) 是国内下载地址,手动下载对应版本即可 缓存不刷新 问题描述 maven发布…

电影推荐|基于SSM+vue的电影推荐系统的设计与实现(源码+数据库+文档)

电影推荐系统 目录 基于SSM+vue的电影推荐系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍&#…

OneAPI接入本地大模型+FastGPT调用本地大模型

将Ollama下载的本地大模型配置到OneAPI中,并通过FastGPT调用本地大模型完成对话。 OneAPI配置 新建令牌 新建渠道 FastGPT配置 配置docker-compose 配置令牌和OneAPI部署地址 配置config.json 配置调用的渠道名称和大模型名称 {"systemEnv": {&qu…

W801 实现获取天气情况

看了小安派(AiPi-Eyes 天气站)的源码,感觉用W801也可以实现。 一、部分源码 main.c #include "wm_include.h" #include "Lcd_Driver.h"void UserMain(void) {printf("\n user task \n");Lcd_Init();Lcd_Clea…

jenkins插件之xunit

分析测试工具执行的结果,并图形化,比如phpunit,phpstan,可分析junit格式的结果 安装jenkins插件 搜索xunit并安装 项目配置 配置 - Build Steps 您的项目 - 配置 - Build Steps, 新增 Run with timeout 超时时间根据实际情况配置 Build…

架构二。。

1、CAP 只能3选2 1)一致性(Consistency) 客户每次读都是返回最新的写操作结果 2)可用性(Availability) 非故障节点在合理的时间内返回合理的响应 3)分区容忍性(Partition Tolerance…

零基础代码随想录【Day42】|| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

目录 DAY42 1049.最后一块石头的重量II 解题思路&代码 494.目标和 解题思路&代码 474.一和零 解题思路&代码 DAY42 1049.最后一块石头的重量II 力扣题目链接(opens new window) 题目难度:中等 有一堆石头,每块石头的重量都是正整…

第七步 实现打印函数

文章目录 前言一、如何设计我们的打印函数?二、实践检验! 查看系列文章点这里: 操作系统真象还原 前言 现在接力棒意见交到内核手中啦,只不过我们的内核现在可谓是一穷二白啥都没有,为了让我们设计的内核能被看见被使用…

fyne网格包裹布局

fyne网格包裹布局 与之前的网格布局一样,网格环绕布局以网格模式创建元素排列。但是,此网格没有固定数量的列,而是为每个单元格使用固定大小,然后将内容流到显示项目所需的行数。 layout.NewGridWrapLayout(size) 您可以使用其中…

Mac维护神器CleanMyMac X成为你的苹果电脑得力助手

在数字化时代,Mac电脑已成为众多用户的首选。然而,随着频繁的使用和数据量的日益增长,许多Mac用户面临着系统杂乱、存储空间不足以及隐私保护等问题。幸运的是,"CleanMyMac X"这款优化和清理工具应运而生,它…

「网络流浅谈」最大流的应用

更好的阅读体验 二分图匹配 考虑如何将二分图匹配问题,转化为流网络。设置 1 1 1 个汇点和源点,从源点向二分图一侧的每一个点连边,从另一侧向汇点连边,边权均为 1 1 1,二分图中的边也全部加入,权值设为…

【Linux取经路】基于信号量和环形队列的生产消费者模型

文章目录 一、POSIX 信号量二、POSIX 信号量的接口2.1 sem_init——初始化信号量2.2 sem_destroy——销毁信号量2.3 sem_wait——等待信号量2.4 sem_post——发布信号量 三、基于环形队列的生产消费者模型3.1 单生产单消费模型3.2 多生产多消费模型3.3 基于任务的多生产多消费模…

构建健壮的机器学习大数据平台:任务实现与数据治理的关键

随着数据驱动决策成为现代企业的核心,构建安全、可靠且可扩展的大数据平台变得至关重要。这样的平台不仅需要支持复杂的机器学习任务,还需要在数据质量、合规性和分发方面提供严格的控制。本文旨在探讨构建大型企业机器学习大数据平台时需要考虑的关键要…

项目如何有效做资源管理?易趋项目管理软件让资源管理可视化

在项目管理的过程中,有效的资源管理能够确保资源得到合理的分配和使用,避免资源的浪费和冗余,进而提高整体工作效率、确保项目的成功;同时降低组织的运营成本。 但在项目推进过程中,项目经理总会面临各种资源管理的难…

基于Tensorflow卷积神经网络人脸识别公寓人员进出管理系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着科技的快速发展和智能化水平的提高,公寓管理面临着越来越多的挑战。传统的公寓…

HTML静态网页成品作业(HTML+CSS)——我的家乡云南保山介绍网页(3个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…

轻松同步:将照片从三星手机传输到iPad的简便方法

概括 想要在新 iPad 上查看三星照片吗?但是,如果您不知道如何将照片从三星手机传输到 iPad,则无法在 iPad 上查看图片。为此,本文分享了 7 个有用的方法,以便您可以使用它们在不同操作系统之间轻松发送照片。现在&…