我正在准备关于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));
我的问题如下:
.status的分配如何工作?这本书说它是一组旗帜。我得到的标志是大写变量,但在这种情况下如何访问它们?不应该是.status.IRQ_SOMETHING或类似的东西吗?
单曲“&”是什么?在if表达式的条件下意味着什么?
答案 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
位时,会产生真实结果。