八.异常控制流ECF
创始人
2024-05-30 13:45:12
0

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

相关内容

热门资讯

哪个安卓机系统好用,探索安卓系... 你有没有想过,手机里的安卓系统就像是个大厨,不同的系统就像不同的烹饪手法,有的让你吃得津津有味,有的...
安卓如何控制苹果系统,从安卓到... 你知道吗?在这个科技飞速发展的时代,安卓和苹果两大操作系统之间的较量从未停歇。虽然它们各自有着忠实的...
安卓原生系统文件夹,安卓原生系... 你有没有发现,每次打开安卓手机,里面那些文件夹就像是一个个神秘的宝箱,里面藏着各种各样的宝贝?今天,...
基于安卓系统的游戏开发,从入门... 你有没有想过,为什么安卓手机上的游戏总是那么吸引人?是不是因为它们就像是你身边的好朋友,随时随地都能...
安卓系统怎样装驱动精灵,安卓系... 你那安卓设备是不是突然间有点儿不给力了?别急,今天就来手把手教你如何给安卓系统装上驱动精灵,让你的设...
如何本地安装安卓系统包,详细步... 你有没有想过,把安卓系统装在你的电脑上,是不是就像给电脑穿上了时尚的新衣?想象你可以在电脑上直接玩手...
安卓12卡刷系统教程,体验全新... 你有没有发现,你的安卓手机最近有点儿不给力了?运行速度慢得像蜗牛,是不是也想给它来个“换血大法”,让...
安卓系统无法打开swf文件,安... 最近是不是发现你的安卓手机有点儿不给力?打开SWF文件时,是不是总是出现“无法打开”的尴尬局面?别急...
鸿蒙系统依赖于安卓系统吗,独立... 你有没有想过,我们手机里的那个鸿蒙系统,它是不是真的完全独立于安卓系统呢?这个问题,估计不少手机控都...
适合安卓系统的图片软件,精选图... 手机里堆满了各种美美的照片,是不是觉得找起来有点头疼呢?别急,今天就来给你安利几款超级适合安卓系统的...
阴阳师安卓系统典藏,探寻阴阳师... 亲爱的阴阳师们,你是否在安卓系统上玩得如痴如醉,对那些精美的典藏式神们垂涎欲滴?今天,就让我带你深入...
安卓系统有碎片化缺点,系统优化... 你知道吗?在手机江湖里,安卓系统可是个响当当的大侠。它那开放、自由的个性,让无数手机厂商和开发者都为...
安卓4系统手机微信,功能解析与... 你有没有发现,现在市面上还有很多安卓4系统的手机在使用呢?尤其是那些喜欢微信的朋友们,这款手机简直就...
鸿蒙系统是安卓的盗版,从安卓“... 你知道吗?最近在科技圈里,关于鸿蒙系统的讨论可是热闹非凡呢!有人说是安卓的盗版,有人则认为这是华为的...
安卓系统怎么剪辑音乐,轻松打造... 你是不是也和我一样,手机里存了超多好听的歌,但是有时候想给它们来个变身,变成一段专属的旋律呢?别急,...
怎么把安卓手机系统变为pc系统... 你有没有想过,把你的安卓手机变成一台PC呢?听起来是不是有点酷炫?想象你可以在手机上玩电脑游戏,或者...
手机怎么装安卓11系统,手机安... 你有没有想过,让你的手机也来个“青春焕发”,升级一下系统呢?没错,就是安卓11系统!这个新系统不仅带...
安卓系统如何拼网络,构建高效连... 你有没有想过,你的安卓手机是怎么和网络“谈恋爱”的呢?没错,就是拼网络!今天,就让我带你一探究竟,看...
安卓系统怎么看小说,轻松畅享电... 你有没有发现,手机里装了那么多应用,最离不开的竟然是那个小小的小说阅读器?没错,就是安卓系统上的小说...
车载安卓系统12v几安,12V... 你有没有想过,你的车载安卓系统升级到12V几安,竟然能带来如此翻天覆地的变化?没错,今天咱们就来聊聊...