计组_异常和中断
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检测到中断请求后就进行中断响应