在硬件层,硬件检测到事件会触发控制突然转移到异常处理程序。
在操作系统层,内核通过上下文切换,将控制从一个用户进程转移到另一个用户进程。
在应用层,一个进程可以发送信号到另一个进程,而接收者会将控制信号突然转移到他的一个信号处理程序。
一个程序可以通过回避通常的栈规则,并执行其他程序中任意位置的非本地跳转来对错误作出反应。
1)处理程序将控制返回给事件发生时正在执行的当前指令
2)处理程序将控制返回给没有发生异常将会执行的下一条指令
3)处理程序终止被中断的程序
异常在跳转到“异常处理程序”时,是通过一张“异常表”来跳转的,每一种异常都有一个异常号(非负整数),异常表会把不同的异常号关联到不同的异常处理程序,异常表在系统启动时由操作系统初始化。
异常是异常控制流的一种形式,是控制流中的突变,用来响应处理器状态中的某些变化,由硬件和操作系统实现
异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序。系统启动时操作系统分配和初始化一张异常表。
异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号。异常号是到异常表中的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器里。*
在C中通过scanf等IO函数处理IO异常。
Linux系统调用中的功能号n就是异常号n
系统调用是一个特殊的异常处理子程序
异步异常需要/只需要CPU执行异常处理子程序,只需要操作系统处理即可。
浮点除以0产生异常,导致程序终止Abort退出。
浮点数除以0,不产生异常,程序正常执行。 任何数除以0产生异常,导致程序终止Abort退出。 每个进程的地址空间是整个内存空间的一部分