八.异常控制流ECF

news2025/7/12 9:04:42

1.异常

异常位于硬件和OS的交界部分
系统调用是为应用程序提供到OS的入口点的异常
进程和信号位于应用和OS的交界部分
非本地跳转是ECF的应用层形式

1.1 异常表

异常是控制流中的突变,用来响应处理器状态的某些变化
状态变化称为事件
系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号
系统启动时,OS分配和初始化一张称为 异常表的跳转表,使得表目k包含异常k的处理程序的地址
异常表的起始地址放在 异常表基址寄存器

1.2 异常的分类

中断
陷阱和系统调用
普通的函数运行在用户模式,系统调用运行在内核模式
内核:操作系统常驻内存的部分
故障
比如 缺页异常,指令引用一个虚拟地址,而与该地址对应的物理页面不在内存中
终止
通常是硬件错误,终止处理程序从不将控制返回给应用程序
示例
一般保护故障:引用一个未定义的虚拟内存区域,或试图写一个只读的文本段

2.进程

关键抽象:
一个独立的逻辑控制流,提供一个假象,好像程序独占地使用处理器
一个私有的地址空间,提供一个假象,好像程序独占地使用内存系统
逻辑控制流:PC值的序列
进程轮流使用寄存器
并发流:一个逻辑流的执在时间上和另一个流重叠
一个进程和其他进程轮流运行,称为多任务,也称为时间分片
并行流:两个流并发地运行在不同的处理器核或计算机上
并行流是并发流的真子集
处理器用某个控制寄存器的一个 模式位,当设置了模式位,进程就运行在内核模式
进程从用户模式到内存模式的唯一方法是诸如中断、故障、陷入系统调用这样的异常
Linux的/proc文件系统,允许用户模式访问内核数据结构的内容

3.上下文切换

OS内核使用上下文切换这种异常控制流,实现多任务
上下文:内核重新启动一个被抢占的进程所需要的状态
调度:抢占当前进程,并重新开始一个先前被抢占了的进程
上下文切换:保存当前进程的上下文、恢复某个先前被抢占的进程保存的上下文、将控制传递给这个新恢复的进程
若系统调用因为等待某个事件发生而阻塞,内核可以让当前进程 休眠

4.进程控制

每个进程都有一个唯一的正数进程ID( PID)
getpid返回调用进程的PID、getppid返回父进程的PID
进程的三种状态:
运行
停止:被挂起且不会被调度
终止:收到终止进程信号、从主程序返回、调用exit函数
父进程通过调用fork函数创建一个新的运行的子进程
父进程中,fork返回子进程的PID;子进程中,返回0。可以分辨程序在哪个进程中执行
fork调用一次,返回两次
父子进程是并发运行的独立进程
两个进程的地址空间相同但独立
两个进程共享文件
回收子进程:
进程被保持在已终止的状态(僵死状态),直到被父进程回收
内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程

如果一个父进程终止,内核会安排init进程(PID=1)成为它的孤儿进程的养父进程
init进程不会终止,是所有进程的祖先
pid_t waitpid(piid_t pid, int *statusp, int opinions);
等待子进程终止或停止
若没有子进程,则返回-1,设置errno为ECHILD
若被信号中断,则返回-1,设置errno为EINTR
wait(&status)等价于waitpid(-1,&status,0)
int execve(const char *filename, const char *argv[], const char *envp[]);
在当前进程的上下文加载并运行一个新程序,覆盖当前进程的地址空间,但没有创建新进程,PID不变
只有当出现错误时,如找不到filename,才会返回到调用程序
进程是执行中程序的一个具体的实例,程序总是运行在每个进程的上下文中

5.信号

发送信号的原因:
内核检测到一个系统事件,比如除零错误、子进程终止
一个进程调用了KILL函数
每个进程都只属于一个进程组
默认一个子进程和它的父进程属于同一个进程组
调用信号处理程序称为捕获信号,执行信号处理程序称为处理信号
安全的信号处理:
使得处理程序尽可能简单,调用安全函数,保存和恢复errno,保护对共享数据结构的访问,使用volatile和sig_atomic_t(原子的、不可中断的)
volatile告诉编译器不要缓存这个变量,强迫编译器每次在代码中引用这个变量时,都要从内存读取值
信号不会排队,若已有一个待处理信号,后续会被简单丢弃

