异常控制流ECF

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。

一、异常控制流(ECF)

现代系统通过使控制流发生突变来对这些情况做出反应。一般而言,我们把这些突变称为异常控制流(Exceptional Control Flow,ECF)。
ECF是操作系统用来实现I/O、进程和虚拟内存的基本机制。应用程序通过使用陷阱(trap)或者系统调用(system call)的ECF形式,向操作系统请求服务(比如向磁盘写入数据、创建一个新进程、终止当前进程,都是通过系统调用来实现的)。

二、异常

异常是异常控制流的一种形式,它一部分由硬件实现,一部分由操作系统实现。

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

image-20240101100913340

状态变化称为事件(event)。事件的发生可能和当前指令的执行直接相关。比如,发生虚拟内存缺页、算数溢出,或者一条指令试图除以0。事件也可能和当前指令的执行没有关系。比如,一个系统定时器产生信号或者一个I/O请求完成。

系统中可能的每种异常都分配一个唯一的非负整数的异常号,并且每个异常号都对应了对应异常的处理程序。异常处理程序都存储在异常表中,通过唯一的异常号可以在异常表中查找对应的异常处理程序。

image-20240101102327223

异常表的起始位置放在一个叫做异常表基址寄存器的特殊CPU寄存器中,异常号是到异常表中的索引。

image-20240101102752447

在IA-32(也就是32位Linux系统中) ,这个异常表是 IDT (Interrupt Descriptor Table),异常表的起始位置放在IDTR (IDT register)。在IDT中有256种不同的异常类型,具体如下:

image-20240101103420179

三、异常的类别

异常可以分为四类:中断(interrupt)陷阱(trap)故障(fault)终止(abort)
image-20240101113921257

3.1 中断

中断的概念

CPU在执行指令时,收到某个中断信号转而去执行预先设定好的代码,然后再返回到原指令流中继续执行,这就是中断机制。

其实举个例子来说:就是你写着作业呢,你舍友在蹲坑给你打个电话让你拿个卫生纸(发生事件),你保存下当前写的作业的状态(保存现场),然后给舍友去送纸(处理中断),送完回来继续接着写作业(恢复现场)。

中断包括可屏蔽中断不可屏蔽中断。可屏蔽中断(EFLAG寄存器中的IF位为0)就是该中断可以被CPU屏蔽不管,也可以等待当前指令执行完然后再处理该中断。可屏蔽中断一般用于优先级较低的中断,一般来自IO设备。不可屏蔽中断(EFLAG寄存器中的IF位为1)是需要CPU立即处理该事务,不可屏蔽中断发生时,将当前的指令和状态(各个寄存器的值)存储在栈中,方便CPU处理完中断后继续恢复中断前的工作。

中断信号由外部硬件产生,并且中断是异步的,也就是说CPU不知道什么时候会产生中断,所以CPU每次取指前都要查看一下中断引脚查看是否有中断产生。

在IA-32架构中,中断产生后会通过中断号选择对应的中断处理程序,执行预先设计好处理该中断的代码,处理完成后再返回。

中断基本流程

异常的流程和中断的流程大差不差,只有一些细节不一样

image-20240101104852959

  • 响应中断

系统要求中断请求信号一直保持到CPU对其进行中断响应为止。CPU每次取指前都会查看一下中断引脚如果有有效值,并且IF=1(不可屏蔽中断),CPU就会向发送中断信号的外设发送一个低电平有效的电信号,表示已经收到了你的中断信号。

  • 关中断

如果中断处理程序在保存现场的过程中产生了新的中断,一些还没来得及被保存的信息可能会被破坏。因此,必须在此过程中屏蔽外部中断。CPU自动将状态标志寄存器FR或EFR的内容压入堆栈保护起来,然后将FR或EFR中的中断标志位IF与陷阱标志位TF清零,从而自动关闭外部硬件中断。

  • 保护断点

保护断点就是将CS和IP/EIP的当前值压入堆栈保存,为了中断处理完毕后能够继续执行中断前的下一个指令。

  • 识别并跳转到对应的中断处理程序

在IA-32中,CPU会通过中断号在IDT(中断向量表)中找到对应的中断处理程序。

  • 中断处理上下部

进入中断后,当前系统处于关中断,也就是其他所有的代码都在等待当前中断处理完成,所以需要当前中断处理的要快。但是有的时候中断处理的工作量并不小,那要怎么办呢。就是将中断分为上下部,上部紧急需要立即处理完的,但是该中断也有不紧急的部分就分为下部,下部进入调度,可以以后再做,因为下部不是很着急做。

  • 恢复现场

恢复中断前各个寄存器的值。

  • 中断返回

栈中弹出CS和IP/EIP中断前的值,执行中断前的下一条指令。

3.2 陷阱

陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用

用户程序经常需要向内核请求服务,比如读一个文件(read)、创建一个新的进程(fork)、加载一个新的程序(execve),或者终止当前进程(exit)。为了允许对这些内核服务的受控的访问,处理器提供了一条特殊的"syscall n"指令,当用户程序想要请求服务n时,可以执行这条指令。执行 syscall 指令会导致一个到异常处理程序的陷阱,这个处理程序解析参数,并调用适当的内核程序。

image-20240101105519497

3.3 故障

故障由错误情况引起,它可能能够被故障处理程序修正。当故障发生时,处理器将控制转移给故障处理程序。如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核中的 abort 例程,abort 例程会终止故障引起的应用程序。

image-20240101112922033

故障的经典例子是缺页异常

3.4 终止

终止是不可恢复的致命错误造成的结果,通常是一些硬件错误,比如DRAM或者SRAM位被损坏时发生的奇偶错误。终止程序从不将控制返回给应用程序。处理程序将控制返回给一个 abort 例程,该例程会终止这个应用程序。

