我正在阅读操作系统概念(Silberschatz,Galvin,Gagne),第6版,第20章。 我知道Linux内核代码是不可抢占的(在2.6版本之前)。但它可以被硬件中断中断。如果内核处于关键部分的中间并且中断发生并且它也执行了关键部分会发生什么?
从我在书中读到的内容:
第二种保护方案 Linux使用适用于关键 中断服务例程中出现的部分。基本工具是 处理器中断控制 硬件...
好的,当ISR有临界区时使用此方案。但它只能进一步打断中断。那个被这个中断打断的内核代码呢?
答案 0 :(得分:3)
但它只能进一步打断中断。被中断的内核代码怎么样? 通过这个中断首先?
如果中断处理程序和其他内核代码需要访问相同的数据,则需要对此进行保护,这通常由spinlock完成,必须非常小心,您不想介绍僵局,你必须确保这样的自旋锁不会持续太久。对于硬件中断处理程序中使用的自旋锁,您必须在保持锁的同时禁用该处理器上的中断 - 在linux中使用函数spin_lock_irqsave()完成。
(虽然有点过时,但你可以阅读概念here)
答案 1 :(得分:1)
首先被这个中断中断的内核代码被中断。
这就是为什么编写中断处理程序是一项非常痛苦的任务:他们不能做任何会危及主要执行流程正确性的事情。
例如,Apple的xnu内核处理大多数设备中断的方式是将中断中的信息捕获到内存中的记录,将该记录添加到队列中,然后恢复正常执行;然后内核会在一段时间后从队列中获取中断(在调度程序的主循环中,我假设)。这样,中断处理程序只通过中断队列与系统的其余部分进行交互,并且几乎没有引起故障的危险。
有一点中间立场;在许多体系结构(包括x86)上,特权代码可能会屏蔽中断,因此它们不会导致中断。这可以用来保护真正不应该被打断的代码段落。但是,这些架构通常还具有不可屏蔽的中断,忽略了屏蔽,因此仍然需要考虑中断。