in_interrupt疑问
关于中断上下文的问题,内核里有一个宏定义in_interrupt但是in_interrupt主要用意是根据当前preempt_count变量,来判断当前代码是否在一个中断上下文中执行。
#define in_interrupt() (irq_count())
#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
| NMI_MASK))
那么,如果我在我的代码前面加上一句:
local_bh_disable(void)
因为local_bh_disable会将当前preempt_count()+SOFTIRQ_OFFSET,所以会导致in_interrupt返回1
那是不是说我的代码在执行
local_bh_disable之后就进入中断上下文了?
求高手解疑,谢谢
附:
void local_bh_disable(void)
{
__local_bh_disable((unsigned long)__builtin_return_address(0));
}
static inline void __local_bh_disable(unsigned long ip)
{
add_preempt_count(SOFTIRQ_OFFSET);
barrier();
} 是的,可以将执行路径分为中断类和非中断类,非中断类可以被调度,中断类只能简单地被中断类打断。 关注一下本人CU博客中相关内容,比2楼的详细 :) 回复 1# jinxinxin163
那么,如果我在我的代码前面加上一句:
local_bh_disable(void)
因为local_bh_disable会将当前preempt_count()+SOFTIRQ_OFFSET,所以会导致in_interrupt返回1
那是不是说我的代码在执行
local_bh_disable之后就进入中断上下文了?
是的,之后就进入软中断上下文的。但是还是可能被中断打断。
回复 4# 瀚海书香
那内核线程在调用preempt_disable之后可以被软中断打断不?为什么? 回复 5# jinxinxin163
那内核线程在调用preempt_disable之后可以被软中断打断不?为什么?
可以被打断。因为你只是禁止强制,但是没有禁止软中断,而软中断的优先级高于内核线程,所以会打断内核线程的执行。
回复 6# 瀚海书香
禁止抢占跟禁止软中断不是一回事么?
local_bh_disable也不过是把preempt_count()加了 SOFTIRQ_OFFSET而已,都是让preempt_count>0,从而禁止了抢占阿
回复 7# jinxinxin163
禁止抢占跟禁止软中断不是一回事么?
这两个当然不是一回事了。虽然都是给preempt_count增加,但是增加的位置不同。preempt_count分为三段,分别表示中断计数、软中断计数和抢占计数。
禁止了抢占,并不一定会禁止软中断,因为你只是增加了preempt_count的抢占计数,而没有增加软中断计数,所以当前的环境下禁止抢占,但是允许软中断。
回复 8# 瀚海书香
那preempt_disable只是禁止”别的进程“抢占了? preempt_disable只是针对进程上下文而言的? 回复 9# jinxinxin163
preempt_disable只是针对进程上下文而言的?
preempt_disable的工作是禁止进程抢占。可以这么理解
页:
[1]
2