异常
1. 异常
这里说的异常不是通常所说的软件编程中的"异常处理",而是指令流的一种突变,用来响应系统中的某些变化。异常是由硬件和操作系统共同实现的,处理器执行当前指令时,处理器检测到系统发生了某个事件,便调用异常处理程序来处理这个事件,如下图所示:
异常处理之后,有三种可能:
终止程序指令流的执行;
返回到被中断的指令继续执行(当前指令);
返回到下一条指令继续执行;
2. 异常表
操作系统会分配和初始化一张异常表,异常表中的条目指出异常处理程序的地址,每个异常都有一个异常号,即在异常表中的索引。异常表的起始地址保存在异常表基址寄存器中。
3. 异常的分类
异常可以分为四种类型:中断、陷阱、故障、终止。
(1)中断
中断是来自CPU外部I/O设备的信号,例如:磁盘I/O中断、定时器中断等。中断对应的异常处理程序叫做中断处理程序,中断返回后会执行指令流中的下一条指令。
(2)陷阱
陷阱是一种有意为之的异常,是执行当前指令的结果,陷阱用来实现系统内核和用户程序之间的一个过程调用的接口,即系统调用。陷阱返回后也是执行指令流中的下一条指令。
Linux系统提供了多种系统调用,如:结束进程、读写文件等。
(3)故障
故障是执行当前指令时遇到了错误,当故障发生时,转到故障处理程序执行,执行完后,可能返回到被中断的原指令继续执行(例如:缺页异常),也有可能故障不可恢复而直接终止(例如:段错误)。
(4)终止
终止是执行当前指令时遇到了不可恢复的致命错误,通常是硬件错误,程序直接终止。
4. 上下文切换
操作系统内核使用上下文切换机制来实现多个任务的并发执行,操作系统通过上下文切换机制将控制流转移到新的进程,上下文切换建立在前述的基本异常基础之上。
上下文切换通常包括三个步骤:
(1)保存当前进程的上下文
(2)恢复下面要执行的进程的(之前被抢占的进程)上下文
(3)将控制转移到下面要执行的进程
5. 信号
信号是一种高层的软件形式的异常,信号通常用于进程间的通信。
(1)发送信号
内核通过更新进程上下文中的某个状态来发送一个信号给目的进程。
(2)接收信号
目的进程对信号作出反应就表示接收了该信号,目的进程可以执行信号处理程序(用户层函数)来处理信号或者简单的忽略该信号
目的进程正在执行某个信号处理程序时,收到另一个信号,则该信号便成为待处理信号。对于每种类型,至多只允许有一个待处理信号,已经有一个待处理信号之后,同一个类型后来的信号将被丢弃。
参考资料 《深入理解计算机系统》