关于异常

来源:互联网 发布:汽车can网络是什么 编辑:程序博客网 时间:2024/05/20 16:10

异常控制流(ECF):是计算机系统中实现并发的基本机制。

应用程序通过使用一个叫做陷阱(trap)或者系统调用(system call)的ECF形式,向操作系统请求服务。

异常(exception):是异常控制流的 一种形式,它一部分是由硬件实现的,一部分是由操作系统实现的。异常就是控制流中的突变,用来响应处理器状态中的某些变化。

在任何情况下,当处理器检测到有事件(状态变化)发生时,它就会通过一张叫做异常表的跳转表,进行一个间接过程调用(异常)到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序)。

当异常处理程序完成处理后,根据引起异常的事件的类型,会引起以下三种情况中的一种:

(1)处理程序将控制返回给当前指令,即当事件发生时正在执行的指令

(2)处理程序将控制返回给如果没有发生异常将会执行的下一条指令

(3)处理程序终止被中断的程序


系统中为可能的每种类型的异常都分配了一个唯一的非负整数的异常号。

一些是由处理器的设计者分配的,包括被零除、缺页、存储器访问违例、断点以及算数溢出。其他号码是由操作系统内核(操作系统常驻存储器的部分)的设计者分配的,包括系统调用和来自外部I/O设备的信号。


异常号是异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里。

异常类似于过程调用,但是有一些重要的不同之处:

1)过程调用时,在跳转到处理程序之前,处理器将返回地址压入栈中。然而,根据异常的类型,返回地址要么是当前指令(当事件发生时正在执行的指令),要么是下一条指令(如果事件不发生,将会在当前指令后执行后的指令)。

2)处理器也把一些额外的处理器状态压到栈里,在处理程序返回时,重新开始被中断的程序会需要这些状态。

3)如果控制从一个用户程序转移到内核,那么所有这些项目都被压到内核栈中,而不是压到用户栈中。

4)异常处理程序运行在内核模式下,这意味着它们对所有的系统资源都有完全的访问权限。



异常可以分为四类:中断、陷阱、故障和终止。


1.硬件中断不是由任何一条专门的指令造成的,从这个意义上来说它是异步的。硬件中断的异常处理程序通常称为中断处理程序。(处理外部中断时,应该由操作系统保存通用寄存器的内容)

2.陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫系统调用。

3.故障:根据故障是否能够被修复,要么重新执行引起故障的指令,要么终止(处理程序返回到内核中的abort例程,abort例程会终止引起故障的应用程序)。

一个经典的故障示例是缺页异常,当指令引用到一个虚拟地址,而与该地址对应的物理页面不在存储器中,因此必须从磁盘中取出时,就会发生故障(一个页面就是虚拟存储器的一个连续的块,典型的是4KB)。缺页处理程序从磁盘加载适当的页面,然后将控制返回给引起故障的指令。当指令再次执行时,相应的物理页面已经驻留在存储器中了,指令就可以没有故障地运行了。

4.终止是不可恢复的致命错误造成的后果,通常是一些硬件错误,比如DRAM或者SRAM位被损坏时发生的奇偶错误。终止处理程序从不将控制返回给应用程序。

0 0