Linux kernel 当内核代码被中断时会发生什么?

Linux kernel 当内核代码被中断时会发生什么?,linux-kernel,critical-section,interrupt,Linux Kernel,Critical Section,Interrupt,我正在阅读操作系统概念(Silberschatz,Galvin,Gagne),第6版,第20章。 我知道Linux内核代码是不可抢占的(2.6版本之前)。但它可以被硬件中断中断。如果内核处于临界区的中间,中断发生,它也执行临界区,则发生了什么? 根据我在书中读到的: 第二项保障计划 Linux使用适用于关键 在中断服务例程中出现的部分。基本工具是 处理器中断控制 硬件 好的,当ISR有一个临界段时,使用此方案。但它只会消除进一步的中断。那么首先被这个中断中断的内核代码呢?首先被这个中断中断的内核

我正在阅读操作系统概念(Silberschatz,Galvin,Gagne),第6版,第20章。 我知道Linux内核代码是不可抢占的(2.6版本之前)。但它可以被硬件中断中断。如果内核处于临界区的中间,中断发生,它也执行临界区,则发生了什么?

根据我在书中读到的:

第二项保障计划 Linux使用适用于关键 在中断服务例程中出现的部分。基本工具是 处理器中断控制 硬件


好的,当ISR有一个临界段时,使用此方案。但它只会消除进一步的中断。那么首先被这个中断中断的内核代码呢?

首先被这个中断中断的内核代码会被中断

这就是为什么编写中断处理程序是一项如此痛苦的任务:它们不能做任何会危及主流执行正确性的事情

例如,苹果xnu内核处理大多数类型的设备中断的方式是将中断中的信息捕获到内存中的记录中,将该记录添加到队列中,然后恢复正常执行;内核随后会在一段时间后从队列中接收中断(我假设是在调度程序的主循环中)。这样,中断处理程序只通过中断队列与系统的其余部分进行交互,并且几乎没有引发故障的危险

有一点中间立场;在许多体系结构(包括x86)上,特权代码可以屏蔽中断,这样它们就不会导致中断。这可以用来保护真正不应该被中断的代码段。然而,这些体系结构通常也有不可屏蔽的中断,它们忽略了屏蔽,因此仍然需要考虑中断

但它只会消除进一步的中断。被中断的内核代码呢 一开始就被打断了

如果中断处理程序和其他内核代码需要访问相同的数据,您需要防止这种情况发生,这通常是由a完成的,必须非常小心,您不想引入死锁,并且必须确保这样的自旋锁不会保持太长时间。对于硬件中断处理程序中使用的自旋锁,您必须在保持锁的同时禁用该处理器上的中断-在linux中,这是通过函数spin_lock_irqsave()完成的


(虽然有点过时,但您可以了解这个概念)

这是正确的-如果关键部分与中断处理程序共享,它必须使用一种中断禁用自旋锁变体。