Linux系统 异常控制流

devtools/2024/12/28 3:22:33/

前言

下面内容大部分来自《深入理解计算机系统》(CSAPP)一书第八章异常控制流,更深入了解建议阅读此书第八章,推荐阅读《UNIX高级环境编程》。

异常控制流(Exception Control Flow, ECF) 是计算机系统中用来处理非正常情况的一种控制流方式。它允许程序在遇到错误或异常事件时,从正常的程序执行路径中跳出,执行特殊的处理逻辑,然后恢复正常流程或者终止程序。这种机制在操作系统、编程语言和硬件层面都有广泛应用。

异常

异常是异常控制流的一种形式,它一部分由硬件实现,一部分由操作系统实现。因为它们有一部分是由硬件实现的,所以具体细节将随系统的不同而有所不同。然而,对于每个系统而言,基本的思想都是相同的。

异常(exception)就是控制流中的突变,用来响应处理器状态中的某些变化。

在这里插入图片描述

在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表(exception table)的跳转表,进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序(exception handler)).当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下 3 种情况中的一种:

  1. 处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令。
  2. 处理程序将控制返回给 Inext ,如果没有发生异常将会执行的下一条指令。
  3. 处理程序终止被中断的程序。

在这里插入图片描述
在这里插入图片描述

异常类别

类别原因异步/同步返回行为
中断来自 I/O 设备的信号异步总是返回到下一条指令
陷阱有意的异常同步总是返回到下一条指令
故障潜在可恢复的错误同步可能返回到当前指令
终止不可恢复的错误同步不会返回

1. 中断(interrupt)

中断是一种由外部硬件设备发出的异步信号,用于引起 CPU 暂停当前执行的程序,去处理外部事件。中断机制的核心在于提供一种高效的方式来响应外部设备的请求,而不需要程序主动轮询设备的状态。

在这里插入图片描述

2. 陷阱和系统调用(trap)

陷阱是一种由程序主动触发的同步异常,用于请求操作系统的服务(例如系统调用)或进入调试模式。陷阱的目的是通过特定指令让程序安全地从用户模式切换到内核模式,从而执行特权操作。

在这里插入图片描述

3. 故障(fault)

故障是一种由程序触发的同步异常,表示某些潜在错误需要立即处理。故障的处理机制允许操作系统尝试修复问题,使程序可以恢复并继续执行。

在这里插入图片描述

4. 终止(abort)

终止是一种不可恢复的异常,通常由硬件或系统检测到的致命错误触发。这种错误表示程序或系统的状态已经严重损坏,无法继续运行。

在这里插入图片描述

异常控制流(ECF)发生在计算机系统的各个层次,是计算机系统中提供并发的基本机制。

在硬件层,异常是由处理器中的事件触发的控制流中的突变。控制流传递给一个软件处理程序,该处理程序进行一些处理,然后返回控制给被中断的控制流。

有四种不同类型的异常:中断、故障、终止和陷阱。当一个外部 I/O 设备(例如定时器芯片或者磁盘控制器)设置了处理器芯片上的中断管脚时,(对于任意指令)中断会异步地发生。控制返回到故障指令后面的那条指令。一条指令的执行可能导致故障和终止同步发生。故障处理程序会重新启动故障指令,而终止处理程序从不将控制返回给被中断的流。最后,陷阱就像是用来实现向应用提供到操作系统代码的受控的人口点的系统调用的函数调用。

在操作系统层,内核用 ECF 提供进程的基本概念。进程提供给应用两个重要的抽象:

逻辑控制流,它提供给每个程序一个假象,好像它是在独占地使用处理器;

私有地址空间,它提供给每个程序一个假象,好像它是在独占地使用主存。

在操作系统和应用程序之间的接口处,应用程序可以创建子进程,等待它们的子进程停止或者终止,运行新的程序,以及捕获来自其他进程的信号。信号处理的语义是微妙的,并且随系统不同而不同。然而,在与 Posix 兼容的系统上存在着一些机制,允许程序清楚地指定期望的信号处理语义。

最后,在应用层,C 程序可以使用非本地跳转来规避正常的调用/返回栈规则,并且直接从一个函数分支到另一个函数。


http://www.ppmy.cn/devtools/138296.html

相关文章

QT的exec函数

在Qt框架中,exec()方法是QDialog类(及其子类)的一个成员函数,用于以模态(modal)方式显示对话框。当exec()被调用时,它会启动一个局部的事件循环,这个循环会阻塞对对话框之外的其他窗…

自由学习记录(25)

只要有修改,子表就不用元表的参数了,用自己的参数(只不过和元表里的那个同名) 子表用__index“继承”了父表的值,此时子表仍然是空表 一定是创建这样一个同名的变量在原本空空的子表里, 传参要传具体的变…

三种蓝牙架构实现方案

一、蓝牙架构方案 1、hostcontroller双芯片标准架构 手机里面包含很多SoC或者模块,每颗SoC或者模块都有自己独有的功能,比如手机应用跑在AP芯片上,显示屏,3G/4G通信,WiFi/蓝牙等都有自己专门的SoC或者模块&#xff0…

Ubuntu nvidia-cuda-toolkit 升级

在 Ubuntu 系统上升级 nvidia-cuda-toolkit 可以通过以下步骤完成。请注意,升级 CUDA 工具包可能需要重新安装或更新 NVIDIA 驱动程序,因此请确保在升级之前备份重要数据。 1. 更新系统包列表 首先,确保你的系统包列表是最新的:…

CTF-Hub SQL 报错注入(纯手动注入)

​ 当输入1时,发现只有查询正确,基本上可以判断出没有回显 开始注入(工具hackerBar) 题目是报错注入,方向就比较明显,大致说一下用到的函数和原理。 常见报错注入函数: 通过 floor() 报错注入通过 extractValue() …

《使用Python进行数据挖掘:理论、应用与案例研究》

嘿,今天我要给你们介绍一本使用Python进行数据挖掘的好书。这本书是由吴迪博士撰写的,他是雷曼学院商学院的助理教授,也是数据科学的实战派。 在这个时代,数据多得让人眼花缭乱,要从中找出有用的信息,那可不…

多线程

线程是什么? 1、线程是进程的执行分支,一个进程内部的控制程序 2、一个进程至少有一个执行线程 3、从CPU角度来看,线程就是一个更轻量化的线程 4、线程在进程内部运行,所以本质就是在进程地址空间上运行 注意: 一…

随机变量的线性最小均方估计(LMMSE)——多个观测变量

假设有一个随机变量 x x x需要估计,线性最小均方误差(Linear Minimum Mean Square Error, LMMSE)估计的目标是找到一个线性估计器 x ^ ∑ i 0 N − 1 a i y i b \hat{x} \sum_{i0}^{N-1} a_i y_i b x^∑i0N−1​ai​yi​b,使…