Kernel之中断处理底半部机制
  gcIluVlGdpHJ 2023年11月15日 17 0


Kernel之中断处理底半部机制
[TOC]

主要记录一些整体的概念、框架和简单介绍,不涉及具体的原理和实现细节

背景
查看系统相关中断:

SHELL
cat /proc/interrupts
中断服务程序要求尽量短小精悍,耗时短。但现实情况是中断到来时,需要完成的工作会比较多,需要进行较大量的耗时处理。于是Linux将中断处理程序分成了2部分:顶半部(Top Half)和底半部(Bottom Half)。但并不一定要分成2个部分, 本来中断要处理的工作比较少,则完全没必要底半部,只需要顶半部就足够了。

顶半部主要用于处理一些尽量少的比较紧急的东西,比如紧急的硬件操作,清除中断标志,记录相应中断信息供底半部使用。
底半部主要处理中断需要处理的绝大部分工作(比较耗时)。可以被新的中断打断,通常顶半部是不可被中断的。

所以这里主要介绍下底半部相关的一些机制:
Linux实现中断底半部的机制主要有tasklet、工作队列(work queue)、软中断(softirq)、中断线程化(threaded_irq)

tasklet:
执行上下文为软中断,执行时机通常是中断顶半部返回时。不允许睡眠。执行快, 短时期, 并且在原子态
主要相关使用伪代码:

C

/* 定义及关联 */
 void xxx_do_tasklet(unsigned long);
 DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);/* 中断处理底半部 */
 void xxx_do_tasklet(unsigned long)
 {
     ...
 }/* 中断处理顶半部, 中断申请时注册的中断处理回调函数*/
 irqreturn_t xxx_interrupt(int irq, void *dev_id)
 {
     ...
     tasklet_schedule(&xxx_tasklet);
     ...
 }


工作队列:

......

作者: Shell

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月15日 0

暂无评论

gcIluVlGdpHJ