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

有人可以向我解释一下还是指出一些消息来源。

最佳答案

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

用户空间可能总是抢占。在多种情况和配置中,内核代码可能会阻止这种抢占。

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

参见下图。

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

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

关于linux - 禁用抢占功能后,在Linux中如何为IRQ提供服务?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28303659/

10-16 19:03