1.异常处理
系统中可能的每种异常均有对应的代号。
系统启动时,操作系统分配和初始化一张称为异常表的跳转表,使得条目k包含异常k的处理程序的地址。
异常表的起始地址放在一个叫做异常表址寄存器的特殊寄存器中。
异常类似与过程调用,但是有一些不同的地方。
1.根据异常的类型,处理器记录的返回地址可能是当前指令,也可能是下一条指令的。
2.处理器也会把一些额外的处理器状态压到栈里,因为重新开始被中断的程序需要这些状态。比如IA32系统会将当前条件码和其他的EFLAGS寄存器压入栈中。
3.如果控制从一个用户程序转移到内核,所有这些项目都被压到内核栈中,而不是用户栈。
4.异常处理程序运行在内核模式下,对所有的系统资源都有完全的访问权限。
2.异常的类别
类别 原因 异步/同步 返回行为
中断 来自I/O设备的信号 异步 总是返回到下一条指令
陷阱 有意的异常 同步 总是返回到下一条指令
故障 潜在可恢复的错误 同步 可能返回到当前指令
终止 不可恢复的错误 同步 不会返回
1. 中断(interrupt)
中断是来自处理器外部的I/O设备的信号的结果。硬件中断不是由任何一条专门指令造成的,从这个意义意义上说它是异步的。
例如,网络适配器,磁盘控制器和定时器芯片,通过向处理器芯片的一个引脚发送信号,并将异常号放在系统总线上,以出发中断。
当前指令完成执行后,处理器注意到中断引脚的电压变高了,就从系统总线读取异常号,然后调用适当的中断处理程序。当处理程序返回时,理应将控制返回给下一条指令。
2.陷阱和系统调用(trap)
陷阱是有用的异常,是执行一条指令的结果。陷阱最重要的一个用途是在用户程序和内核之间提供一个向过程一样的接口,叫做系统调用。
普通的函数是在用户模式下,用户模式限制了函数可以执行的指令的类型,而且它们只能访问与调用函数相同的栈。
系统调用运行在内核模式中,内核模式允许访问定义在内核中的栈。
3.故障(fault)
故障是由错误情况引起的,它可能能被股故障处理程序修正。
如果能够修正,将返回到引起故障的指令,从而重新执行它。否则,处理程序返回到内核中abort例程,它会终止引起故障的应用程序。
经典的故障是缺页异常,当指令引用一个虚拟地址,而与该地址相对应的物理页面不在存储器中,就必须从磁盘中取出时,就会发生故障。缺页处理程序从磁盘加载适当的页面,然后将故障返回给引起故障指令。
4.终止(abort)
终止是不可恢复的致命错误的结果。通常是一些硬件错误,如DRAM或者SRAM位被损坏时发生的及偶错误。
终止处理程序从不将控制返回给应用程序。