【发布时间】:2015-04-29 14:03:28
【问题描述】:
tasklet 执行过程中,tasklet 执行过程中触发硬件中断时,tasklet 的状态会发生什么变化?
【问题讨论】:
标签: linux linux-kernel linux-device-driver embedded-linux
tasklet 执行过程中,tasklet 执行过程中触发硬件中断时,tasklet 的状态会发生什么变化?
【问题讨论】:
标签: linux linux-kernel linux-device-driver embedded-linux
Tasklet 是下半部分。它们在 softirq 上下文中运行,而不是在硬件中断上下文中。所以硬件中断总是被启用的。当在执行小任务时触发硬件中断时,它将中断小任务。然后上半部分在相应的 IRQ 堆栈上运行并确认中断。这种行为对于中断处理程序特别有用,其中必须尽快管理硬件中断,但大多数数据管理可以安全地延迟到以后的时间。实际上,tasklet 就像内核定时器一样,在软中断的上下文中(以原子模式)执行,软中断是一种在启用硬件中断的情况下执行异步任务的内核机制。
【讨论】:
1.In the return from hardware interrupt code path 2.In the ksoftirqd kernel thread 3.In any code that explicitly checks for and executes pending softirqs, such as the networking subsystem 如果触发了太多硬件中断,是的,tasklet 有可能得不到调度。事实上这种情况可能会导致“软锁定”
检查tasklet_schedule函数。
它将保存中断系统的状态并将中断恢复到之前的状态并在do_softirq操作后返回。
【讨论】:
Tasklet 在中断上下文中运行。所以小任务中的代码不应该休眠(或被中断)。如果 tasklet 被中断打断,你的系统就会崩溃。要在运行 tasklet 时防止中断,您必须使用 spinlock_irq_save() 来防止中断
【讨论】:
spin_lock_irqsave() 并不总是正确的选择。这取决于您要保护的数据以及在什么情况下。更常见的是,tasklet 通过spin_lock_bh() 保护数据。