x86异常处理与中断机制(1)概述中断的来源和处理方式

参考《计算机组成》(北京大学 MOOC)

1 异常与中断的来源(为什么需要中断)

首先,说明一下异常中断这两个概念。

它们两个唯一的区别,就是,没有什么区别。只是不同的地方不同的时间不同的人的叫法不一样,所以,不用太在意区别了,以后我们统称中断

1.1 什么时候发生中断

一句话!CPU正在干活的时候,有事情打扰它,不让他继续正常工作了,需要去处理其他事情。
在这里插入图片描述

那么是什么事情呢?这个事情分成两类

  • 内部的事情
  • 外部的事情

1.1.1 内部的事情

简而言之,就是执行指令的时候,出现状况了

出现什么状况了?举例说明

  1. 执行加法之后,结果超出了最大范围,发生了溢出(也就是overflow中断 int4)
  2. 执行除法的时候,被除数是0,出现了除法零中断(int 0)

在这里插入图片描述

关于这一点,在80386手册中是提及过的。

这些中断如何被判断出来的?

硬件判断的!

我们知到,在CPU中有ALU,ALU的输出结果是有结果相关信号的,对于x86体系,会有各种各样的标志位,标志位的结果,是硬件直接给出的,例如下图的ALU的输出结果(ZF SF CF OF)

在这里插入图片描述
这些输出的信号,会作用到CPU的其他部件,从而能够让CPU暂停当前工作转而处理异常事件,至于具体发生了什么,我们后面会提及。

关于内部事件的命名

别看只是一个内部事件,关于它的命名有很多,我们来解释一下,就能够清晰明了了。

  1. 内部中断:这个不用解释,内部发生了事情,引起CPU中断当前的事情,转而处理紧急事件,就是内部中断。
  2. 软件中断:我们刚才提及过,内部发生的事情,是指令的执行结果导致硬件产生了信号,触发中断,而软件的本质就是指令序列,因此是软件中断。
  3. 异常:正在执行的指令,执行完之后发现不正常,后面的指令不能继续正常执行,就是异常

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指令,加法得到的结果溢出了,运算结果存储不下,怎么办?

  1. 运算发生溢出,硬件电路检测到了溢出,那么应该如何处理呢?如果用硬件处理,这将会比较麻烦,并且,如果以后想修改也很难,因为硬件固定下来了改变不了(当然,硬件会很快,可以实现硬件加速器)。
    在这里插入图片描述
  2. 使用软件方式处理溢出,也就是说,如果遇到溢出,就执行一段程序去处理它,也就是一段指令序列。
    在这里插入图片描述
    我们看一看第一个能够处理溢出异常的计算机,如果检测到发生溢出,就自动转向地址0,执行提前存好的程序,执行完之后,再回去继续执行原来的程序,这个地址0的程序是用来处理溢出的,这也就是中断服务程序

这样就实现了计算机自动去处理溢出异常的情况,使得计算机不会因为异常而停机,同时,这个异常处理的程序,是软件,后续还可以进行修改

因此这里就有重要的点

  1. 如何检测溢出
  2. 检测出溢出之后,如何进入地址0执行相应指令
  3. 执行完中断处理程序后,如何返回去执行之前的程序

对于问题1,设计一下ALU的硬件电路很容易解决,前面也提到过,不再细说,在《计算机系统基础》(袁春风)教材里提及过这个细节。

