如何解决内核代码被中断时会发生什么?
| 我正在阅读操作系统概念(Silberschatz,Galvin,Gagne),第6版,第20章。 我了解Linux内核代码是不可抢占的(2.6版之前)。但是它可以被硬件中断打断。如果内核位于关键部分的中间并且发生了中断并且它也执行了关键部分,会发生什么? 从我在书中读到的内容: 第二种保护方案 Linux使用适用于关键 中断服务程序中出现的部分。基本工具是 处理器中断控制 硬件... 好的,当ISR具有关键部分时,可以使用此方案。但这只会消除更多的中断。首先被该中断中断的内核代码呢?解决方法
但这只会消除更多的中断。那被中断的内核代码呢
首先是通过此中断?
如果中断处理程序和其他内核代码需要访问相同的数据,则需要对此进行保护,这通常是通过自旋锁完成的,必须格外小心,您不想引入死锁,并且必须确保这种自旋锁不会保持太久。对于在硬件中断处理程序中使用的自旋锁,您必须在保持锁的同时禁用该处理器上的中断-在Linux中这是通过功能spin_lock_irqsave()完成的。
(虽然有些过时,您可以在此处阅读有关该概念的信息)
, 首先被该中断中断的内核代码被中断。
这就是为什么编写中断处理程序是一件很痛苦的事情的原因:它们不能做任何会危害主流执行流正确性的事情。
例如,Apple的xnu内核处理大多数设备中断的方式是将中断中的信息捕获到内存中的记录中,将该记录添加到队列中,然后恢复正常执行。然后,内核会在一段时间后从队列中获取中断(我认为是在调度程序的主循环中)。这样,中断处理程序仅通过中断队列与系统的其余部分进行交互,几乎不会造成麻烦。
有一些中间立场;在许多体系结构(包括x86)上,特权代码有可能掩盖中断,以便它们不会引起中断。那可以用来保护真正不应该被打断的代码段。但是,这些体系结构通常还具有不可屏蔽的中断,这些中断会忽略屏蔽,因此仍必须考虑中断。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。