Linux中断研究

研究linux系统,不论是作驱动、协议栈仍是进程调度等等,都离不开中断。这说明,要想编写正确的linux代码,不了解中断是不行的。linux

话说曾几什么时候,在大学的课堂里,老师口若悬河的讲解中断,说中断能够嵌套,说中断有优先级,那么linux操做系统是否是中断嵌套?是否是按优先级嵌套?函数

其实你们应该能够猜到了,并不彻底是的。由于老师讲的是理论,linux是现实,这二者是很难相同的。就像小时候要当科学家,结果长大了发现本身每天在搬砖。spa

如今回到正轨上来,经过下面几个问题的讲解,你们就能够对linux的中断有个总体上的了解。操作系统

硬件平台:x86.net

操做系统版本:linux-2.6.24blog

1.什么时硬中断,什么是软中断?进程

硬中断:是由与系统相连的外设(好比:网卡、硬盘)自动产生的。主要是用来通知操做系统外设状态的变化。好比当网卡收到数据包的时候,就会发出一个中断。get

软中断:咱们知道,为了知足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特色,当中断发生的时候,硬中断处理那些短期就能够完成的工做,而将那些处理时间比较长的工做,放到中断以后来完成,也就是软中断中来完成。it

2.不一样的硬中断是否能够嵌套?相同的硬中断是否能够嵌套,以及是否按优先级嵌套?硬中断最多可能嵌套几级?event

Linux下硬中断是能够嵌套的,可是没有优先级的概念,也就是说任何一个新的中断均可以打断正在执行的中断,可是同种中断不会打断同种中断的执行。

可是并非全部的中断都是能够被打断的,这须要看注册的中断函数是否设置了IRQF_DISABLED,若是设置了IRQF_DISABLED,那么硬中断处理的时候是不容许被打断的,不然是容许被打断的。Peter Zijlstra在2009.3的一个讨论中关于IRQF_DISABLED的使用问题(详见http://lwn.net/Articles/321663/)。


从代码的角度上来讲中断嵌套发生的位置:

硬件中断-->do_IRQ-->handle_IRQ_event-->handler。 在硬件中断到handle_event_irq之间,因为发生中断的时候CPU会自动屏蔽中断,因此在这中间是不会发生中断嵌套的,可是在handle_event_irq中,可能会从新开启中断,也就是说在handler中是能够发生中断嵌套的。

同种中断不会嵌套的实现:

linux经过一个标志位IRQ_INPROGRESS来实现。当中断类型A的一个中断A1处理的时候,linux会在do_IRQ中,handle_IRQ_event以前,置位A类型中断的IRQ_INPROGRESS位。当A1中断在handle_IRQ_event中被同种类型的中断A2到达,会调用do_IRQ,而后发现A类型中断的IRQ_INPROGRESS,就会置位IRQ_PENDING后返回,不会嵌套执行。

因为同种类型的中断不会嵌套,因此最多可能的嵌套级数,就是未设置IRQF_DISABLED中断类型的个数。(是否还有其余的限制,没有详细的研究)

3.不一样的软中断是否能够嵌套?相同的软中断是否能够嵌套?

软中断的调用是经过do_softirq()来激活的。

同种类型的软中断,不能够嵌套执行。可是不一样的CPU上,能够同时运行相同类型的软中断。

4.软中断在什么时间点被调度?

(1)内核显示的容许软中断的时候 local_bh_enable

(2)irq_exit()的时候

(3)ksoftirqd进程被唤醒的时候

(4)其余可能的地方(这里没有详细的追究)

原文:http://blog717171.blog.163.com/blog/static/2506031112015101511126920/

相关文章
相关标签/搜索