softirq机制

对于中断处理而言,linux将其分成了两个部分, 一个叫做中断handler(top half), 是全程关闭中断的, 主要处理中断的一些实时性任务, 另外一部分是deferable task(bottom half), 处理不那么紧急需要处理的事情。在执行bottom half的时候,是开中断的。bottom half的机制主要有softirq, tasklet和workqueue, 这三者有本质的区别:workqueue运行在process context,而softirq和tasklet运行在interrupt context.

softirq和hardirq是相对应的一个概念, 因此可以依据hardirq的机制来理解softirq, 不过softirq是一个纯软件的概念, 不需要任何硬件来参与, 故而没有和硬件相关的一些概念.比如hwirq id, irq_chip等等.

1.softirq number

softirq number是和hard irq中逻辑中断号相对应的一个概念, 用来标示一个softirq. 具体的softirq number定义如下:

路径: include/linux/interrupt.h
enum
{
        HI_SOFTIRQ=0,
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        IRQ_POLL_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ, /* Unused, but kept as tools rely on the
                            numbering. Sigh! */
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

        NR_SOFTIRQS
};

softirq number是静态分配的, 这一点和hardirq 逻辑中断号的动态映射不同.

  • HI_SOFTIRQ 用于高优先级的tasklet.
  • TIMER_SOFTIRQ 用于software timer.
  • TASKLET_SOFTIRQ 用于低优先级的tasklet.

2.what is softirq desc

和hardirq一样, softirq也存在软中断描述符.相对于hardirq desc, softirq desc相当简单, 只有一个callback 函数. 具体如下:

路径: include/linux/interrupt.h
struct softirq_action
{
        void    (*action)(struct softirq_action *);
};

路径: kernel/softirq.c
static struct softirq_action softirq_vec[NR_SOFTIRQS] __cacheline_aligned_in_smp;

内核为每一个softirq定义了一个softirq_action结构, 用一个静态分配的结构体结构体数组softirq_vec来表示, 实现了softirq number和softirq desc的关联. 如果触发了某个softirq就调用相应的callback函数.

3.what is softirq register

由于softirq是一个纯软件的概念, 当触发了一个softirq时, 也需要一个"register"来记录该事件发生了, 以便在将来的某个时候可以调用某个处理函数. 在

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值