__do_IRQ函数的说明

时间:2014-06-25 23:07:31

标签: c linux linux-kernel interrupt-handling

我正在准备关于Linux内核如何根据“理解Linux内核ny Bovet& amp; Cesati。封面说它涵盖了2.6版本。但是,我无法弄清楚给定的__do_IRQ()函数应该如何工作。虽然我已经完成了一些(基本的)C编程,但我无法理解一些指令。

    spin_lock(&(irq_desc[irq].lock));
    irq_desc[irq].handler->ack(irq);
    irq_desc[irq].status &= ~(IRQ_REPLAY | IRQ_WAITING);
    irq_desc[irq].status |= IRQ_PENDING;
    if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)) && irq_desc[irq].action){
irq_desc[irq].status |= IRQ_INPROGRESS;
    do{
     irq_desc[irq].status &= ~IRQ_PENDING;
     spin_unlock(&(irq_desc[irq].lock));
     handle_IRQ_event(irq,regs,irq_desc[irq].action);
     spin_lock(&(irq_desc[irq].lock));
   }while (irq_desc[irq].status & IRQ_PENDING);
   irq_desc[irq].status &= ~IRQ_INPROGRESS;
}
   irq_desc[irq].handler->end(irq);
   spin_unlock(&(irq_desc[irq].lock));

我的问题如下:

  1. .status的分配如何工作?这本书说它是一组旗帜。我得到的标志是大写变量,但在这种情况下如何访问它们?不应该是.status.IRQ_SOMETHING或类似的东西吗?

  2. 单曲“&”是什么?在if表达式的条件下意味着什么?

1 个答案:

答案 0 :(得分:0)

我将以相反的顺序回答。

&是"按位AND"操作;就像|是"按位OR"运营商。给定整数变量x,表达式为:

  x |= (1U << n);

n的位x设置为1。相反地​​:

  x &= ~(1U << n);

清除n的位x,将其设为0

鉴于对此运算符的理解,您可以看到.status字段的工作原理 - 它是一个整数字段,并使用上面提到的运算符打开和关闭各种标志。使用&运算符检查标志:

  irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)

IRQ_DISABLED字段中设置IRQ_INPROGRESS.status位时,会产生真实结果。