重学计算机组成原理(十二) - 异常和中断(下)

简介: 重学计算机组成原理(十二) - 异常和中断(下)

3 异常的分类

异常可以由硬件触发,也可以由软件触发

3.1 中断(Interrupt)

顾名思义,就是程序在执行到一半的时候,被打断了。这个打断执行的信号,来自于CPU外部的I/O设备。

你在键盘上按下一个按键,就会对应触发一个 相应的信号到达CPU里面。CPU里面某个开关的值发生了变化,也就触发了一个中断类型的异常。

3.2 陷阱(Trap)

程序员“故意“主动触发的异常。就好像你在程序里面打了一个断点,这个断点就是设下的一个"陷阱"。

当程序的指令执行到这个位置的时候,就掉到了这个陷阱当中。然后,对应的异常处理程序就会来处理这个"陷阱"当中的猎物。


最常见的一类陷阱,应用程序调用系统调用的时候,也就是从用户态切换到内核态的时候。


可以用Linux下的time指令,去查看一个程序运行实际花费的时间,里面有在用户态花费的时间(user time),也有在内核态发生的时间 (system time)。


应用程序通过系统调用去读取文件、创建进程,其实也是通过触发一次陷阱来进行的。这是因为用户态的应用程序没有权限来做这些事情,需要把对应的流程转交给有权限的异常处理程序来进行。

3.3 故障(Fault)

陷阱是我们开发程序的时候刻意触发的异常,而故障通常不是。

比如,我们在程序执行的过程中,进行加法计算发生了溢出,其实就是故障类型的异常。

这个异常不是我们在开发的时候计划内的,也一样需要有对应的异常处理程序去处理。


故障和陷阱、中断的重要区别

故障在异常程序处理完成之后,仍然回来处理当前的指 令,而不是去执行程序中的下一条指令。

因为当前的指令因为故障的原因并没有成功执行完成。

3.4 中止(Abort)


与其说这是一种异常类型,不如说这是故障的一种特殊情况。 当CPU遇到了故障,但是恢复不过来的时候,程序就不得不中止了。


image.png

3.5小结

中断异常的信号来自系统外部,而不是在程序自己执行的过程中,所以我们称之为“异步”类型的异常。


而陷阱、故障以及中止类型的异常,是在程序执行的过程中发生的,所 以我们称之为“同步“类型的异常。


在处理异常的过程当中,无论是异步的中断,还是同步的陷阱和故障,我们都是采用同一套处理流程,也就是上面所说的,“保存现场、异常代码查询、异常处理程序调用“。

而中止类型的异常,其实是在故障类型异常的一种特殊情况。当故障发生,但是我们发现没有异常处理程序能够处理这种异常的情况下,程序就不得不进入中止状态,也就是最终会退出当前的程序执行。

4 异常的处理:上下文切换

在实际的异常处理程序执行之前,CPU需要去做一次“保存现场”的操作。这个保存现场的操作, 和函数调用的过程非常相似。


切换到异常处理程序,就好像是去调用一个异常处理函数。指令的控制权被切换到了另外一个"函数",所以我们自然要把当前正在执行的指令去压栈。

这样才能在异常处理程序执行完后,重新回到当前的指令继续往下执行。


不过,切换到异常处理程序,比起函数调用,还是要更复杂一些。原因有下面几点

  • 异常情况往往发生在程序正常执行的预期之外,比如中断、故障发生的时候。所以,除了本来程序压栈要做的事情之外,还需要把CPU内当前运行程序用到的所有寄存器, 都放到栈里面。最典型的就是条件码寄存器里面的内容
  • 像陷阱这样的异常,涉及程序指令在用户态和内核态之间的切换。对应压栈的时候,对应的数据是压到内核栈里,而不是程序栈里。
  • 像故障这样的异常,在异常处理程序执行完成之后。从栈里返回出来,继续执行的不是顺序的下一条指令,而是故障发生的当前指令。因为当前指令因为故障没有正常执行成功,必须重新去执行一次。


所以,对于异常这样的处理流程,不像是顺序执行的指令间的函数调用关系。而是更像两个不同的独立进程之间在CPU层面的切换,所以这个过程我们称之为上下文切换(Context Switch)。

5 总结

计算机里的“异常”处理流程。这里的异常可以分成中断、陷阱、故障、中止 这样四种情况。这四种异常,分别对应着I/O设备的输入、程序主动触发的状态切换、异常情况下的程序出错以及出错之后无可挽回的退出程序。

