当前位置:网站首页>x86异常处理与中断机制(1)概述中断的来源和处理方式
x86异常处理与中断机制(1)概述中断的来源和处理方式
2022-08-09 11:03:00 【XV_】
参考《计算机组成》(北京大学 MOOC)
1 异常与中断的来源(为什么需要中断)
首先,说明一下异常和中断这两个概念。
它们两个唯一的区别,就是,没有什么区别。只是不同的地方不同的时间不同的人的叫法不一样,所以,不用太在意区别了,以后我们统称中断。
1.1 什么时候发生中断
一句话!CPU正在干活的时候,有事情打扰它,不让他继续正常工作了,需要去处理其他事情。
那么是什么事情呢?这个事情分成两类
- 内部的事情
- 外部的事情
1.1.1 内部的事情
简而言之,就是执行指令的时候,出现状况了。
出现什么状况了?举例说明
- 执行加法之后,结果超出了最大范围,发生了溢出(也就是overflow中断 int4)
- 执行除法的时候,被除数是0,出现了除法零中断(int 0)
关于这一点,在80386手册中是提及过的。
这些中断如何被判断出来的?
硬件判断的!
我们知到,在CPU中有ALU,ALU的输出结果是有结果相关信号的,对于x86体系,会有各种各样的标志位,标志位的结果,是硬件直接给出的,例如下图的ALU的输出结果(ZF SF CF OF)
这些输出的信号,会作用到CPU的其他部件,从而能够让CPU暂停当前工作转而处理异常事件,至于具体发生了什么,我们后面会提及。
关于内部事件的命名
别看只是一个内部事件,关于它的命名有很多,我们来解释一下,就能够清晰明了了。
- 内部中断:这个不用解释,内部发生了事情,引起CPU中断当前的事情,转而处理紧急事件,就是内部中断。
- 软件中断:我们刚才提及过,内部发生的事情,是指令的执行结果导致硬件产生了信号,触发中断,而软件的本质就是指令序列,因此是软件中断。
- 异常:正在执行的指令,执行完之后发现不正常,后面的指令不能继续正常执行,就是异常。
1.1.2 外部的事情
这个中断是CPU外部向CPU发出的中断信号,导致CPU不得不停下手头的工作。例如8259A芯片。
这里有一篇8259A芯片 详解。
外部中断是外部硬件发出的,所以也叫硬件中断,它是被外部信号直接打断,也被称为中断。
最后,附上这个图,作为上面内容的小结。
1.1.3 内部中断和外部中断的区别
用一个比喻来解决:
- 内部中断,就好比你在工作位工作,然后不小心把水碰撒了,你不得不停下工作,先把洒出来的水擦干净,再继续工作。
- 外部中断:你在工作,然后你的老板通知你马上开会,你只能先去开会,开完会再继续工作。
1.1.4 未解决的细节问题
我们知到MIPS架构下,中断是在执行完每条指令后判断是不是发生中断,那么,对于内部中断和外部中断(x86下),具体细节又是什么呢?中断什么时候判断什么时候执行?
下图是MIPS的:
x86也一样的,因为指令执行的切换,需要EIP的改变,EIP的改变就需要到达指定时钟周期,因此来说,执行下一条指令or中断服务程序第一条指令的区别就是,EIP更新部件选择更新的值不同而已,本质上都是更新EIP的值。
1.2 发生中断之后干什么
好,现在CPU被某个事件打断了,然后,CPU不得不处理这个事情,那么它接下来会干什么呢?
假设现在进行了add
指令,加法得到的结果溢出了,运算结果存储不下,怎么办?
- 运算发生溢出,硬件电路检测到了溢出,那么应该如何处理呢?如果用硬件处理,这将会比较麻烦,并且,如果以后想修改也很难,因为硬件固定下来了改变不了(当然,硬件会很快,可以实现硬件加速器)。
- 使用软件方式处理溢出,也就是说,如果遇到溢出,就执行一段程序去处理它,也就是一段指令序列。
我们看一看第一个能够处理溢出异常的计算机,如果检测到发生溢出,就自动转向地址0,执行提前存好的程序,执行完之后,再回去继续执行原来的程序,这个地址0的程序是用来处理溢出的,这也就是中断服务程序。
这样就实现了计算机自动去处理溢出异常的情况,使得计算机不会因为异常而停机,同时,这个异常处理的程序,是软件,后续还可以进行修改。
因此这里就有重要的点
- 如何检测溢出
- 检测出溢出之后,如何进入地址0执行相应指令
- 执行完中断处理程序后,如何返回去执行之前的程序
对于问题1,设计一下ALU的硬件电路很容易解决,前面也提到过,不再细说,在《计算机系统基础》(袁春风)教材里提及过这个细节。
对于问题2,我们在检测到运算结果溢出之后,把它发送给EIP指令地址更新部件,一旦溢出,在下一个周期,就会EIP = 0
,就能够执行0号单元的程序了。(这么一说,这里是在当前指令执行的时候检测出异常,在下一条指令执行之前切换到了中断服务程序,因此和MIPS一样夹在中间)
对于问题3,我们需要在执行中断处理程序之前,保存好本来应该正常执行的指令的地址,以便于切换回去,这也就涉及到了保护现场和恢复现场的工作。
刚才谈及的是遇到内部中断,现在看看外部中断。
对于80386来说,外部中断通过8259A芯片给它发送的中断信号,接收到中断信号之后,在进行相关的处理,而8259A另一边则连接各种外设(鼠标,键盘…)来,这样CPU就能够处理外部中断请求了,具体操作还是
- 保存现场
- 执行中断处理程序
- 恢复现场
这里是现场,是概括性的,具体包含的内容后续阐述。
1.2.1 小结
对于整个中断的发生以及处理过程,怎么解释呢?我们看一下:
用一个比喻来解决:
- 内部中断,你在工作位工作(指令正常执行),然后不小心把水碰撒到了电脑上(遇到了内部中断),你不得先保存正在编辑的文件然后关机(保存现场),把洒出来的水擦干净(执行中断处理程序),再打开电脑,打开刚才保存的文件(恢复现场),之后继续工作(继续执行指令)。
- 外部中断:你在工作,然后你的老板通知你马上开会(外部中断),你只能先保存好手头工作,之后去开会,回来的时候打开之前保存的文件,继续工作。
2 整篇小结
这里仅仅以仅有一个溢出异常处理为例子,来梳理一下整个流程。
- 正在执行
add
指令,加完之后,发现结果太大,放不下,之后ALU产生了一个溢出信号 - 溢出信号发送给了EIP更新部件,等到下一个时钟周期到来的时候,EIP更新为0
- 开始执行中断处理程序
- 该程序先保存好当前CPU各寄存器的值,保存好正常执行的下一条指令的地址
- 然后执行溢出异常处理程序
- 之后恢复CPU寄存器的值,恢复EIP的值
- CPU继续执行
add
指令之后的指令
按照北大MOOC中给的例子就是,在当前页面执行完加法,发现放不下,因此翻到第一页去执行程序,执行完之后,再翻回来继续执行。
边栏推荐
- Beauty Values
- Invisible OOM in kubernetes
- SQL Server查询优化
- Qt读写.ini配置文件
- 【VIBE: Video Inference for Human Body Pose and Shape Estimation】论文阅读
- The complete grammar of CSDN's markdown editor
- 详细的np.matmul / np.dot / np.multiply / tf.matmul / tf.multiply / *
- 1008 Elevator (20分)
- 解决1.tensorflow运行使用CPU不使用GPU 2.tensorflow环境下的GPU版本号 3.tensorflow和cuda以及cudnn版本对应问题 4.查看cuda和cudnn版本
- 多商户商城系统功能拆解26讲-平台端分销设置
猜你喜欢
随机推荐
获取指定年度所有周的工具类
String类型的字符串对象转实体类和String类型的Array转List
备战金三银四:如何成功拿到阿里offer(经历+面试题+如何准备)
剖析STM32F103时钟系统
PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization论文阅读
leetcode-搜索旋转排序数组-33
MNIST机器学习入门
kubernetes中不可见的OOM
Multi-merchant mall system function disassembly 26 lectures - platform-side distribution settings
Oracle数据库体系结构
MATLAB代码实现三次样条插值
从位图到布隆过滤器
Solve 1. tensorflow runs using CPU but not GPU 2. GPU version number in tensorflow environment 3. Correspondence between tensorflow and cuda and cudnn versions 4. Check cuda and cudnn versions
关于anaconda中conda下载包或者pip下载包很慢的原因,加速下载包的方法(无视anaconda版本和环境)
日期工具类
margin出bug---margin失效
绝了,这套RESTful API接口设计总结
Beauty Values
faster-rcnn学习
Netscope:神经网络结构在线可视化工具