异常和中断的区别
- 中断
- 异常
- 中断和异常的相同点
- 中断和异常的区别
中断
中断是由硬件设备产生的,而它们从物理上说就是电信号,之后,它们通过中断控制器发送给CPU,接着CPU判断收到的中断来自于哪个硬件设备(这定义在内核中),最后,由CPU发送给内核,有内核处理中断。下面这张图显示了中断处理的流程:
异常
异常包括很多方面,有出错,有陷入,也有可编程异常。
- 出错保存的EIP指向触发异常的那条指令。因此,当从异常返回时,出错会重新执行那条指令,如我们熟悉的缺页异常,由于是fault,所以当缺页异常处理完成之后,还会去尝试重新执行那条触发异常的指令。
- 陷入保存的EIP指向触发异常的那条指令的下一条指令,陷入不会重新执行因为异常的指令。陷入的最主要的应用是在调试中,被调试的进程遇到你设置的断点,会停下来等待你的处理,等到你让其重新执行了,它当然不会再去执行已经执行过的断点指令。
- 可编程中断:这类中断可由编程者用int指令来触发。在Linux中,使用了一个,也是唯一的一个可编程中断,就是int 0x80 系统调用。硬件对可编程中断的处理与对trap的处理类似,即从这类异常返回时也是返回到触发异常的下一条指令。
异常是由CPU产生的,同时,它会发送给内核,要求内核处理这些异常,下面这张图显示了异常处理的流程:
中断和异常的相同点
- 最后都是由CPU发送给内核,由内核去处理。
- 处理程序的流程设计上是相似的。
中断和异常的区别
- 产生源不相同,异常是由CPU产生的,而中断是由硬件设备产生的。
- 中断是异步的,这意味着中断可能随时到来;而异常是CPU产生的,所以,它是时钟同步的。
- 当处理中断时,处于中断上下文中;处理异常时,处于进程上下文中。