在Linux中,irqs_disabled()和in_interrupt()有什么区别?

6

这两个函数在Linux中有什么区别? 我知道irqs_disabled()会返回irq是否被禁用,而in_interrupt()会返回当前是否处于中断上下文。 如果您默认在中断上下文中,这是否意味着irq已被禁用?

在哪些情况下我们特别使用这些函数?

2个回答

6
考虑以下两种情况:
1)有些平台支持嵌套中断,其中一个中断在另一个中断尚未返回时可能发生。优先级是在中断控制器寄存器中配置的。
2)多核CPU可以同时处理两个中断,每个核心处理一个中断。
有许多原因要检查函数是否在中断上下文中运行,例如:使用线程锁的函数不应在中断上下文中执行,否则将发生死锁。这些函数可能希望检查是否处于中断上下文并以错误中止。
此外,有许多原因要禁用中断,例如:当您正在写入将由中断处理程序使用的内存结构时,您可能会以原子模式(irqs禁用)填充数据。
一个同时使用这两个函数的地方是自旋锁函数族,因为自旋锁很适合在中断上下文中使用。

4

我得到了答案。

#define in_irq()                (hardirq_count())
#define in_softirq()            (softirq_count())
#define in_interrupt()          (irq_count())

函数in_interrupt()检查(硬)中断和软中断计数器。无论您执行中断处理程序还是软中断处理程序,此函数都返回true。

但是,irqs_disabled()仅检查(硬)中断是否已禁用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接