image-20240101113204521

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

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

相关文章

【年终总结系列 2023】新起点,同时追寻更高的起点

什么是攀登者,用一个场景来概括就是:经常弯腰低头手脚并用向上攀爬,待到山的顶峰后终于可以舒展一下身体,但若舒展的时间过长便会觉得无聊,此时向远处眺望,发现了更高的山峰,便又充满了激情。对…

web前端——clear可以清除浮动产生的影响

clear可以解决高度塌陷的问题&#xff0c;产生的副作用要小 未使用clear之前 <!DOCTYPE html> <head><meta charset"UTF-8"><title>高度塌陷相关学习</title><style>div{font-size:50px;}.box1{width:200px;height:200px;backg…

排序算法——关于快速排序的详解

目录 1.基本思想 2.基本原理 2.1划分思想 2.2排序过程 &#xff08;1&#xff09;选择基准值 &#xff08;2&#xff09;分割过程&#xff08;Partition&#xff09; &#xff08;3&#xff09;递归排序 &#xff08;4&#xff09;合并过程 2.3具体实例 2.4实现代码 2.5关键要…

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图&#xff08;use case diagram&#xff09;是用户与系统交互的最简表示…

HarmonyOS 组件通用属性之位置设置

本文 我们来说 通用属性中的位置设置 主要是针对组件的对齐方式 布局方向 显示位置 做过WEB开发的 对流式布局应该都不陌生 就是 一行放内容 不够放就换行 我们可以先这样写 Entry Component struct Index {build() {Row() {Column() {Stack(){Text("你好")Text(&…

Springboot整合MQ学习记录

Mq介绍 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在分布式系统开发中应用非常广泛。支持Windows、Linux/Unix、MA…

<HarmonyOS主题课>1~3课后习题汇总

&#xff1c;HarmonyOS第一课&#xff1e;1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件&#xff1f;&#xff08;B&#xff09; A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

智能座舱的下一个价值“爆点”——让“光”更智能

汽车智能化快速升级&#xff0c;智能座舱作为人机交互的主要窗口&#xff0c;交互模态、用户体验也呈现多维度升级。 例如&#xff0c;今年下半年上市的多款高端智能车型纷纷基于高性能座舱硬件平台&#xff0c;集成了AR-HUD、DMS/OMS等高阶功能&#xff0c;同时结合超大屏/多…

简单介绍Java 的内存泄漏

java最明显的一个优势就是它的内存管理机制。你只需简单创建对象&#xff0c;java的垃圾回收机制负责分配和释放内存。然而情况并不像想像的那么简单&#xff0c;因为在Java应用中经常发生内存泄漏。 本教程演示了什么是内存泄漏&#xff0c;为什么会发生内存泄漏以及如何预防…

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…

Glide加载不出图片与请求浏览器资源时中文转码问题

报错代码如图&#xff1a;Image load failed: Failed to load resourse 首先确保你的图片 URL 地址是正确的&#xff0c;可以通过在浏览器中直接访问这个 URL 来测试。另外&#xff0c;确保 URL 地址不包含特殊字符或空格&#xff0c;以免影响加载。 然后确定依赖库没有问题&am…

地平面--高速布线

https://baijiahao.baidu.com/s?id1764139038516816855&wfrspider&forpc 概念 回顾传输线&#xff0c;由任意两条有一定长度的导线组成&#xff0c;一条为信号路径&#xff0c;一条为返回路径。基本电路理论告诉我们&#xff0c;信号是由电流传播的&#xff0c;明确的…

目标检测-One Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 和Fast-CNN相比&#xff0c;速度快&#xff0c;但精度下降。&#xff08;边框回归不加限制&#xff09;…

高并发如何保证接口的幂等性?

前言 接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法&#xff0c;绝大部分内容我在项目中实践过的&#xff0c;给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景&#xff1a; 有时我…

Docker(八)Python+旧版本chrome+selenium+oss2+fastapi镜像制作

目录 一、背景二、能力三、核心流程图四、制作镜像1.资源清单2.Dockerfile3.制作镜像 五、启动测试 一、背景 近几年我们线下的创业团队已从零到一开发过好几个小程序项目&#xff0c;都是和体育相关。其中生成海报分享图片好像都是不可或缺的功能。之前的项目老板给的时间都比…

如何让CHAT使用python绘制概率密度图像?

问CHAT&#xff1a;用python绘制概率密度图像 CHAT回复&#xff1a;你可以使用Python的matplotlib库和numpy库进行概率密度的绘制。 以下是一个简单的例子&#xff1a; python import numpy as np import matplotlib.pyplot as plt #随机生成1000个正态分布的数 data np.rand…

《微机原理与应用》期末考试题库(附答案解析)

第1章 微型计算机概述 1.微型计算机的硬件系统包括___A _____。 A&#xff0e;控制器、运算器、存储器和输入输出设备 B&#xff0e;控制器、主机、键盘和显示器 C&#xff0e;主机、电源、CPU和输入输出 D&#xff0e;CPU、键盘、显示器和打印机 2.微处…

安装Keras用于影像分割

conda create -n tfkeras2024 python3.9.18 activate tfkeras2024 pip install tensorflow-gpu2.9.0 pip install keras pip install scipy pip install ipykernel ipython python -m ipykernel install --name tfkeras2024 删除环境conda remove -n tfkeras2024 --all

构建高效秒杀系统的设计原理及注意事项

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

G4周:CGAN,手势生成

本文为&#x1f517;365天深度学习训练营 中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 我的环境&#xff1a; 1.语言&#xff1a;python3.7 2.编译器&#xff1a;pycharm 3.深度学习框架Pytorch 1.8.0cu111 一、CGAN介绍 条件生成对抗网络&#xff08;…