2

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

从我在书中读到的:

Linux 使用的第二种保护方案适用于中断服务程序中出现的临界区。基本工具是处理器中断控制硬件...

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

4

2 回答 2

3

但它只会禁用进一步的中断。首先被这个中断中断的内核代码呢?

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

(虽然有点过时,但您可以在此处阅读有关该概念的信息)

于 2011-05-27T13:45:22.080 回答
1

最初被此中断中断的内核代码被中断。

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

例如,Apple 的 xnu 内核处理大多数设备中断的方式是将中断中的信息捕获到内存中的一条记录中,将该记录添加到队列中,然后恢复正常执行;然后内核在一段时间后从队列中获取中断(我假设在调度程序的主循环中)。这样,中断处理程序只通过中断队列与系统的其余部分进行交互,几乎没有造成麻烦的危险。

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

于 2011-05-27T12:32:35.813 回答