• 软中断和tasklet介绍


    今天看了下tasklet,重点分析了其和软中断的关系,特此记录


    关于软中断,在之前的中断文章中已经有所介绍,这里就不多说了,只是说明下,系统中默认支持32种软中断,而实际上系统定义的软中断仅有以下几种。

    enum
    {
        HI_SOFTIRQ=0,
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        BLOCK_IOPOLL_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ,
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */
    
        NR_SOFTIRQS
    };

     实际上并没有什么关系,只有中枢的内核代码才使用软中断,而如果用户想要使用这种方式,直接使用软中断并不是一个好的选择,内核为用户提供了另外一种方便的方式即tasklet,tasklet本质上也是一种软中断,准确来说是系统从软中断类型中拿出一种来支持tasklet,所以tasklet就是一种软中断,不过在软中断的基础上,tasklet进行了更细的划分。每个CPU维护一个tasklet链表,其中保存当前CPU所有注册的tasklet。由于tasklet本质上仍然是软中断,所以其处理方式依赖于软中断的处理时机,在系统检查处理软中断时,检查到tasklet类型的软中断,调用tasklet_action函数进行处理。

    static DEFINE_PER_CPU(struct tasklet_head, tasklet_vec);

     每个tasklet由一个tasklet_struct结构描述

    struct tasklet_struct
    {
        struct tasklet_struct *next;
        unsigned long state;
        atomic_t count;
        void (*func)(unsigned long);
        unsigned long data;
    };

     所有的tasklet通过next连接成一个局部于CPU的链表,注意该结构中有个函数指针func,表示处理该tasklet的指针。所以要注册tasklet还需要提供处理函数,软中断的处理函数已经由系统定义好的。通过tasklet_schedule函数可以注册一个tasklet到系统

    static inline void tasklet_schedule(struct tasklet_struct *t)
    {
        if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
            __tasklet_schedule(t);
    }
    void __tasklet_schedule(struct tasklet_struct *t)
    {
        unsigned long flags;
    
        local_irq_save(flags);
        t->next = NULL;
        *__this_cpu_read(tasklet_vec.tail) = t;
        __this_cpu_write(tasklet_vec.tail, &(t->next));
        raise_softirq_irqoff(TASKLET_SOFTIRQ);
        local_irq_restore(flags);
    }

     实际的工作就比较简单,实际上就是插入到CPU维护的tasklet链表的尾部。然后会调用raise_softirq_irqoff标记软中断位图。这样在下次处理软中断的时候,就会处理tasklet,进而处理注册的tasklet。在操作CPU变量期间会禁用本地中断。

    明白了软中断和tasklet的关系,还需要注意:

    1、软中断支持在不同CPU上并行运行,不管是同种类型的还是不同类型的。

    2、tasklet仅仅支持不同类型的在不同CPU上并行运行,同种类型的不支持。

    参考:

    1、linux内核3.10.1源码

    2、深入linux内核架构

  • 相关阅读:
    postman发送请求携带Cookie
    maven打包相关配置
    springboot使用redis的keyspace notifications 实现定时通知
    JSON使用
    jdk1.8的一些特性
    Mysql--基础(一)
    04 difflib和filecmp
    08 存储引擎
    03 dnspython模块的应用
    02 IPy模块的应用
  • 原文地址:https://www.cnblogs.com/ck1020/p/6818055.html
Copyright © 2020-2023  润新知