当CPU遭遇了异常的时候,计算机就需要有相应的应对措施。CPU会通过“查表法”来解决这个问 题。在硬件层面和操作系统层面,各自定义了所有CPU可能会遇到的异常代码,并且通过这个异 常代码,在异常表里面查询相应的异常处理程序。在捕捉异常的时候,我们的硬件CPU在进行相 应的操作,而在处理异常层面,则是由作为软件的异常处理程序进行相应的操作。

而在实际处理异常之前,计算机需要先去做一个“保留现场”的操作。有了这个操作,我们才能在异常处理完成之后,重新回到之前执行的指令序列里面来。这个保留现场的操作,和我们之前讲 解指令的函数调用很像。但是,因为“异常”和函数调用有一个很大的不同,那就是它的发生时间。函数调用的压栈操作我们在写程序的时候完全能够知道,而“异常”发生的时间却很不确定。 所以,“异常”发生的时候,我们称之为发生了一次“上下文切换”(Context Switch)。这个时 候,除了普通需要压栈的数据外,计算机还需要把所有寄存器信息都存储到栈里面去。


推荐阅读

关于异常和中断,《深入理解计算机系统》的第8章“异常控制流”部分,有非常深入和充分的讲解,推荐你认真阅读一下。

再续中断分类

软中断和硬中断

硬中断

由硬件发出或产生的中断称为硬中断,按硬中断事件的来源和实现手段可将中断划分为外中断和内中断:

  • 外中断
    又称为中断或异步中断,是指来自处理器以外的中断信号,包括时钟中断、键盘中断、外部设备中断等。外中断又分为可屏蔽中断和不可屏蔽中断,各个中断具有不同的优先级,表示事件的紧急程度,在处理高一级中断时,往往会部分或全部屏蔽低等级中断。


内中断

又称为异常或同步中断(产生时必须考虑与处理器时钟同步),是指 来自处理器内部的中断信号,通常是由于程序执行过程中,发现与当前指令关联的、不正常的或错误的事件。内中断可以细分为:

  • 访管中断,由执行系统调用而引起的
  • 硬件故障中断,如电源失效、总线超时等
  • 程序性中断,如非法操作、地址越界、除数为0和浮点溢出等。

软中断

是一条CPU指令,用以自陷一个中断。由于 软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。


处理器通常含有一个内部中断屏蔽位,并允许通过软件来设定。一旦被设定,所有外部中断都将被系统忽略。这个屏蔽位的访问速度显然快于中断控制器上的中断屏蔽寄存器,因此可提供更快速地中断屏蔽控制。

中断风暴(interrupt storm)

中断尽管可以提高计算机处理性能,但 过于密集的中断请求/响应反而会影响系统性能。这类情形被称作

参考

https://www.cnblogs.com/luoahong/p/11425628.html#top

深入理解计算机系统(第三版)


目录
相关文章
|
7月前
计算机组成原理(6)-----指令执行过程
计算机组成原理(6)-----指令执行过程
299 0
|
7月前
|
块存储 芯片 内存技术
计算机组成原理(4)-----Cache的原理及相关知识点(1)
计算机组成原理(4)-----Cache的原理及相关知识点
340 2
|
7月前
|
缓存 算法 内存技术
计算机组成原理(4)-----Cache的原理及相关知识点(2)
计算机组成原理(4)-----Cache的原理及相关知识点
127 1
|
JavaScript 前端开发 C语言
聊一聊|计算机函数
聊一聊|计算机函数
140 0
聊一聊|计算机函数
|
存储 芯片 数据格式
[计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)
[计算机组成原理(唐朔飞 第2版)]第三章 系统总线(学习复习笔记)
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
75 1
#计算机组成原理# (学第四章先看!!)第四章 存储器简述
|
Linux 调度
Linux驱动开发——中断编程之顶半部与底半部机制(1)
Linux驱动开发——中断编程之顶半部与底半部机制(1)
215 0
Linux驱动开发——中断编程之顶半部与底半部机制(1)
|
Linux C语言
重学计算机组成原理(九)- 动态链接
把对应的不同文件内的代码段,合并到一起,成为最后的可执行文件 链接的方式,让我们在写代码的时候做到了“复用”。 同样的功能代码只要写一次,然后提供给很多不同的程序进行链接就行了。 “链接”其实有点儿像我们日常生活中的标准化、模块化生产。
1472 0
计算机组成原理 I/O接口与中断技术
计算机组成原理 I/O接口与中断技术
73 0
计算机组成原理 I/O接口与中断技术
|
运维 Linux 调度
一文讲透计算机的“中断”
中断,英文名为Interrupt,计算机的世界里处处都有中断,任何工作都离不开中断,可以说整个计算机系统就是由中断来驱动的。那么什么是中断?简单来说就是CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。
499 0
一文讲透计算机的“中断”