7.1 中断是什么,为什么要有中断
在 Linux 中文件 “/proc/进程pid/stat” 第一行的第 39 个字段是 “processor id”,它表示进程本次执行时最后所在的 CPU 编号。还可以用命令 ps -eo pid, args, psr | grep <pid>
。
7.2 操作系统是中断驱动的
7.3 中断分类
把中断按事件来源分类,来自 CPU 外部的中断就称为外部中断,来自 CPU 内部的中断称为内部中断。
外部中断按是否导致宕机来划分,可分为可屏蔽中断和不可屏蔽中断两种。
内部中断按是否正常来划分,可分为软中断和异常。
7.3.1 外部中断
外部中断的中断源是硬件。
外部硬件的中断通过两根信号线通知 CPU 的,分别是 INTR(INTeRrupt)和NMI(Non Maskable Interrupt)。
可屏蔽中断通过 INTR 引脚进入 CPU,外部设备如硬盘、网卡等发出的中断都是可屏蔽中断。
中断上半部和下半部:
操作系统是中断驱动的,中断发生后会执行相应的中断处理程序,我们希望 CPU 中断响应的时间越短越好,这样便能响应更多设备的中断。于是,把中断处理程序分为上半部和下半部两部分,把中断处理程序中需要立即执行的部分划分到上半部,完成中断应答或硬件复位等重要紧迫工作。中断处理程序中不紧急的部分则被推迟到下半部中去完成。上半部是在关中断的情况下执行。
中断发起时,相应的中断向量号通过 NMI 或 INTR 引脚被传入 CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU 根据此中断向量号在中断向量表或中断描述符表中检索对应的中断处理程序并去执行。
不可屏蔽中断的中断向量号为 2。
7.3.2 内部中断
内部中断可分为软中断和异常。
软中断就是由硬件主动发起的中断,因为它来自于软件,所以称之为软中断。
发起中断的指令:
- int 8位立即数。
- int3。调试断点指令,其所触发的中断向量号是 3。我们用 gdb 或 bochs 调试程序时,实际上就是调试器 fork 了一个子进程,用于执行被调试的程序。调试器中经常要设置断点,其原理就是父进程修改了子进程的指令,将其用 int3 指令替换,从而子进程调用 int3 触发中断。
- into。中断溢出指令,中断向量号是 4。
- bound。检查数组索引越界指令&