信息安全系统设计基础第十一周总结
第八章 异常控制流
从给处理器加电开始,直到断电,程序计数器假设一个值的序列a0,a1,...a(n-1),其中每个a(k)是某个相应的指令I(k)的地址;每次从a(k)到a(k+1)的过渡称为控制转移;这样的控制转移序列叫做处理器的控制流
现代系统通过使控制流发生突变来对这些情况作出反应.一般而言,我们把这些突变称为异常控制流.异常控制流发生在计算机系统的各个层次
8.1异常
异常是异常控制流的一种形式,由硬件和操作系统实现的
异常就是控制流中的突变,用来响应处理器状态中的某些变化
状态变化称为事件,事件未必与当前指令的执行有关
处理器检测到有事件发生时,他会通过一张叫异常表的跳转表进行一个间接过程调用(异常),到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序)
(2)异常的类别:中断,陷阱,故障,中止
- 中断:中断是异步发生的,是来自处理器外部的I/O设备的信号的结果.硬件中断的异常处理程序通常称为中断处理程序
下图概述了一个中断的处理
剩下的异常类型(陷阱,故障,终止)是同步发生的,是执行当前指令的结果.我们把这类指令叫做故障指令
- 陷阱的系统调用
陷阱是有意的异常,是执行一条指令的结果.陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用
请求服务:读文件(read),创建一个新的进程(fork),加载一个新的程序(execve),终止当前进程(exit)
- 故障
故障由错误情况引起,他可能能够被故障处理程序修正
一个经典的故障事例是缺页异常,当指令引用一个虚拟地址,而与该地址相对应的物理页面不在存储器中,因此必须从磁盘中取出时,就会发生故障
- 终止:终止是不可恢复的致命错误造成的结果,通常是一些硬件错误
(3)Linux/IA32系统中的异常
- Linux/IA32故障和终止:除法错误,一般保护故障,缺页,机器检查
- Linux/IA32系统调用:Linux提供上百种系统调用,当应用程序想要请求内核服务时可以使用,,包括读文件,写文件,创建一个新的进程
8.2进程
进程提供给程序的关键抽象:
- 一个独立的逻辑控制流,它提供一个假象,好象程序独占的使用处理器
- 一个私有的地址空间,它提供一个假象,好象程序独占的使用存储器系统
(1)逻辑控制流
如果想用调试器单步执行程序我们会看到一系列的程序计数器(PC)的值,这些值唯一的对应于包含在程序的可执行目标文件中的指令,或是包含在运行时动态链接到程序的共享对象中的指令
这个PC值得序列叫做逻辑控制流,简称逻辑流
(2)并发流
一个逻辑流的执行在时间上与另一个流重叠:并发流.并发的运行
多个流并发的执行的一般现象称为并发
一个进程和其他进程轮流运行的概念称为多任务
一个进程执行他的控制流的一部分的每一时间段叫作时间片
多任务也叫做时间分片
并行流是并发流的一个真子集,如果两个流并发的运行在不同的处理器核或者计算机上,那么我们称他们为并行流(并行的运行,并行的执行)
(3)私有地址空间
n位地址的机器:地址空间是2^n个可能地址的集合
一个进程为每个程序提供他自己的私有地址空间
私有:和这个空间中某个地址相关联的那个存储器字节是不能被其他进程读或写的
(4)用户模式和内核模式
(5)上下文切换
操作系统内核使用一种称为上下文切换的较高层形式的异常控制流来实现多任务
8.4进程控制
(1)获取进程ID
(2)从程序员的角度,可以认为进程总是处于下面三种状态之一:
- 运行
- 停止
- 终止:三种原因:收到一个信号,该信号的默认行为是终止进程;从主程序返回;调用exit函数
(3)回收子进程
一个终止了但还未被回收的进程称为僵死进程
8.5信号
UNIX信号:一种更高层的软件形式的异常,它允许进程中断其他进程
一个信号就是一条小消息,他通知进程系统中发生了一个某种类型的事件
(1)信号术语
- 发送信号
- 接受信号
(2)发送信号
- 进程组:每个进程都只属于一个进程组
- 用/bin/kill程序发送信号
- 从键盘发送信号
- 用kill函数发送信号
- 用alarm函数发送信号
(3)接受信号
每个信号类型都有一个预定义的默认行为
- 进程终止
- 进程终止并转储存储器
- 进程停止直到被SIGCONT信号重启
- 进程忽略该信号
(4)信号处理问题
- 待处理信号被阻塞
- 待处理信号不会排队等待
- 系统调用可以被中断
不可以用信号来对其他进程中发生的事件计数