Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3883240
  • 博文数量: 93
  • 博客积分: 3189
  • 博客等级: 中校
  • 技术积分: 4229
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-02 13:29
个人简介

出没于杭州和青岛的程序猿一枚,对内核略懂一二

文章分类

全部博文(93)

文章存档

2016年(2)

2015年(3)

2014年(11)

2013年(29)

2012年(16)

2011年(5)

2010年(5)

2009年(22)

分类: LINUX

2011-11-19 15:54:37

研究linux系统,不管是做驱动、协议栈还是进程调度等等,都离不开中断。这说明,要想编写正确的linux代码,不了解中断是不行的。
话说曾几何时,在大学的课堂里,老师滔滔不绝的讲解中断,说中断可以嵌套,说中断有优先级,那么linux操作系统是不是中断嵌套?是不是按优先级嵌套?
其实大家应该可以猜到了,并不完全是的。因为老师讲的是理论,linux是现实,这两者是很难相同的。就像小时候要当科学家,结果长大了发现自己天天在搬砖。
现在回到正轨上来,通过下面几个问题的讲解,大家就可以对linux的中断有个整体上的了解。
硬件平台:x86
操作系统版本:linux-2.6.24
1.什么时硬中断,什么是软中断?
硬中断:是由与系统相连的外设(比如:网卡、硬盘)自动产生的。主要是用来通知操作系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。
软中断:我们知道,为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理时间比较长的工作,放到中断之后来完成,也就是软中断中来完成。
2.不同的硬中断是否可以嵌套?相同的硬中断是否可以嵌套,以及是否按优先级嵌套?硬中断最多可能嵌套几级?
Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但是同种中断不会打断同种中断的执行。
但是并不是所有的中断都是可以被打断的,这需要看注册的中断函数是否设置了IRQF_DISABLED,如果设置了IRQF_DISABLED,那么硬中断处理的时候是不允许被打断的,否则是允许被打断的。Peter Zijlstra在2009.3的一个讨论中关于IRQF_DISABLED的使用问题(详见)。

从代码的角度上来说中断嵌套发生的位置:
硬件中断-->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)其他可能的地方(这里没有详细的追究)
阅读(9667) | 评论(3) | 转发(22) |
给主人留下些什么吧!~~

镇水铁牛2014-11-21 22:01:50

在handle_IRQ_event中,如果进来的第一个中断flag是RQF_DISABLED的话,在回调执行结束后,还又执行一次local_irq_disable,有问题么?

todaygood2011-12-18 16:34:19

的确是研究了!

十七岁的回忆2011-11-23 00:29:56

恩,挺不错的