【发布时间】: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