6.非本地跳转

用户级异常控制流形式,将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用-返回序列
int setjmp(jmp_buf env);
int sigsetjmp(sigjmp_buf env, int savesigs);
setjmp函数在env缓冲区保存当前调用环境(PC。栈指针、通用目的寄存器),返回0
返回的值不能被赋值给变量,但可以用于switch或条件语句测试
sigsetjmp触发最近一次初始化env的setjmp返回retval

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

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

相关文章

虹科教您 | 在Windows环境下安装PCAN View及通讯测试指南

应用简介 PCAN-View软件是一款简化的CAN监视软件,可用于显示、发送、和记录CAN数据通讯。报文可手动和定期发送,用户可设置比特率。在处理期间显示总线系统错误和CAN硬件的存储器过满。示踪功能可用于记录和保存CAN数据通讯。本文档的作用在于&#xff…

软件测试的几个关键步骤,你需要知道

记得2年前刚毕业的时候听说了软件测试这个行业,当时也去百度仔细进行了一番搜索,评价基本千篇一律的看好。 看好的原因在于,专家认为未来的互联网市场用户体验至上,而产品质量与用户体验有紧密的联系,自从近年产品经理…

eyoucms field 获取channelartlist标签的字段值

【基础用法】 标签&#xff1a;field 描述&#xff1a;获取channelartlist标签里的字段值&#xff0c;field标签只能在channelartlist标签里使用。 用法&#xff1a; {eyou:channelartlist typeid栏目ID typeson row20} <a href{eyou:field nametypeurl /}>{eyou:fi…

SCCM 应用程序管理

Microsoft System Center Configuration Manager &#xff08;SCCM&#xff09; 被认为是管理 Microsoft 应用程序的示例性工具。它可以无缝地进行补丁管理和软件部署。但处理第三方应用程序不是它的游戏。因此&#xff0c;除了补丁管理之外&#xff0c;Patch Connect Plus 还为…

接口里面可以写实现方法吗【可以】 、接口可以多继承吗【可以】

比如下面这道题&#xff1a; 问: 接口里面可以写方法吗&#xff1f; 答: 当然可以啊&#xff0c;默认就是抽象方法。 . 问&#xff1a; 那接口里面可以写实现方法吗&#xff1f; 答&#xff1a; 不可以&#xff0c;所有方法必须是抽象的。 . 问&#xff1a; 你确定吗&#xff1…

Java面试题--SpringRefresh流程

Spring refresh 概述 Spring 容器是一个管理 bean 的容器&#xff0c;可以创建、注入和管理 bean 及其依赖关系。Spring 容器可以根据应用程序配置和运行时条件创建、初始化和销毁 bean。refresh() 函数是 Spring 容器中的一种功能&#xff0c;可以重新加载和刷新容器中的配置…

什么?同步代码块失效了?-- 自定义类加载器引起的问题

一、背景 最近编码过程中遇到了一个非常奇怪的问题&#xff0c;基于单例对象的同步代码块似乎失效了&#xff0c;百思不得其姐。 下面给出模拟过程和最终的结论。 二、场景描述和模拟 2.1 现象描述 Database实现单例&#xff0c;在 init 方法中使用同步代码块来保证 data不…

Revit中图纸要怎么布局呢?

1、明确图纸布局原则。 2、在图纸上锁定视图的位置 在图纸上放置视图(或明细表)并根据需要对其定位后&#xff0c;可以将其锁定到位&#xff0c;这样就不会在无意中移动它。如果想要解锁视图&#xff0c;单击锁定图标即可&#xff0c;如图1所示。 3、在图纸上旋转视图 可以在图…

imx6 usb增强信号强度

USB信号 参考&#xff1a;官方文档 USB信号完整性取决于许多因素&#xff0c;如电路设计、PCB布局、堆叠和阻抗。每个产品可能彼此不同&#xff0c;因此客户需要微调参数&#xff0c;以获得最佳的信号质量。 测试板已经路由出两个USB端口:一个OTG1&#xff0c;一个主机。每个端…

