异常控制流
Exceptional Control Flow ECF
简介
异常控制流发生在计算机系统的各个层次,如:
- 硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序,如硬件定时器定期产生信号;包到达网络适配器后,必须存储在存储器中.
- 操作系统层, 内核通过上下文切换将控制从一个用户进程转移到另一个用户进程.
- 应用层: 一个进程可以发送信号到另一个进程,而接受者会将控制突然转移到它的一个信号处理程序.
- 一个程序可以通过回避通常的栈规则,并执行到其他函数中任意位置的非本地跳转来对错误做出反应.
理解ECF FOR:
- ECF是操作系统用来实现I/O,进程和虚拟存储器的基本机制.
- 应用程序通过使用一个叫trap(陷阱)或者system call(系统调用)的ECF形式,向操作系统请求服务,比如读写磁盘,从网络读取数据,创建进程等.
- 编写unix外壳和web服务器需要了解ECF
- 并发.
- 理解软件异常 try catch等.
Exceptions
异常表 . . 起始地址存在名为 异常表基址寄存器 特殊的CPU寄存器中.exception table base register.
异常与过程调用的不同:
- 过程调用时,在跳转到处理程序之前,处理器将返回地址压入栈中,然而根据异常的类型,返回地址要么是当前指令,要么是下一条指令.
- 处理器也把额外的处理器状态压入栈中,在处理程序返回时,重新开始被中断的程序会需要这些状态.
- 若控制从一个用户程序转移到内核,那么所有这些项目都被压倒内核栈中,而不是压倒用户栈中.
- 异常处理程序运行在内核模式下,这意味着他们对所有的系统资源都有完全的访问权限.
一旦硬件触发了异常,剩下的工作就由异常处理程序在软件中完成.完成后执行一条特殊的”从中断返回”指令,可选地返回到被中断的程序,该指令将适当的状态弹回到处理器的控制和数据寄存器中. 若异常中断的是一个用户进程,就将状态回复为用户模式,然后把控制权返回给它.
异常的类别
type | cause | 同步/异步 | return |
interrupt | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
trap | 有意的异常 | 同步 | 总是返回到下一条指令 |
fault | 潜在的可恢复的错误 | 同步 | 可能返回到当前指令 |
abort | 不可恢复的错误 | 同步 | 不会返回 |
- interrupt
中断是异步发生的,是来自处理器外部的I/O设备的信号的结果.硬件中断不是由任何一条专门的指令造成的,从这个意义上来说它是异步的. 异常中断的异常处理程序通常称为中断处理程序. interrupt handler.
- 流程
- I/O设备,如磁盘控制器,定时器芯片,网络适配器等,通过向CPU芯片上的一个引脚发信号,并将异常号放在系统总线上,以触发中断,这个异常号标识了引起中断的设备.
- 在当前指令执行完后,CPU注意到中断引脚的电压变高了,就从系统总线读取异常号,然后调用适当的中断处理程序.
- 中断处理程序返回后,继续执行下一条指令.
- 流程
- trap
执行一条指令而引起的有意的异常.
- fault
- abort
Processes
一个执行中的程序的实例. 每个程序都是运行在某个进程的上下文context中的. context : 由程序正确运行所需的状态组成,包括放在存储器中的程序的代码和数据,它的栈,通用目的寄存器的内容,程序计数器,环境变量以及打开文件描述符的集合.
关键抽象
- 一个独立的逻辑控制流, 好像进程中的程序独占地使用了处理器;
- 一个私有的地址空间 , 好像进程中的程序独占地使用存储器系统.
理解 并发流(concurrent flow ) 与 并行流 (parallel flow). 用户模式与内核模式.
上下文切换.
高速缓存污染 POLLUTION
硬件高速缓存存储器不能与上下文切换很好的交互,必须重新热身.
System Call Error Handling
Process Controll
- 获取进程ID getpid getppid
- 创建与终止进程. fork , exit ,
- 回收子进程. 重要 wait , waitpid ,
- 休眠进程. sleep pause
- 加载并运行程序 execve
- 利用fork与execve来运行程序.
Signals
Nonlocal Jumps
Tools for manipulating Processes
Summary