linux 中断处理 tasklet workqueue

linux中注册中断历程用request_irq,isr原型为: irqreturn_t *(int irq, void* dev_id, struct pt_reg* regs)

为了使中断关闭的时间尽可能的短,linux提出了中断上半部和下半部。上半部为request_irq注册的ISR,要求时间尽可能的短,而将尽可能的工作推迟到下半部去做。下半部由上半部调度,并在安全的时间内执行,此时中断已经打开了。linux有两种机制可以实现下半部:tasket和workqueue。

 

tasklet为软中断的一种。linux内核有HI_SOFTIRQ, TIMER, NET_TX, NET_RX, BLOCK, TASKLET, SCHED, HRTIMER, RCU 等软中断, 在系统初始化时调用open_softirq注册。在isr中声明tasklet,然后函数tasklet_schedule()调用raise_softirq(TASKLET_IRQ),然后系统在合适的时间调度tasklet运行。

workqueue本质为内核线程。

create_workqueue -> create_workqueue_thread

||                                     |->kthread_create(worker_thread)            // worker_thread 检查work_list,如果非空则依次执行起func

||                                                |->设置kthread_create_list,然后唤醒kthreadd_task(负责检查kthread_create_list,如果非空则调用kernel_thread创建内核线程)

|| -> start_workqueue_thread

           ||-> wake_up_process(kthread_create返回的worker_thread)  //通过设置task->state=RUNNING使得下次可以调度到。

 

schedule_work = queue_work(eventd_wq, work)    // eventd_wq 为系统初始化时创建的workqueue。用户可以用create_workqueue创建自己的workqueue。

 

tasklet中不允许休眠,而workqueue允许。tasklet调用时为中断上下文,workque为进程上下文(仅有内核代码)。

 

linux 中的timer 即采用了中断和softirq的机制实现的。在时钟中断例程 timer_interrupt中调用do_timer_interrupt,更新jiffies,检查进程时间片,设置TIMER_SOFTIRQ并调用timer的软中断(在这里处理与timer有关的tvec_base),最后统计信息。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值