分类:
2010-03-23 11:01:10
总结《深入理解计算机系统》:异常控制流
1,计算机中的异常处理机制:处理器设计人员(如被零除、缺页,存储器访问违例等)以及操作系统开发人员(如系统调用以及来自外部的IO设备信号等)为每种类型的异常分配了一个唯一的非负整数异常号。在系统启动时,操作系统分配和初始化一张成为异常表的跳转表,该表使用异常号k作为
索引,以每种类型的异常处理程序地址作为值。当处理器检测到一个事件(比如CPU根据管脚状态确定事件类型)发生时,确定异常号k,然后通过异常表目k转到相应的处理程序。异常表的地址通常保存在“异常表基址寄存器”中。
2,异常处理过程类似于过程调用:都会保存当前寄存器状态,和返回地址。
但是,(1)异常处理的返回地址要么是当前执行指令,要么是当前执行指令的下一条指令。
(2)异常发生时,如果此时内核代表用户程序执行(比如说系统调用),这些状态将会被压入到内核栈,而不是压入到用户栈(过程调用压入 方式)。
(3)此外,对于异常处理程序通常运行在内核模式,此时对于所有的系统资源具有访问权限。
3,异常的类别
(1)中断:中断是异步发生的,来自处理器外部IO设备的信号(区别于同步异常:执行一条指令的结果),它不是由任何一条专门的指令造成的。例如网络适配器、磁盘控制器通过向处理器芯片上的一个管脚发信号,并将异常号放在系统总线上,来触发中断,这个异常号标识了引起中断的设备。中断处理程序总是返回到当前指令的下一条指令。
(2)陷阱:陷阱是同步异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供系统调用接口。陷阱总返回到当前指令的
下一条指令。
(3)故障:故障由错误引起,它可能被故常处理程序修正,如果修正成功,将返回到当前正在执行的指令,重新执行。否则处理程序返回到内核的abort历程,将终止故障程序。故障的一个典型是缺页异常。
(4)终止:由不可恢复的知名错误造成的结果,处理程序将返回到内核中的abort例程,终止应用程序。
4,进程的上下文切换(context switch)
内核为每个进程维护了一个上下文。上下文就是内核重新启动一个被抢占进程所需要的状态集:通用寄存器,浮点寄存器,程序计数器,用户栈,状态寄存器,内核栈和各种内核数据结构(比如也表,进程表,文件表等)。内核通过调度器来抢占一个执行的进程:
(1)保护当前进程的上下文
(2)恢复某个先前被抢占进程所保存的上下文
(3)将控制传递给新回复的进程。
以下情况会发生上下文切换:
(1)当内核代表用户执行系统调用时。例如,系统调用因等待某个事件而发生阻塞,那么内核可以让当前进程休眠,切换到另一个进程,比如read请求磁盘访问。
(2)用户程序调用sleep系统调用,显式的让调用进程休眠。
(3)中断可能引发上下文切换。比如所有的系统都有某种产生周期性定时器中断的机制,典型的位1毫秒或10毫秒。每次发生定时器中断时,内核判断当前进程是否已经运行了足够长的时间,并切换到另一个进程。
5,Unix信号
一个信号就是一条消息,它通知进程一个某种类型的时间已经在系统中发生。每种信号都对应某个类型的系统时间。
(1)底层的硬件异常是由内核异常处理程序处理的,对用户进程通常不可见,而信号提供了向用户进程通知这些异常发生的机制。比如:一个进程试图除以0,内核就会发送SIGFPE信号。
(2)其他的信号对应于内核或者其他用户中较高层次的软件事件。比如SIGINT、SIGKILL等。