在ISR安排后,tasklet运行的确切时间?

时间:2015-02-28 10:13:12

标签: linux linux-kernel linux-device-driver embedded-linux

我写了我的ISR,我的tasklet立即运行。 但是,我看到有人说只有在受到CPU关注时才会运行tasklet。这是一个非常通用的术语 CPU注意力所以我背诵那些响应者。我的意思是cpu关注到tasklet执行的那个时刻以及CPU的状态会发生什么?

其次,如果假设我继续获得硬中断,那么tasklet何时会有机会运行? Tasklet可能无法运行吗?内核如何处理这些事情?

1 个答案:

答案 0 :(得分:4)

TL; DR:Tasklet由调度程序处理的 ksoftirq 线程运行。


Tasklet 只是 softirq 的一种形式(由TASKLET_SOFTIRQ优先级处理它们),因此运行tasklet时的规则适用于它们。根据Robert Love的书“Linux Kernel”,他们在这里 发展“:

  
      
  1. 从硬件中断代码路径返回
  2.   
  3. ksoftirq 内核线程
  4. 中   
  5. 在任何明确检查并执行挂起的softirq的代码中,例如网络子系统
  6.   

如果threadirqs=true(内核引导参数)是默认值,则情况(1)似乎不起作用。


UPD :与调度程序 ksoftirq 关系的一些注释。

这似乎发生了什么:

  1. hardirq 处理程序中,您醒来 ksoftirq (由于tasklet_schedule()
  2. 因此wake_up_process()会检查 ksoftirq 是否可以取代当前主题
  3. 如果(2)为真,则设置TIF_NEED_RESCHED标志
  4. hardirq 返回时(ret_from_intr - 在x86中)TIF_NEED_RESCHED标志已被选中
  5. 如果(4)为真,则调用schedule()试图选择要执行的下一个线程。
  6. ksoftirq 很有可能被视为(2-3)中的抢先候选人,并且会在(5)中被选中,但如果有竞争对手, ksoftirq 必须等到下一个schedule()周期 - 当前线程退出(即休眠),发生时钟滴答,系统调用或新中断。