产生过程

当程序运行时,可能会产生异常,当cpu检测到这些时间发生时,就会通过异常表跳转到异常处理程序,然后进行处理。

异常表示常驻于内存中的,每个异常都有一个异常号,事件发送的是异常号,之后根据异常号找到异常表中的对应项再跳转过去。异常表的首地址存放在一个特殊的寄存器中。

当一场处理结束之后,可能会跳转到下一条语句,可能跳转到当前语句,也可能终止程序。

要注意,这里讲的异常是系统提供的异常,要把用户程序中设定的异常区分开。

类别

中断

中断是用来和外部设备进行交互的,例如网卡,usb和磁盘。

每当这些设备有操作完成时,都会发给cpu一个信号叫cpu去取数据(cpu上有一个特殊的引脚专门去接受这些数据)。之后cpu就会执行中断程序然后去取数据。

一个显著的例子就是scanf,cpu不可能一到scanf就停止运行,肯定还要继续做各种各样的事。他只是调用了scanf函数给标准输入发出信号,有数据来了就告诉我。之后标准输入输入完成之后并不是直接存到内存中,而是先存到一个缓存中(例如键盘有usb缓存),然后告诉cpu要读数据,cpu才会执行中断去读数据。

执行中断程序之前,首先要把所有寄存器的值都保护好,之后才去执行。

陷阱和系统调用

陷阱又叫系统调用。它是一种故意的中断,是执行一条指令的结果。执行完后回到下一条指令。

这是用户向系统请求服务,例如读文件,打开文件,创建文件,终止进程等。

系统提供了syscall n 指令专门用来调用这些功能。当这条指令执行时,会中断当前线程然后跳到内核中执行相应的代码,执行完成之后又会返回。

故障

故障是有可能修复的异常,这种异常执行完成之后会跳转到当前语句再执行一次。

一种典型的故障是缺页异常,缺页异常是虚拟内存的东西(现在还没学,就不瞎比比了)。

终止

终止是不可恢复的错误,通常是硬件错误,例如突然缺少什么信息等等。一般这种异常都会直接调用abort终止程序。