广义的中断:
什么是中断:
所谓中断是指CPU对系统发生的某个事件作出的一种反应,让CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程:CPU在遇到某个事件时,暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。事实上CPU对于中断和异常的具体处理机制本质上是完全一致的
即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
广义的中断包含异步中断和同步中断。同步中断又称为异常(exception),异步中断则被称为中断(interrupt)。我们通常讲的中断指的都是异步中断。
异步中断:
外部中断,就是通常所讲的“中断”(interrupt),狭义中断。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的,但是可以屏蔽掉。
异步中断是指由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能够在指令之间发生,例如键盘中断。
异步中断可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。
类型 | 原因 | 异步/同步 | 返回行为 |
中断 | 来自I/O设备的信号 | 异步 | 总是返回到下一条指令 |
同步中断:
在Intel的手册中,异步中断被称之为异常。
异常可分为故障(fault)、陷阱(trap)、终止(abort)三类。
类型 | 原因 | 异步/同步 | 返回行为 |
陷阱 | 有意的异常 | 同步 | 总是返回到下一条指令 |
故障 | 潜在可恢复的错误 | 同步 | 返回到当前指令 |
终止 | 不可恢复的错误 | 同步 | 不会返回 |
软中断和硬中断:
软中断是通信进程之间用来模拟硬中断的一种信号通信方式。是属于一种编程手段,也有称之为软中断通信机制。
硬中断一般就是指的硬件中断,也就是常说的中断,由硬件触发。
异步中断的例子:
网卡中断:
- 数据到达网卡;
- 网卡产生一个中断给内核;
- 内核使用I/O指令,从网卡I/O区域中去读取数据;
同步中断(异常)的例子:
除零
当系统返现除零时,会抛出异常,如果程序不处理这个异常,那么操作系统将发出一个异步信号终止当前执行的程序。
缺页异常
- 当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。通常一个硬件寄存器包含了这一信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么。
- 一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检查存取与保护是否一致。如果不一致,向进程发出一个信号或杀掉该进程。如果地址有效且没有保护错误发生,系统则检查是否有空闲页框。如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰。
- 一旦页框“干净”后(无论是立刻还是在写回磁盘后),操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。该页面被装入后,产生缺页中断的进程仍然被挂起,并且如果有其他可运行的用户进程,则选择另一个用户进程运行。
- 当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置,页框也被标记为正常状态。此时,CPU恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。
对比:
产生的位置 | 发生的时刻 | 时序 | |
中断 | CPU外部 | 随机 | 异步 |
异常 | CPU内部 | 一条指令终止后 | 同步 |
转载请注明:旅途@KryptosX » Linux的中断和异常扫盲笔记