对于问题2,我们在检测到运算结果溢出之后,把它发送给EIP指令地址更新部件,一旦溢出,在下一个周期,就会EIP = 0,就能够执行0号单元的程序了。(这么一说,这里是在当前指令执行的时候检测出异常,在下一条指令执行之前切换到了中断服务程序,因此和MIPS一样夹在中间
在这里插入图片描述
对于问题3,我们需要在执行中断处理程序之前,保存好本来应该正常执行的指令的地址,以便于切换回去,这也就涉及到了保护现场和恢复现场的工作。


刚才谈及的是遇到内部中断,现在看看外部中断。
在这里插入图片描述
对于80386来说,外部中断通过8259A芯片给它发送的中断信号,接收到中断信号之后,在进行相关的处理,而8259A另一边则连接各种外设(鼠标,键盘…)来,这样CPU就能够处理外部中断请求了,具体操作还是

  • 保存现场
  • 执行中断处理程序
  • 恢复现场

这里是现场,是概括性的,具体包含的内容后续阐述。

1.2.1 小结

对于整个中断的发生以及处理过程,怎么解释呢?我们看一下:

用一个比喻来解决:

  • 内部中断,你在工作位工作(指令正常执行),然后不小心把水碰撒到了电脑上(遇到了内部中断),你不得先保存正在编辑的文件然后关机(保存现场),把洒出来的水擦干净(执行中断处理程序),再打开电脑,打开刚才保存的文件(恢复现场),之后继续工作(继续执行指令)。
  • 外部中断:你在工作,然后你的老板通知你马上开会(外部中断),你只能先保存好手头工作,之后去开会,回来的时候打开之前保存的文件,继续工作。

2 整篇小结

这里仅仅以仅有一个溢出异常处理为例子,来梳理一下整个流程。

  1. 正在执行add指令,加完之后,发现结果太大,放不下,之后ALU产生了一个溢出信号
  2. 溢出信号发送给了EIP更新部件,等到下一个时钟周期到来的时候,EIP更新为0
  3. 开始执行中断处理程序
  4. 该程序先保存好当前CPU各寄存器的值,保存好正常执行的下一条指令的地址
  5. 然后执行溢出异常处理程序
  6. 之后恢复CPU寄存器的值,恢复EIP的值
  7. CPU继续执行add指令之后的指令

按照北大MOOC中给的例子就是,在当前页面执行完加法,发现放不下,因此翻到第一页去执行程序,执行完之后,再翻回来继续执行。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C language】动态数组的创建和使用

在C语言中,使用malloc函数创建动态数组,使用一个指针指向它,使用下标进行访问。 unsigned long *a (unsigned long *)malloc(2 * sizeof(int)); a[0] 1000; a[1] 2000; printf("%d %d\n", a[0], a[1]); free(a);上述例子&…

x86异常处理与中断机制(2)中断向量表

补充:事件不仅包含中断和异常,还包含系统调用,这个属于用户主动请求的事件。 上一节,只有一个溢出异常,那么,如果很多异常、中断呢?(中断向量表) 另外,之前0…

x86异常处理与中断机制(3)中断处理过程

上一节讲完了根据中断类型号找中断服务程序的过程,现在着重说明一下更加完整的中断处理过程吧。 本节以8086时代的中断处理过程为例进行说明,主要分两大部分 硬件处理软件处理 需要注意,这不是绝对的,得看实际情况,…

Linux 0.11 内核解析:中断相关(1)asm.s文件中断处理分析

0 源代码 有两个版本的,一个是带中文注释,Intel格式的;一个是不带注释是AT&T格式的。 Linux 0.11 中文注释版 Linux 0.11 源码,基于《Linux内核完全注释》赵炯 1 asm.s 文件 我们先假设该文件处理的中断是无特权过渡的情况…

【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment,有很多错误。 我是拒绝分析这种问题的,因为似乎没有人会这么乱用…

enum in c language

今天说说C语言中的枚举。 参考:Enumeration (or enum) in C 1 定义 定义一个枚举类型很容易: enum aa { a1, a2, a3 };这里 enum是关键字aa是枚举变量,也就是我们自定义类型a1,a2,a3是枚举成员 然后怎么使用呢? 首先&#…

信号量SIGCHLD的使用,如何让父进程得知子进程执行结束,如何让父进程区分多个子进程的结束

本教程基于 Ubuntu 20.10 gcc 10.2.0. 示例程序如果不能正常编译和执行,说明您系统和工具版本与我的不匹配,请自行查阅资料。 0 概述 先给出该信号的描述: SignalValueDescriptionSIGCHLD17Child status has changed (POSIX). Signal sent …

UNIX哲学

参考: 对比Linux与Windows 使用Linux想要做某些事情的时候,就拆开想,想想我需要哪些功能,需要哪些工具,依次怎么执行,然后用管道建立连接,让数据依次流过不同的工具,从而得到最终结果…

fork创建多个子进程

references: [1] how to create two processes from a single Parent [2] fork() in C [3] linux中fork同时创建多个子进程的方法 fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是&#x…

wait系统调用

reference:Wait System Call in C 只强调几点,剩下的直接看参考链接内容就好了,不是偷懒,而是里面内容写的很好了,没必要再写一遍了,这种东西就是单纯的系统调用而已,理解了功能,就完事了&#…

正则表达式特别需要注意的点:“空“字符的匹配

在正则表达式中,[...]代表1个字符,不管里面有多少字符,最终这个东西的结果都是1个字符。 对于表达式[^a]表达的匹配除了a之外的字符,并且是1个字符。 需要注意的是,有些特殊字符是不会被匹配的。 我们看一个示例&am…

vim多列操作--插入/删除

插入 How to insert text at beginning of a multi-line selection in vi/VimVim Commands 删除 ctrl v使用上下左右键选中一片区域按d删除

vim进行行内某部分的复制剪切粘贴

ctrl v使用方向键选中你要复制的部分 按d(剪切)或者按y(复制)再移动到你的目标位置,按p粘贴(在正常模式下才行,如果不是,先按esc) 这个过程与你操作word文档的复制粘贴…

函数调用堆栈

基于孟宁老师的Linux内核分析 1 int g(int x){ 2 int y x 3;3 return y;4 }5 6 int f(int x){7 int z x 10;8 return g(z);9 }10 11 int main(){12 int a f(8) 1;13 return 0;14…

Vivado提高综合和实现的速度

让计算机的资源尽可能给vivado,综合、实现的时候修改一个参数 jobs改为你的计算机的最大值,我的计算机是12核的。 速度会快很多!

安装Ubuntu RISC V toolchain失败(网速、git配置原因)

git获取大容量工程出错:RPC failed; curl GnuTLS recv error : Decryption has failed. error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.fatal: The remote end 官方GitHub仓库 gitee镜像仓库 如果网速不够&#xff0…

VirtualBox Ubuntu个人配置

注意这里VT-x启用,除了在BIOS启用CPU虚拟化,还得在命令行设置一次才可以勾选。 F:\>cd F:\VirtualBox # 进入VirtualBox安装目录F:\VirtualBox>VBoxManage.exe list vms # 查找所有虚拟机 "rhel64" {240f96d8-6535-431d-892e-b70f3dc4…

Ubuntu停止维护版本的软件源配置和系统升级方法

这里以Ubuntu 20.10版本为例(当前是2022.2.14,该版本已经停止维护),我们现在需要正常使用该版本,并且期待升级到21.10版本,我们需要 配置正确是软件源升级该版本 配置正确的软件源 配置国内镜像源 我们…

diff and colordiff on Ubuntu

在Ubuntu中使用diff来对比文件差异,但是不是很好用,尤其是着色方面,用起来很麻烦,因此可以安装colordiff。 我们有两个文件file1和file2,使用命令 colordiff file1 file2 -y -B -W 140就可以对比文件差异&#xff0c…

帮助你成为高手的视频和资料

1. 为什么大多数人不会真正成功 博客链接 视频链接 2. TED演讲:真正拉开你与周围人之家差距的,是自学能力 视频链接 3 埃隆马斯克:第一性原理,少用类比,类比多了就不能抓住本质了 4 如何成为一个顶尖高手 文章链…