Linux的中断和异常扫盲笔记

广义的中断:

什么是中断:

所谓中断是指CPU对系统发生的某个事件作出的一种反应,让CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程:CPU在遇到某个事件时,暂停正在执行的程序,保留现场后自动地转去执行相应的处理程序,处理完该事件后再返回断点继续执行被“打断”的程序。事实上CPU对于中断和异常的具体处理机制本质上是完全一致的

即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。

广义的中断包含异步中断同步中断。同步中断又称为异常(exception),异步中断则被称为中断(interrupt)。我们通常讲的中断指的都是异步中断。

异步中断:

外部中断,就是通常所讲的“中断”(interrupt),狭义中断。对于执行程序来说,这种“中断”的发生完全是异步的,因为不知道什么时候会发生。CPU对其的响应也完全是被动的,但是可以屏蔽掉

异步中断是指由其他硬件设备依照 CPU 时钟信号随机产生,即意味着中断能够在指令之间发生,例如键盘中断。

异步中断可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。

类型 原因 异步/同步 返回行为
中断 来自I/O设备的信号 异步 总是返回到下一条指令

同步中断:

在Intel的手册中,异步中断被称之为异常。

异常可分为故障(fault)、陷阱(trap)、终止(abort)三类。

类型 原因 异步/同步 返回行为
陷阱 有意的异常 同步 总是返回到下一条指令
故障 潜在可恢复的错误 同步 返回到当前指令
终止 不可恢复的错误 同步 不会返回

软中断和硬中断:

软中断是通信进程之间用来模拟硬中断的一种信号通信方式。是属于一种编程手段,也有称之为软中断通信机制。

硬中断一般就是指的硬件中断,也就是常说的中断,由硬件触发。

异步中断的例子:

网卡中断:

  1. 数据到达网卡;
  2. 网卡产生一个中断给内核;
  3. 内核使用I/O指令,从网卡I/O区域中去读取数据;

同步中断(异常)的例子:

除零

当系统返现除零时,会抛出异常,如果程序不处理这个异常,那么操作系统将发出一个异步信号终止当前执行的程序。

缺页异常

  1. 当操作系统发现一个缺页中断时,尝试发现需要哪个虚拟页面。通常一个硬件寄存器包含了这一信息,如果没有的话,操作系统必须检索程序计数器,取出这条指令,用软件分析这条指令,看看它在缺页中断时正在做什么。
  2. 一旦知道了发生缺页中断的虚拟地址,操作系统检查这个地址是否有效,并检查存取与保护是否一致。如果不一致,向进程发出一个信号或杀掉该进程。如果地址有效且没有保护错误发生,系统则检查是否有空闲页框。如果没有空闲页框,执行页面置换算法寻找一个页面来淘汰。
  3. 一旦页框“干净”后(无论是立刻还是在写回磁盘后),操作系统查找所需页面在磁盘上的地址,通过磁盘操作将其装入。该页面被装入后,产生缺页中断的进程仍然被挂起,并且如果有其他可运行的用户进程,则选择另一个用户进程运行。
  4. 当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映它的位置,页框也被标记为正常状态。此时,CPU恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。

对比:

产生的位置 发生的时刻 时序
中断 CPU外部 随机 异步
异常 CPU内部 一条指令终止后 同步

转载请注明:旅途@KryptosX » Linux的中断和异常扫盲笔记

上一篇:mysqldump简单用法


下一篇:TCP/IP协议资料图整理