jlinkv8 发表于 2012-02-21 15:55

关于Linux中断的问题

asm_do_irq==>hanle_level_irq==>handle_IRQ_event中断处理函数:
irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
{
irqreturn_t ret, retval = IRQ_NONE;
unsigned int status = 0;

handle_dynamic_tick(action);

if (!(action->flags & IRQF_DISABLED))
local_irq_enable_in_hardirq();

do {
ret = action->handler(irq, action->dev_id);
if (ret == IRQ_HANDLED)
   status |= action->flags;
retval |= ret;
action = action->next;
} while (action);

if (status & IRQF_SAMPLE_RANDOM)
add_interrupt_randomness(irq);
local_irq_disable();   //关全局中断

return retval;
}
这里local_irq_disable(),为什么在退出中断时候还需要关闭CPU中断?
linux进入中断时候,是不是默认CPU中断禁止?

MagicBoy2010 发表于 2012-02-26 19:55

因为中断处理例程ISR归设备驱动程序管,属于非内核可控范围。本来CPU接收到外部中断时,会自动屏蔽外部中断的,但是ISR中有人可能试图打开中断,可能会造成中断嵌套等问题。所以内核在ISR处理完之后再用local_irq_disable把中断给关了,直到进入softirq阶段,才会再次打开中断。具体的你到我CU博客里看看有关帖子...

linuxfellow 发表于 2012-03-02 11:41

回复 2# MagicBoy2010
开中断关中断有一定原则:在实时系统里,为了增加系统响应速度,尽早开放中断。我们自己在设计中断处理程序时, 基本上一条一条汇编指令地扣,只要开中断后,不影响中断子程序的运行,能正确地回到被中断的程序,就尽量缩小关中断的window; linux这么做有点草率。

   

jlinkv8 发表于 2012-03-27 10:58

多谢,楼上兄弟们的指教。明白了。谢谢
页: [1]
查看完整版本: 关于Linux中断的问题