您的位置:首页 > 运维架构 > Linux

理解linux的中断模型

2012-06-25 15:00 363 查看
在描述linux的中断机制前,先从整体上来了解下linux的中断模型是很有必要的,理解了这个基本的模型,就有了个大概的思路,我们甚至可以去猜测我们后面可能会遇到哪些代码。

一些低档单片机(如51,avr等)的中断固化程序很高,所有外设的中断向量基本都是固定的,在这些单片机上开发时,我们一般只需在这些中断向量处放上我们的中断处理程序就可以了,当某个外设发生中断后,CPU会自动跳转到该外设对应的中断向量处执行,这样中断处理的实时性相对来说是比较好的。

而在S3C2440控制器中,所有的外部中断经过中断控制器的处理,最后只有一个中断会达到INTPND申请IRQ中断,或者产生一个FIQ中断,而我们的S3C2440控制器的CPU也即ARM920T只有7个中断,硬件中断向量也就只有7个(除了有一个保留未用的)。



如果是开发S3C2440的裸机程序(当然这很少见),我们的处理方式是在IRQ的中断向量处放一个跳转指令,然后跳转到一个中断服务程序,在这个中断服务程序里,我们查看中断寄存器,判断是哪个外设产生了中断,然后进行相应的处理。实际上,这样的处理方式,实时性是不好的,当然我们既然采用了linux,我们不能对系统的实时性期望太高,毕竟她不是实时操作系统。

当才S3C2440上运行了linux后,中断是如何处理的呢?

到这里,就需要引入linux的中断处理模型了,通过这个模型来大概理解linux的中断机制,然后在深入到代码细节里去。

我们要弄清楚,当一个IRQ产生时,会发生什么。

当一个IRQ产生后,CPU会首先自动跳转到IRQ的中断向量(这个中断向量是可设置的),在这个IRQ中断向量里又是一个跳转指令,CPU再次跳转,跳转后的代码主要完成的工作是保存一些寄存器,然后读取中断寄存器经过计算(这个计算并不是单纯的跟INTPND对应)得到中断号,然后跳转到一个中断处理的通用函数,并把中断号传过去(汇编向C传参数)。

在这个通用处理函数里,根据中断号找到我们自己设定的中断处理函数,然后执行。

我们注意到,最后一步linux会去找我们自己设定的中断处理函数,这个函数是我们事先通过注册来挂接在一个结构数组(这个数组里的元素个数即为中断号的个数)上,linux会去遍历这个数组(如果使用到了共享中断,即一个中断号上注册多个中断服务程序,则每个中断服务程序都会被执行到)。

可以用图简单描叙如下:



所有从上面的描述可以看出,linux的中断机制可以分为两头,一头是当中断发生时,linux如何自动跳转并找出中断号然后根据中断号来找到注册在该中断号上的中断处理函数并执行;

另一头是我们自己定义的中断处理函数是如何注册到linux系统的。

这里介绍了linux的中断机制模型,大概知道了中断发生后linux会做些什么,后面将从两个方面来详细说明这个机制,

第一个方面是,我们自己定义的中断处理函数是如何注册到系统中断去的(必须要进行注册,linux才能找到并执行;

另一个方面是,中断发生时,linux具体会做些什么进而找到我们注册的函数并执行。

注:本内容为本人原创,仅仅为了及时总结知识点以免忘记,所以内容不保证完全正确,如有不同意见,欢迎指正,以使我的及时纠正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: