【问题标题】:About interrupt context,atomic context and process context in linux kernel关于linux内核中的中断上下文、原子上下文和进程上下文
【发布时间】:2014-03-11 05:18:38
【问题描述】:

据我所知,我们可以通过在 linux 内核中涉及 in_interrupt() 来验证我们是否处于中断上下文中。而in_interrupt()函数的实现是在进入或退出hardirq或softirq时按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,因此,我们可以访问用户态地址空间安全,但我们犯了一个错误。

【问题讨论】:

    标签: linux linux-kernel interrupt


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      in_serving_softirq() 表示你在真正的软中断上下文中 do_softirq() 而不是 local_bh_disable()。

      【讨论】:

        猜你喜欢
        • 2018-04-14
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 2019-03-17
        • 1970-01-01
        • 2022-01-05
        • 2010-10-20
        • 2017-11-28
        相关资源
        最近更新 更多