Linux内核的上下文(Context)

一、Linux内核中的上下文分类和判别       

        在Linux内核里,上下文用于描述当前软硬件状态和环境。一般来说上下文可以分为中断上下文(Interrupt Context)和进程上下文。其中中断上下文细分为可屏蔽中断上下文(包括硬中断上下文和软中断上下文)和不可屏蔽中断(NMI)上下文;进程上下文细分为可抢占进程上下文和不可抢占上下文;而中断上下文和不可抢占进程上下文又都称为原子上下文。

        这里需要注意中断(Interrupt)和异常(Exception)指的是发生了正常的执行流程被打断的事件。如果这些事件来自CPU内部就叫异常,如果来自外部设备就叫中断;一般来说异常时同步事件,通常会立即处理,而中断时异步事件,通常会在一点程度上延迟处理。

1)中断上下文

        在内核中可以使用如下宏来整体判断是否处在中断上下文

/*#define irq_count()	(nmi_count() | hardirq_count() | softirq_count())*/
#define in_interrupt()		(irq_count())

硬中断上下文

        CPU在处理硬中断时,处于硬中断上下文。其主要特点是:不可被硬中断,不可被软中断,不可睡眠(自愿调度),不可抢占(强制调度)。

        在Linux内核中使用如下宏来判断是否处于硬中断上下文

/*需要注意的是比较老的in_irq()宏在新的代码中不应该再使用,直接使用如下的宏*/
#define in_hardirq()		(hardirq_count())

软中断上下文

        CPU在处理软中断时,处于软中断Context。其主要特点是:可以被硬中断,不可被软中断,不可睡眠(资源调度),不可抢占(强制调度)。

        在Linux内核中使用如下宏来判断是否处于软中断上下文

/*之前老的in_softirq()宏在新的代码中不再使用*/
#define in_serving_softirq()	(softirq_count() & SOFTIRQ_OFFSET)

不可屏蔽中断(NMI)上下文

        CPU在处理NMI时,处于NMI上下文。它的性质和可屏蔽硬中断上下文类似,可以认为是特殊的硬中断上下文。

        在Linux内核中使用如下宏来判断是否处于NMI上下文

#define in_nmi()		(nmi_count())

2)进程上下文

        CPU在处理用户进程,内核线程和异常(Excetpion)处理时,CPU处于进程上下文。其主要特点是:可以被硬中断,可以被软中断,可以睡眠(资源调度),是否可以抢占(强制调度)取决于有没有关抢占。

#define in_task()		(!(in_nmi() | in_hardirq() | in_serving_softirq()))

3)原子上下文

/*
 * Are we running in atomic context?  WARNING: this macro cannot
 * always detect atomic context; in particular, it cannot know about
 * held spinlocks in non-preemptible kernels.  Thus it should not be
 * used in the general case to determine whether sleeping is possible.
 * Do not use in_atomic() in driver code.
 */
#define in_atomic()	(preempt_count() != 0)

 二、一些上下文切换的边界

Linux内核的上下文(Context)_第1张图片

1)nmi_enter()和nmi_exit()是不可屏蔽中断上下文的边界。

2)irq_enter()和irq_exit()是可屏蔽中断上下文的边界;在do_IRQ()中,其前半部分处于硬件中断上下文,其边界为local_irq_disable()和local_irq_enable(),后半部分处于软中断上下文,其边界为local_bh_disable()和local_bh_enable()。

 

 

 

 

你可能感兴趣的:(Linux,Kernel,linux)