计组_异常和中断

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


程序正常执行过程中,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检测到中断请求后就进行中断响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StepByByte

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值