当禁用抢占时,如何在Linux中为IRQ提供服务?

时间:2015-02-03 16:15:23

标签: linux linux-kernel interrupt-handling

我在一些书中读到,为了服务中断,CPU周围的数据被存储到堆栈中并且当前进程被抢占。现在,如果内核是非抢占式的,或者抢占被禁用。抢占如何发生并且ISR()得到了服务?

有人可以向我解释这个或者指出一些消息来源。

2 个答案:

答案 0 :(得分:2)

嗯,代表用户空间有不同类型的抢占,用户进程或内核上下文。

用户空间可能总是先发制人。有各种情况和配置,内核代码可能会阻止这种抢占。

ISR始终得到服务(除非IRQ被屏蔽;非常罕见且简短)。内核例程(如已经运行进程交换)可能会禁用内核/用户空间占用,直到它完成其业务。 The source通常是汇编程序,可能依赖于内核选项。当内核上下文恢复抢占时,可能会发生上下文切换。

见下图....

enter image description here

blue 部分是内核为任务2继续执行sbrk()的部分。如果未禁用抢占,则会立即转到任务1。它可能需要以原子方式为该任务获取一些内存页面。通常这很短。当它重新启动抢占时,我们会注意到IRQ已经发生并且数据已准备好用于任务1 ,然后将发生上下文切换。 任务2 仍将等待sbrk()完成。

每个任务1 任务2 实际上有两个任务上下文(内核堆栈);但是它运行相同的内核代码,并且更高的内核内存空间看起来都一样(我把它全部放在'内核'标题下)。用户空间完全不同(虚拟内存)。我的UML可能真的很混乱。我没有一些Dia序列视图。

答案 1 :(得分:1)

没有"非抢占 ive Linux内核"。用户空间任务总是可以被抢占。

也许你的意思是"非抢占 ible "。不可抢占的内核是内核代码无法被抢占的意义,因为它不能被挂起以允许另一个进程或线程运行。但是,中断处理程序仍然可以运行;他们被允许做的只是一个限制。

在任何情况下,如果无法立即为中断请求提供服务,它将一直待处理,直到 服务为止。