首页 > 代码库 > linux中断

linux中断

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

文章主要参考《深入分析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

    中断号上是用来标识不同的中断,不同的中断号对应不同的中断处理程序。那么如何通过中断号去查找中断程序的入口,那就要需要一个表,而这个表就是中断向量。通过中断号,在中断向量中获取指定的中断程序入口。而有时又会遇到另一个与中断向量很相似的词,就是中断描述符表(IDT)。这两者有相似之处但不同。

    在linux系统启动的时候,最初是运行在实模式下,这时系统就会进行第一遍初始化IDT,但IDT中每个中断程序的入口都一个空的中断程序。而当系统完成启用分页后,就会再一次初始化IDT,此时就会在IDT中填入真正的中断程序入口。IDT中不仅包含了中断程序的入口,而且还包含了一些中断的相关描述,如这个中断是中断门、陷阱门或是系统门。其中 0-19 号和 0x80 号这21个中断号是系统使用的,IDT中这些中断都被系统初始化,而其他的中断号则是另外的初始化,在初始化这些IDT项时,就需要填入中断程序的地址。而这些中断程序的地址,实际上就是中断向量。换句话说,中断向量中保存的是某些中断程序的入口地址,而这些中断程序地址会被填充到IDT表中,这样IDT就保留了中断处理程序的入口,同时IDT还包括了一些关于中断的描述。

(注:《深入分析linux内核源码》中关于中断向量的定义与我们平时所说的中断向量不同,本文的中断向量取义为平时所说的中断向量,即中断程序入口所组成的数组)














本文出自 “chhquan” 博客,请务必保留此出处http://chhquan.blog.51cto.com/1346841/1588526

linux中断