2011-05-27 101 views
2

我在閱讀操作系統概念(Silberschatz,Galvin,Gagne),第6版,第20章。我知道Linux內核代碼是不可搶佔的(2.6版之前)。但它可以被硬件中斷中斷。如果內核處於關鍵部分中間併發生中斷,並且它也執行了關鍵部分,會發生什麼情況?當內核代碼中斷時會發生什麼?

從我在書上看到:

是 Linux使用第二保護計劃適用於在中斷服務程序發生關鍵 部分。的基本工具是 處理器中斷控制 硬件...

好的,當一個ISR具有關鍵部分使用該方案。但它只會讓更多的中斷失效。首先被這個中斷中斷的內核代碼是什麼?

回答

3

但它只會使更多的中斷變得混亂。通過這個中斷在第一個地方中斷了 的內核代碼怎麼樣?

如果中斷處理程序和其他內核代碼需要訪問相同的數據,你需要保護對抗,這通常是由spinlock完成,極大必須小心,你不希望引入僵局,並且你必須確保這樣的自旋鎖不會持續太久。對於在硬件中斷處理程序中使用的自旋鎖,您必須禁用該處理器上的中斷,同時保持鎖定 - 在linux中使用函數spin_lock_irqsave()完成。

(雖然有點過時,你可以閱讀有關概念here

+0

這是正確的 - 如果一個關鍵部分與中斷處理程序共享,它必須使用中斷禁用自旋鎖變種之一。 – caf 2011-05-30 06:49:08

1

首先被該中斷中斷的內核代碼被中斷。

這就是爲什麼編寫中斷處理程序是如此痛苦的任務:他們不能做任何會危害主流執行正確性的事情。

例如,Apple的xnu內核處理大多數設備中斷的方式是將中斷中的信息捕獲到內存中的記錄中,將該記錄添加到隊列中,然後恢復正常執行;內核會在一段時間之後從隊列中擷取中斷(在調度程序的主循環中,我假設)。這樣,中斷處理程序只通過中斷隊列與系統的其餘部分交互,並且幾乎沒有造成麻煩的危險。

有一點中間地帶;在許多體系結構(包括x86)上,特權代碼可能會屏蔽中斷,以避免中斷。這可以用來保護真正不應該中斷的代碼段落。但是,這些體系結構通常也具有不可屏蔽的中斷,這會忽略屏蔽,因此必須考慮中斷。

相關問題