主题 : 请教Linux中断的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 63550
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2012-02-21
最后登录: 2012-02-22
楼主  发表于: 2012-02-21 15:59

 请教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中断禁止?
咕唧咕唧
级别: 侠客
UID: 30422
精华: 1
发帖: 114
金钱: 620 两
威望: 124 点
综合积分: 248 分
注册时间: 2010-10-16
最后登录: 2016-05-27
1楼  发表于: 2012-02-21 23:59
linux进入中断时候,是不是默认CPU中断禁止?
可以那么理解,但是linux中断处理例程分顶部和底部中断,顶部中断处理例程中是必须要禁用本地中断的,但是底部中断处理例程不用禁用本地中断。
do_irq 会调用 __do_irq 而__do_irq 时实际上已经禁止本地(当前CPU的)中断运行了。
另外linux中断还分独占中断和共享中断,独占中断的中断处理例程是需要禁用irq的,但是共享中断的处理例程执行时,就要enable irq。
用if (!(action->flags & IRQF_DISABLED))来判断当前中断是否为共享中断,如果是,则enable irq。如果是独占中断,则不会重新激活中断。完成handle_IRQ_event中的主要工作(ISR)后返回__do_irq 函数前要重新禁止本地中断。
级别: 新手上路
UID: 63550
精华: 0
发帖: 2
金钱: 10 两
威望: 2 点
综合积分: 4 分
注册时间: 2012-02-21
最后登录: 2012-02-22
2楼  发表于: 2012-02-22 14:08
  你好,退出中断时候禁止CPU中断,那么下一次发生的中断不是会丢失?
咕唧咕唧
级别: 侠客
UID: 30422
精华: 1
发帖: 114
金钱: 620 两
威望: 124 点
综合积分: 248 分
注册时间: 2010-10-16
最后登录: 2016-05-27
3楼  发表于: 2012-02-22 20:10

 回 2楼(chen_youlian) 的帖子

你把do_irq函数看完整了,就知道答案了,handle_IRQ_event只是它的中间环节