dede免费网站模板下载,郧阳网站建设,购买一个网站空间如何可以多个域名使用吗,网建教程参考《计算机组成》#xff08;北京大学 MOOC#xff09;
1 异常与中断的来源#xff08;为什么需要中断#xff09;
首先#xff0c;说明一下异常和中断这两个概念。
它们两个唯一的区别#xff0c;就是#xff0c;没有什么区别。只是不同的地方不同的时间不同的人的…参考《计算机组成》北京大学 MOOC
1 异常与中断的来源为什么需要中断
首先说明一下异常和中断这两个概念。
它们两个唯一的区别就是没有什么区别。只是不同的地方不同的时间不同的人的叫法不一样所以不用太在意区别了以后我们统称中断。
1.1 什么时候发生中断
一句话CPU正在干活的时候有事情打扰它不让他继续正常工作了需要去处理其他事情。
那么是什么事情呢这个事情分成两类
内部的事情外部的事情
1.1.1 内部的事情
简而言之就是执行指令的时候出现状况了。
出现什么状况了举例说明
执行加法之后结果超出了最大范围发生了溢出也就是overflow中断 int4执行除法的时候被除数是0出现了除法零中断int 0 关于这一点在80386手册中是提及过的。
这些中断如何被判断出来的
硬件判断的
我们知到在CPU中有ALUALU的输出结果是有结果相关信号的对于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中给的例子就是在当前页面执行完加法发现放不下因此翻到第一页去执行程序执行完之后再翻回来继续执行。