当前位置: 首页 > news >正文

计组_异常和中断

2024.06.24:计算机组成原理异常和中断学习笔记

第24节 异常和中断

  • 4.1 内部异常(不可屏蔽中断)
    • 4.1.1 终止
    • 4.1.2 故障
    • 4.1.3 自陷trap
  • 4.2 外部中断
  • 4.3 内部异常的处理过程
    • 4.3.1 第一步:保护断点和程序状态
    • 4.3.2 第二步:异常事件并转异常处理
      • (1)软件识别方式


程序正常执行过程中,CPU会遇到一些特殊情况而无法继续执行当前程序,可分为两种情况:(内部异常)和(外部中断


4.1 内部异常(不可屏蔽中断)

指由处理器内部异常引起的意外事件

4.1.1 终止

由硬连线路出现异常引起的,如电源掉电,存储器线路错等硬件问题引起的


4.1.2 故障

也称失效,是在引起故障的(指令启动后、执行结束前)被检测到的一类异常事件

  • 保护错:计算机系统里面会有一些受保护的存储区域,假如你没有这个权限,但是你想去访问一个受保护的区域,它就会引发存储保护错。总的来说,就是你执行了这样的一个非法操作去访问了一个受保护的、你没有权限进入的区域
  • 整除0:计算的时候让0当作分母
  • 非法操作码

以上故障,因为无法通过异常处理程序恢复故障,因此不能回到原断点继续执行,必须终止进程的执行

对于浮点数除法“除数位0”,有不同处理方式,可将指令执行结果用特殊值(无穷大或者NaN)来表示后续回原断点执行,也可以终止进程的执行

  • 溢出
  • 断点
  • 单步跟踪
  • 访问超时
  • 缺页、段不存在:这类异常处理后,已将需要的段或页面从磁盘调入主存,所以可以继续回到发生故障的指令重新执行。断点记录的就是发生缺页或者缺段的这个故障的指令的地址或者PSW

以上异常是和指令执行的这个操作是息息相关的


4.1.3 自陷trap

也称陷阱或陷入,与故障等其他意外发生的异常事件不同,是预先安排的(异常事件),就像预先设定的“陷阱”一样,首先通过某种方式将CPU设定为处于某个特定状态,程序执行过程中,一旦某条执行的执行发生了相应状态所满足的条件,则CPU调出特定的程序进行相应处理。

还有系统调用指令、条件自陷指令等都属于陷阱指令,执行到这些指令时,无条件或有条件地调出操作系统内核程序进行执行


4.2 外部中断

外部中断是一个完全的意外事件,和当前执行的这个指令是毫无关系的

在程序正常执行的过程中,如果说外设(也就是总线所学到的IO设备)完成任务或发生某些特殊事件(打印机缺纸、键盘缓冲满等),会向CPU发中断请求、要求CPU对这些情况进行处理

通常每条指令执行完成后,CPU都会主动查询有没有中断请求,有的话,将(下一条指令地址)作为断点保存,然后转到相应的中断服务程序执行,结束后回到断点继续执行

  • 通过INTR信号线发出的外中断是可屏蔽中断
  • 通过NMI信号发出的是不可屏蔽中断

不可屏蔽中断的处理优先级最高,任何时候发生不可屏蔽中断,都要中止现行程序的执行,转到不可屏蔽中断处理程序执行

每个中断都有一个类型号,每个中断类型号都对应一个中断服务程序,其入口地址放在一个专门的中断向量表中


4.3 内部异常的处理过程

4.3.1 第一步:保护断点和程序状态

对于不同的异常事件,它返回的地址断点也不同。

对于大部分的异常事件,它的这个断点都是当前发生故障这个指令的地址,因为你现在是在执行这条指令的时候发生了一个异常,那我就会马上去转移到这个异常处理程序去,处理完之后还需要回来重新执行者条指令

  • 故障的断点是发生故障的当前指令的地址
  • 自陷的断点是自陷指令后面一条指令的地址

在发生这种异常事件的时候,我们需要去保存这个断点以及当前PSW这个寄存器里面的值,我们会把它送到栈或者说一个特定的寄存器中

栈就是内存里面的一个特殊区域,它是符合栈的特性的

断点的值由(异常类型)和(发生异常时PC的值)决定
为了能在异常处理后正确返回到原被中断程序继续执行,数据通路必须能正确计算断点值。
假定计算出的断点值存放在PC中,则保护断点时,只要将PC送到栈或特定的寄存器中即可


因为异常处理后可能还要回到被中断的程序继续执行,被中断时原程序的状态(如产生的各种标志信息、允许自陷标志等)都必须保存起来

通常每个正在运行程序的状态信息被放在程序状态字寄存器(PSWR)中,存放在PSWR中的信息称为程序状态字PSW

与返回地址(断点)一样,PSW也要被保存到栈或特定寄存器中,在异常返回时,将保存的PSW恢复到PSWR中


4.3.2 第二步:异常事件并转异常处理

必须知道发生了什么异常才能调出对应的异常处理程序,一般内部异常和外部中断源的识别方式不同,大多处理器会将二者分开处理

  • 内部异常时间的识别大多采用软件识别方式
  • 外部中断源可以采用软件或者硬件识别方式

(1)软件识别方式

CPU内部会有一个异常状态寄存器,用于记录异常原因

操作系统使用一个统一的异常查询程序,该程序按照一定优先级顺序查询异常状态寄存器,先查询到的异常先被处理

内部异常事件也可以不通过专门的查询程序来识别,而在发现异常时直接得到异常错误代码,根据不同的错误代码,转到相应的异常处理程序即可


如果在执行异常处理程序时又发生了新的异常/可屏蔽中断怎么办?

为了处理新的异常/可屏蔽中断,会把原来进程的现场、返回的断点和程序状态等破坏掉,因此,应有一种机制禁止在响应并处理异常时再响应新的异常/可屏蔽中断。
在这里插入图片描述

通常通过设置中断/异常状态来实现

  • 1则为开中断(允许中断)
  • 0则为关中断
    一般由操作系统通过管态指令来设置该位的状态

在这里插入图片描述
CPU只有再检测到中断请求信号后,才会进入中断响应周期

进入中断响应周期时,CPU一定处于中断允许(开中断)状态

CPU在执行一条指令时检测异常事件

CPU在执行完一条指令时检测中断请求信号

开中断时CPU检测到中断请求后就进行中断响应


http://www.mrgr.cn/news/49640.html

相关文章:

  • React中的useState和useEffect解析
  • QT QML 练习1
  • nginx使用手册<一>
  • Oracle漏洞修复 19.3 补丁包 升级为19.22
  • 噪声分布 双峰,模拟函数 或者模拟方法 python人工智能 深度神经网络
  • 大数据开发工程师的岗位技能要求及自我介绍参考(持续更新)
  • RTOS实时系统-信号量如何确保一次只有一个任务可以访问某个资源
  • 目标检测系统【环境详细配置过程】(CPU版本)
  • 架构师备考-背诵精华(架构开发方法)
  • 城域网——IP城域网、城域以太网、光城域网
  • 谈谈软件开发可行性研究的主要内容
  • Unity DOTS中的Archetype与Chunk
  • 【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略
  • 关于WPF(Windows Presentation Foundation)中Grid控件
  • [Linux网络编程]深入了解TCP通信API,看看底层做了啥(看了这篇文章,你也算是读了Linux源码的高手!)
  • 【开源物联网平台】Fastbee系统稳定性和压测报告
  • 在wsl2下将Ubuntu从一个盘移动到其他盘
  • 微服务之间是如何独立通讯的?
  • spring 注解
  • manjaro kde 24 应该如何设置才能上网(2024-10-13亲测)