zhongyuan_sh 发表于 2012-10-29 11:01

中断上半部分是否会被打断

众所周知,Linux中断被分为上半部分和下半部分

中断上半部分的处理流程如下:1.硬件中断-->2.do_IRQ-->3.handle_IRQ_event-->4.handler
步骤1至步骤3之间(未进入步骤3),中断是被关闭的,系统无法响应中断,这段时间会造成中断丢失
步骤3至步骤4,其内部处理流程如下:
3.1.如果该中断申请时没有设定 IRQF_DISABLED,则打开中断local_irq_enable_in_hardirq(); 否则中断仍然关闭
3.2.调用具体的中断handler处理中断
3.3关闭中断

现在的疑问是:当中断在3.1中,选择了开中断,当系统有其他中断线的中断产生时(对于同一中断线上的中断,系统会屏蔽掉,避免代码重入,所以不会有问题,中断也不会被打断),会如何处理

ai616818 发表于 2012-11-02 17:54

我也在学习,如果有优先级高的,我觉得是可以中断的。

中断都是一些重要的事件。没有必要禁止其他中断。

ai616818 发表于 2012-11-02 17:58

可能说错了,好像优先级高的中断只能中断优先级低的中断的中断处理程序。
上半部不能被中断。

George_lz 发表于 2012-11-13 21:33

回复 1# zhongyuan_sh


    首先,一般arch,在中断分发之前, 都disable了cpu中断。在2.6.33之前,kernel在handle_IRQ_event中会enale cpu的irq(local_irq_enable_in_hardirq()),这样在接下来的中断处理中(driver 的irq_handler),就可以允许高优先级的中断打断当前的中断处理,就是我们常说的中断嵌套。但是在2.6.34之后, 就将中断嵌套给取消了。原因很简单,中断应该很快处理完(Changelog中的解释)。
   当然,你说的“中断是被关闭的,系统无法响应中断,这段时间会造成中断丢失”这也是不会发生的,虽然禁止了cpu中断,致使在disable中断的时间内无法及时响应中断,但cpu的exception Register中仍会标记下哪个中断发生了,这样,在上一个中断处理完毕后,cpu会立即将刚才的中断发出(当然会有优先级的)。

yezj2004 发表于 2012-11-24 15:17

我惊呆了,好贴啊,很难得的好贴
页: [1]
查看完整版本: 中断上半部分是否会被打断