20135327郭皓——信息安全系统设计基础第十一周学习总结
第十一周(11.16-11.22):
第八章 异常控制流
现代系统通过使控制流发生突变来对这些情况做出反应。我们把这些突变称为异常控制流
作为程序员,理解 ECF 很重要:
- 理解 ECF 将帮助你理解重要的系统概念。
- 理解 ECF将帮助你理解应用程序是如何与操作系统交互的。
- 理解 ECF 将帮助你编写有趣的新应用程序。
- 理解 ECF 将帮助你理解并开发。
- 理解 ECF 将帮助你理解软件异常如何工作。
8.1 异常
- 异常是异常控制流的一种形式,它一部分是由硬件实现的,一部分是由操作系统实现的
- 异常( exception)就是控制流中的突变,用来响应处理器状态中的某些变化。
- 当异常处理程序完成处理后,根据引起异常的事件的类型,会发生以下三种情况中的一种:
1)处理程序将控制返回给当前指令 curr 即当事件发生时正在执行的指令。
2) 处理程序将控制返回给 酬,即如果没有发生异常将会执行的下一条指令。
3) 处理程序终止被中断的程序。
8.1.1 异常处理
- 系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号。
- 异常表的起始地址放在一个叫做异常在基址寄存器的特殊CPU 寄存器里。
- 异常类似于过程调用,但是有一些重要的不
同之处。
- ·过程调用时,在跳转到处理程序之前,处理器将返回地址压人找中。
- 处理器也把一些额外的处理器状态压到栈里,在处理程序返回时,重新开始被中断的程序会需要这些状态。
- 如果控制从一个用户程序转移到内核,那么所有这些项目都被压到内核栈中,而不是压到用户栈中。
- 异常处理程序运行在内核模式下,这意味着它们对所有的系统资源都有完全的访问权限。
8.1.2 异常的类别
- 异常可以分为四类:中断( interrupt)、陷阱 (trap)、故障 (fault) 和终止 (abort)。
1.中断
- 中断是异步发生的,是来自处理器外部的1/ 设备的信号的结果。
- 硬件中断的异常处理程序通常称为中断处理
程序。- 剩下的异常类型(陷阱、故障和终止〉是同步发生的,是执行当前指令的结果。我们把这类指令叫做故障指令。
2.陷阱和系统调用
- 陷阱是有意的异常,是执行一条指令的结果。就像中断处理程序一样,陷阱处理程序将控制返回到下一条指令。陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
3.故障
- 故障由错误情况引起,它可能能够被故障处理程序修正。当故障发生时,处理器将控制转移给故障处理程序。如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核中的 abort 例程, abort 例程会终止引起故障的应用程序。
4.终止
- 终止是不可恢复的致命错误造成的结果,通常是一些硬件错误,比如 DRAM 或者SRAM被损坏时发生的奇偶错误。终止处理程序从不将控制返回给应用程序。
8.1.3 Linux/IA32系统中的异常
- Linux/IA32故障和终止
- 除法错误
- 一般保护故障
- 缺页
- 机器检查
2.linuxllA32 系统调用
- Linux 提供上百种系统调用,当应用程序想要请求内核服务时可以使用,包括读文件、写文件或是创建一个新进程。
8.2 进程
- 异常是允许操作系统提供进程 (process) 的概念所需要的基本构造块,进程是计算机科学中
最深刻最成功的概念之一。- 进程提供给应用程序的关键抽象:
- 一个独立的逻辑控制流,它提供一个假象,好像我们的程序独占地使用处理器。
- 一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用存储器系统。
8.2.1 逻辑控制流
- 如果想用调试器单步执行程序,我们会看到一系列的程序计数器 (PC)值,这些值唯一地对应于包含在程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。这个 PC值的序列叫做这辑控制流,或者简称逻辑流。
- 每个进程执行它的流的一部分,然后被抢占 (preempted) (暂时挂起),然后轮到其他进程。
8.2.2 并发流
- 一个逻辑流的执行在时间上与另一个流重叠,称为并发流 (concurrent fiow) ,这两个流被称为并发地运行.
- 多个流并发地执行的一般现象称为并发 (concurrency)。一个进程和其他进程轮流运行的
概念称为多任务 (multitang).一个进程执行它的控制流的一部分的每一时间段叫做时间片(time slice)。因此,多任务也叫做时间分片(time.slicing).
8.2.3 私有地址空间
- 进程也为每个程序提供一种假象,好像它独占地使用系统地址空间。在一台有 位地址的机器上,地祉空间是 个可能地址的集合 0, 1,…, -l. 一个进程为每个程序提供它自己的私有地址空间。
8.2.4 用户模式和内核模式
- 处理器通常是用某个控制寄存器中的一个模式位 (mode bω 来提供这种功能的,该寄存器描述了进程当前享有的特权。当设置了模式位时,进程就运行在内核模式中(有时叫做超级用户模式)。一个运行在内核模式的进程可以执行指令集中的任何指令,并且可以访问系统中任何存储器位置。
- 没有设置模式位时,进程就运行在用户模式中。用户模式中的进程不允许执行特权指令(privi1eged instruction),比如停止处理器、改变模式位,或者发起一个I/O操作。也不允许用户模式中的进程直接引用地址空间中内核区内的代码和数据。任何这样的尝试都会导致致命的保护故障。反之,用户程序必须通过系统调用接口间接地访问内核代码和数据。
8.2.5 上下文切换
- 操作系统内核使用一种称为上下丈切换 (context switch) 的较高层形式的异常控制流来实现多任务。
- 内核为每个进程维持一个上下文(context)。上下文就是内核重新启动一个被抢占的进程所需的状态。
- 在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。这种决定就叫做调度,是由内核中称为调度器( scheduler)的代码处理的。
- 当内核选择一个新的进程运行时,我们就说内核调皮了这个进程。在内核调度了一个新的进程运行后,它就抢占当前进程,并使用一种称为土下丈切换的机制来将控制转移到新的进程,上下文切换
1)保存当前进程的上下文,
2) 恢复某个先前被抢占的进程被保存的上下文,
3) 将控制传递给这个新恢复的进程。