xcode14安装swift package设置github账户token

这里写目录标题登录github账户,复制token打开xcode添加github账户选择swift package登录github账户,复制token 登录github点击上面菜单自己的头像,settings->Developer settings->Personal access tokens->Tokens (classic)->Generate new token (classic) Note名…

Spring 响应式编程-读书笔记

序言 大家好&#xff0c;我是比特桃。本文为《Spring 响应式编程》的读书笔记&#xff0c;响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点&#xff0c;同时响应式可以容忍网络延迟&#xff0c;并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速…

判断推理之图形推理

考点一动态位置变化&#xff08;一&#xff09;平移1.特征&#xff1a;图形在平面上的移动&#xff0c;图形本身的大小和形状不发生改变。2.方向&#xff1a;直线&#xff08;上下、左右、斜对角线&#xff09;&#xff0c;绕圈&#xff08;顺时针、逆时针&#xff09;3.距离&a…

聚观早报 |王兴宣布美团网约车业务调整;软银Arm被曝4月申请上市

今日要闻&#xff1a;王兴宣布美团网约车业务调整&#xff1b;钉钉收购协同办公厂商「我来 wolai」&#xff1b;软银旗下Arm被曝4月申请上市&#xff1b;小米汽车完成冬测&#xff1b;淘特负责人否认将被合并到淘宝 王兴宣布美团网约车业务调整 美团创始人王兴发布内部信&#…

蓝桥杯入门即劝退(二十六)组合问题(回溯算法)

-----持续更新Spring入门系列文章----- 如果你也喜欢Java和算法&#xff0c;欢迎订阅专栏共同学习交流&#xff01; 你的点赞、关注、评论、是我创作的动力&#xff01; -------希望我的文章对你有所帮助-------- 专栏&#xff1a;蓝桥杯系列 一、题目描述 给定两个整数 n …

css:使用filter和backdrop-filter实现高斯模糊效果

背景 今天接到一个需求是&#xff0c;使用高斯模糊的效果对一个页面进行模糊处理&#xff0c;正好借这个机会来整理一下 css3 中高斯模糊的两个 API API介绍 filter 说明&#xff1a; 该 API 是一个过滤器&#xff0c;不仅能实现高斯模糊&#xff0c;还有很多比如颜色偏移、…

【Linux】网络基础(1)

前言 相信没有网络就没有现在丰富的世界。本篇笔记记录我在Linux系统下学习网络基础部分知识&#xff0c;从关于网络的各种概念和关系开始讲起&#xff0c;逐步架构起对网络的认识&#xff0c;对网络编程相关的认知。 我的上一篇Linux文章呀~ 【Linux】网络套接字编程_柒海啦的…

利用 socket.io 实现前后端实时交互

官网地址&#xff1a;Socket.IO 项目结构&#xff1a; 服务端&#xff08;node&#xff09;代码&#xff1a; 首先安装 express&#xff0c;socket.io npm i express socket.io -S/server/index.js // 官网用例&#xff1a;https://socket.io/zh-CN/docs/v4/server-initial…

数据库-基础篇-6-多表查询(内连接、外连接、自连接)

一、多表关系 1.概述&#xff1a;项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构也存在着各种联系&#xff0c;基本上分为三种&…

idea中 使用git实现远程仓库master分支和dev分支互相合并

一 新建dev分支 1.在右下角当前分支下&#xff0c;选择创建分支选项 2.给分支起名字 3.创建后&#xff0c;自动切换成新分支 4.将dev分支内容提交到远程dev仓库 进行add&#xff0c;commit&#xff0c;pull&#xff0c;push操作。 1commit操作 2.进行pull操作&#xff0c;远…

浅析CSRF跨域读取型漏洞之CORS

目录 前提知识 CORS介绍 跨域访问的一些场景 跨域请求方式 漏洞原理 非简单请求的预检过程 安全隐患 漏洞复现 挖掘技巧 防御 前提知识 CORS介绍 H5提供的一种机制&#xff0c;WEB应用程序可以通过在HTTP增加字段来告诉浏览器&#xff0c;哪些不同来源的服务器是有权…