据我所知,我们可以通过在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,因此,我们可以访问用户地址空间安全,但我们犯了一个错误。
答案 0 :(得分:2)
preempt_mask.h中有几个有趣的功能:
请注意,在正常情况下,驱动程序不需要使用任何这些功能。
答案 1 :(得分:1)
我认为in_interrupt()是一个糟糕的设计!
如果您的代码在进程上下文中运行,则不需要调用in_interrupt()。
in_serving_softirq()表示你处于真正的softirq上下文中do_softirq()而不是local_bh_disable()。