Linux kernel Tasklet';s操作功能在中断打开的情况下运行?

Linux kernel Tasklet';s操作功能在中断打开的情况下运行?,linux-kernel,arm,linux-device-driver,Linux Kernel,Arm,Linux Device Driver,我试图了解Tasklet的操作函数(已在Tasklet_init中设置)运行的上下文 上述函数表明,在Tasklet的操作函数运行之前,中断已启用 这是否意味着操作函数(延迟函数)在进程上下文中运行,或者我们还没有完全从中断中返回(我们在驱动程序中断处理程序之后正在退出),因此延迟函数在中断上下文中运行 通常,tasklet_调度是从驱动程序的中断处理程序(在中断禁用的情况下运行)内部调用的,但为什么还要再次禁用中断呢 void __tasklet_schedule(struct tasklet

我试图了解Tasklet的操作函数(已在Tasklet_init中设置)运行的上下文

上述函数表明,在Tasklet的操作函数运行之前,中断已启用

  • 这是否意味着操作函数(延迟函数)在进程上下文中运行,或者我们还没有完全从中断中返回(我们在驱动程序中断处理程序之后正在退出),因此延迟函数在中断上下文中运行

  • 通常,tasklet_调度是从驱动程序的中断处理程序(在中断禁用的情况下运行)内部调用的,但为什么还要再次禁用中断呢

    void __tasklet_schedule(struct tasklet_struct *t)
    {
    
        unsigned long flags;
    
        local_irq_save(flags);---> Interrupts is disabled again ?
        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);
    
     }
    

  • 首先,答案取决于Linux版本。tasklet和其他工具是一个内部Linux API,可以在不同版本之间进行更改


    这是否意味着操作函数(延迟函数)在进程上下文中运行,或者我们还没有完全从中断中返回(我们在驱动程序中断处理程序之后正在退出),因此延迟函数在中断上下文中运行

    中断上下文是特殊的,在被中断任务的内存空间/上下文中运行。tasklet在没有映射用户内存的内核进程中运行;但它处于超级模式。您可以在这里调用更多的内核函数,因为内核对象将代表内核进程而不是一些随机的用户进程进行分配。tasklet的运行方式可能取决于Linux版本,但肯定会发生上下文切换。通常,内核进程被标记为runnable,中断返回。当然,这个tasklet(内核进程)通常可以被中断

    通常,tasklet_调度是从驱动程序的中断处理程序(在中断禁用的情况下运行)内部调用的,但为什么还要再次禁用中断呢

    void __tasklet_schedule(struct tasklet_struct *t)
    {
    
        unsigned long flags;
    
        local_irq_save(flags);---> Interrupts is disabled again ?
        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);
    
     }
    
    中断可以是可预防的/优先的。。也就是说,一个更高级别的中断可能会中断另一个。此外,可以从比中断上下文更多的调用
    tasklet\u schedule()
    。比如,一些kickstart初始化或类似的东西


    这个问题似乎是对代码的批评?在假定中断被禁用的情况下,可以创建一个
    tasklet\u schedule()
    。但是,它很容易出错,而且保存中断的代码也很少。我认为两者都有可能,所以这是一个很难回答的问题。

    关于
    ->
    的行为代表
    感谢@artless noise为您提供的答案,我有点错过了。我可以说,softirq在运行时清除了I位CPSR(意味着核心可以对中断做出反应),而在调度softirq时,必须设置I位CPSR(意味着内核不能对中断做出反应)。此外,在执行softirq时,我们可以或不可以禁用中断,这取决于我们在softirq handlerAlso中所做的操作。让Linux在多核SMP系统上运行,会出现一个中断,并由一个内核执行,在这条从CPU到GIC的核心IRQ线路上屏蔽和中断处理程序(在处理程序中调度softirq)开始执行,但同时出现另一个中断,由另一个内核执行(较早的内核无法对此做出反应)其他内核是否也会开始执行相同的中断处理程序?或者中断处理程序应该受到锁的保护?与GIC的争用是一个单独的问题。当另一个内核第二次读取中断源时,它将返回一个
    伪值。GIC会处理这个多核争用;它只返回中断到一个内核。@artlessnoise,这意味着同一中断处理程序(ISR)不能在多个内核上运行,对吗?还有一个疑问困扰着我,如果ISR是在中断禁用的情况下运行的,那么我们是否需要使用任何自旋锁变体来保护ISR内的共享数据?