关于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中断禁止? 因为中断处理例程ISR归设备驱动程序管,属于非内核可控范围。本来CPU接收到外部中断时,会自动屏蔽外部中断的,但是ISR中有人可能试图打开中断,可能会造成中断嵌套等问题。所以内核在ISR处理完之后再用local_irq_disable把中断给关了,直到进入softirq阶段,才会再次打开中断。具体的你到我CU博客里看看有关帖子...
回复 2# MagicBoy2010
开中断关中断有一定原则:在实时系统里,为了增加系统响应速度,尽早开放中断。我们自己在设计中断处理程序时, 基本上一条一条汇编指令地扣,只要开中断后,不影响中断子程序的运行,能正确地回到被中断的程序,就尽量缩小关中断的window; linux这么做有点草率。
多谢,楼上兄弟们的指教。明白了。谢谢
页:
[1]