当禁用抢占时,Linux 中的 IRQ 是如何服务的?

How is IRQ serviced in Linux when pre-emption is disabled?

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

谁能给我解释一下或指出一些来源。

没有 "non-preemptive Linux kernel" 这样的东西。用户 space 任务始终可以被抢占。

也许你的意思是 "non-preemptible"。不可抢占内核是指内核代码不能被抢占的内核,因为它不能被挂起以允许另一个进程或线程 运行。但是,中断处理程序可能仍然可以 运行;他们被允许做的事情是有限度的。

在任何情况下,如果中断请求不能立即得到服务,它会一直挂起,直到得到服务。

嗯,有不同类型的pre-emptions,代表user-space的用户进程或内核上下文。

User-space 可能总是 pre-empt。在各种情况和配置中,内核代码可能会阻止此 pre-emption。

ISR 始终得到服务(除非 IRQ 被屏蔽;非常罕见且短)。内核例程(例如已经 运行 进程交换)可能会禁用 kernel/user space per-emption 直到它完成其业务。 The source 通常在汇编程序中,可能取决于内核选项。当内核上下文恢复 pre-emption 时,可能会发生上下文切换。

见下图....

blue 部分是内核不断为任务 2 执行 sbrk() 的地方。如果 pre-emption 没有被禁用,它将转到立即执行任务 1。它可能需要为该任务自动获取一些内存页面。通常这很短。当它 re-ables 到 pre-emption 时,我们会注意到发生了 IRQ,并且数据已准备好用于 task 1,然后将发生上下文切换。 任务 2 仍将等待 sbrk() 完成。

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