文章主要是本人的认识,介绍也不全面,则重于流程,用词方面也不讲究,很多观点也比较粗糙,有错误的地方,请多多指正。

文章主要参考《深入分析linux内核源码》关于中断的章节:http://oss.org.cn/kernel-book/


中断是计算机系统的一种机制,主要有两种作用:

  1. 实现异步。

  2. 紧急处理某一过程。


    由于CPU与外设的运行速率相差较大,且CPU资源比较重要,如果采用同步的方式让CPU与外设进行通信,则当外设在工作时,CPU就要等待外设完成工作并返回结果时,CPU才能断续运行,这段时间就会让CPU资源白白浪费。为了能够释放CPU资源,外设与CPU之间就要采用异步的通信方式。CPU可以每隔一段时间去访问设备来检测设备是否已完成工作,但这样的方式也会有一些问题,如CPU响应外设不及时,轮询浪费CPU资源,轮询未得到结果后要再次轮询等。为了更好地利用CPU资源,需要采取一种设备完成工作后能通知CPU,CPU能尽快响应通知的机制。而这种机制就是中断了。


    中断可以分为硬中断和软中断。

    硬中断是指由硬件产生的中断,如硬盘数据与准备就绪请求读入内存,或进程时间片用完产生中断等。

    软件中断是指由程序(软件)产生的中断,或是由中断指令产生的中断,如出现除0等。


    中断又可以分为可屏蔽中断和不可屏蔽中断,顾名思义,可屏蔽中断是可以被屏蔽,而不可屏蔽中断是不可屏蔽的,如电源掉电。


    程序的指令中会设有中断检查点,当执行至中断检查点时,CPU就会去检查是否有中断到来,如果有中断到来,并且程序没有屏蔽此中断或是此中断不可屏蔽时,系统进会进行中断处理。


    中断处理过程粗略可分为三个过程:保护现场,执行中断例程,恢复现场

    而更详细的过程则如下

----------------------------------

关中断

保存断点,保护现场

判断中断源,转中断服务程序

开中断

执行中断处理程序

关中断

恢复现场,恢复断点

开中断

----------------------------------

其中有两个关中断开中断的过程,是因为这两个过程内的操作是不允许被中断的,如果被中断,就有可能导致中断恢复失败。


中断号:0-255(中断和异常)

    中断号上是用来标识不同的中断,不同的中断号对应不同的中断处理程序。那么如何通过中断号去查找中断程序的入口,那就要需要一个表,而这个表计算机组成原理中称之为中断向量,是保存中断服务程序入口的数组。而在linux中,关于这些名称可能会有所不同。linux中把中断号叫做中断向量,把中断服务程序入口地址表称之为中断描述符表(IDT)。下面采用的是linux的叫法。

    在linux系统启动的时候,最初是运行在实模式下,这时系统就会进行第一遍初始化IDT,但IDT中每个中断程序的入口都是一个空的中断程序。而当系统完成启用分页后,就会再一次初始化IDT,此时就会在IDT中填入真正的中断程序入口。IDT中不仅包含了中断程序的入口,而且还包含了一些中断的相关描述,如这个中断是中断门、陷阱门或是系统门。其中 0-19 号和 0x80 号这21个中断号是系统使用的,IDT中这些中断都被系统初始化,而其他的中断号则是另外的初始化,在初始化这些IDT项时,就需要填入中断程序的地址。而这些中断程序的地址,来自于一个中断程序入口的数组。