关于linux内核中的中断上下文,原子上下文和进程上下文

时间:2014-03-11 05:18:39

标签: linux linux-kernel interrupt

据我所知,我们可以通过在Linux内核中使用in_interrupt()来验证我们是否处于中断上下文中。当进入或退出hardirq或softirq时,in_interrupt()函数的实现由thread_info->preempt_count计算。因此,当in_interrupt()返回非零时,表示我们正在处理hardirq或softirq。

但是,我的问题是当我们涉及local_bh_disable()函数时,它会增加thread_info->preempt_count,因此in_interrupt()函数返回非零。因此,我们如何确定我们现在是否处于中断环境中。在我看来,原子上下文是禁用本地中断

这是我现在处于内核模式的情况,我想访问用户空间地址空间,但我不知道是否在进程上下文或中断上下文中运行,因为在中断中访问用户空间地址空间上下文无效,所以我想通过涉及in_interrupt()函数来确定是否在进程上下文中。然后我得到大于零的返回值,因此,我会认为我现在处于中断上下文中并且不会访问用户空间。但是,也许有一些函数意味着涉及local_bh_disable增加thread_info->preempt_count以禁用sortirq,但事实上,我们处于进程上下文中并且只是禁用softirq,因此,我们可以访问用户地址空间安全,但我们犯了一个错误。

2 个答案:

答案 0 :(得分:2)

preempt_mask.h中有几个有趣的功能:

  • in_irq():硬件中断
  • in_softirq():我们是否处于softirq环境中?
  • in_interrupt():中断上下文?
  • in_nmi():我们是否在NMI环境中?
  • in_atomic():我们是在原子上下文中运行吗?警告:此宏无法始终检测原子上下文

请注意,在正常情况下,驱动程序不需要使用任何这些功能。

答案 1 :(得分:1)

我认为in_interrupt()是一个糟糕的设计!

如果您的代码在进程上下文中运行,则不需要调用in_interrupt()。

in_serving_softirq()表示你处于真正的softirq上下文中do_softirq()而不是local_bh_disable()。