一、来自硬件层面的异常
硬件的异常可能由多个原因产生。
- 算术溢出,计算发生溢出
- 通过键盘和鼠标给网络发送信息
- 读取文件的请求也是一个异常
异常是软件和硬件组合到一起的处理过程。异常的发生和捕捉由硬件发生,异常的处理由软件来完成。
异常代码(中断向量)—— 异常发生的时候,CPU 检测到了特殊的信号。
特殊信号的分配:
- I/O 发出的信号的异常代码,是由操作系统来分配的
- 加法溢出这样的异常代码,是由硬件来分配的
异常表(中断向量表)
存放的是不同的异常代码对应的异常的程序处理地址。
检测异常,拿到异常,根据异常的代码进行处理
二、异常的分类
- 中断:CPU 外部的设备向 CPU 发送中断的信息。
- 陷阱:程序员主动设置的断点,程序执行到这个陷阱就会中断执行,转而去执行异常处理程序。最常见的陷阱是系统调用(用户态到内核态的切换),打开文件和创建新的进程。
- 故障:故障不是在编写程序的时候刻意设置的。而是在程序运行的时候发生的,也同样需要对应的程序去处理。
(故障 和 中断、陷阱的区别是:处理完故障后,仍然回来处理当前的指令,而中断和陷阱回来处理下一条指令) - 中止:当程序遇到故障无法重新运行,程序自然终止。
- 同步 —— 在程序内部发生的异常:陷阱、故障、终止
- 异步 —— 在程序外部发生的异常:中断
处理流程:保存现场,查询异常代码,异常处理程序调用
三、异常的处理:上下文切换
1、将目前正在执行的指令去压栈。同时将 CPU 内当前运行程序使用的寄存器里的值都压入栈中。
2、陷阱涉及到内核态与用户态的切换,将数据压入到内核栈中,而不是程序栈里。
3、故障这种异常,执行的是当前的指令,而不是下一条指令,因为当前的指令并没有正确执行完成。