muddog 发表于 2003-12-18 15:38:37

linux的中断处理中,为什么要引入下半部分呢?

对这个概念不太理解?是不是下半部分在执行前的中断处理不能被中断?
而下半部分可以

超级用户 发表于 2003-12-18 16:40:16

一切为了速度。哈哈!

_z_ 发表于 2003-12-18 17:28:55

提高效率
不可中断,但可重入。

muddog 发表于 2003-12-18 17:31:29

3x

erunfan 发表于 2003-12-27 11:37:10

在中断中有一部份是要实时处理的,要不然可能丢失掉----那就是所谓的上半部份
而另一部份可以援缓一下再处理---那就是所谓的下半部份了
:P

skykufo 发表于 2003-12-27 19:41:41

在上半部也不能说不能被中断,看do_irq()(在中断后通过一些汇编语言后就轮到它
执行了)该函数又会调用handle_IRQ_event()里边有:       
if (!(action->flags & SA_INTERRUPT))
                __sti();

        do {
                status |= action->flags;
                action->handler(irq, action->dev_id, regs);//调用驱动
                               //写的中断处理函数
                action = action->next;
        } while (action);
所以如果该中断能被嵌套其它irq线上的中断又可以中断该中断处理。
但这时该类型的中断不能中断本中断处理(在do_irq由这句话:
desc->handler->ack(irq);关了该中断线的中断)。
当然可能在多处理机中其它cpu可以接受该类型第2个中断,然后并发工作,
我没认真看smp,所以我也说不准。
为了让该类型的中断能及时处理还有在不能嵌套中断时其它的中断能处理,
在驱动程序isr中把下半部分(2.4后叫softirq吧,因为tasklet,button half
都是建立在softirq上的)放到队列中,然后isr返回,开一切中断,有下半部分
就执行它,这时下半部分就可以被一切中断中断了。当然下半部分还很复杂,
在不同check point可被执行,本身也有限制
页: [1]
查看完整版本: linux的中断处理中,为什么要引入下半部分呢?