為什麼在中斷上下文中不能休眠

2021-06-09 20:39:05 字數 1983 閱讀 7710

這個問題有很多人問過,我看了下linux得核心**,原因如下(當然我不能保證一定對,如果有牛人理解得更好,歡迎指正)

1. 中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷(這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠),如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wake_up_***都是針對某個程序而言的,而在中斷context中,沒有程序的概念,沒有乙個task_struct(這點對於softirq和 tasklet一樣),因此真的休眠了,比如呼叫了會導致block的例程,核心幾乎肯定會死.

2.schedule()在切換程序時,儲存當前的程序上下文(cpu暫存器的值、程序的狀態以及堆疊中的內容),以便以後恢復此程序執行。中斷發生後,核心會先儲存當前被中斷的程序上下文(在呼叫中斷處理程式後恢復);

但在中斷處理程式裡,cpu暫存器的值肯定已經變化了吧(最重要的程式計數器pc、堆疊sp等),如果此時因為睡眠或阻塞操作呼叫了schedule(),則儲存的程序上下文就不是當前的程序context了.所以不可以在中斷處理程式中呼叫schedule()。

3.2.4核心中schedule()函式本身在進來的時候判斷是否處於中斷上下文:

if(unlikely(in_interrupt()))

bug();

因此,強行呼叫schedule()的結果就是核心bug,但我看2.6.18的核心schedule()的實現卻沒有這句,改掉了.

4.中斷handler會使用被中斷的程序核心堆疊,但不會對它有任何影響,因為handler使用完後會完全清除它使用的那部分堆疊,恢復被中斷前的原貌.

5.處於中斷context時候,核心是不可搶占的,因此,如果休眠,則核心一定掛起.

先把中斷處理流程給出來

1.進入中斷處理程式--->2.儲存關鍵上下文---->3.開中斷(sti指令)--->4.進入中斷處理程式的 handler--->5.關中斷(cli指令)---->6.寫eoi暫存器(表示中斷處理完成)---->7.開中斷。

複製**

硬中斷:

對應於上圖的1、2、3步驟,在這幾個步驟中,所有中斷是被遮蔽的,如果在這個時候睡眠了,作業系統不會收到任何中斷(包括時鐘中斷),系統就基本處於癱瘓狀態(例如排程器依賴的時鐘節拍沒有等等……)

軟中斷:

對應上圖的4(當然,準確的說應該是4步驟的後面一點,先把話說保險點,免得思一克又開始較真

大家知道作業系統以程序排程為單位,程序的執行在程序的上下文中,以程序描述符作為管理的資料結構。程序可以睡眠的原因是作業系統可以切換不同程序的上下文,進行排程操作,這些操作都以程序描述符為支援。

中斷執行在中斷上下文,沒有乙個所謂的中斷描述符來描述它,它不是作業系統排程的單位。一旦在中斷上下文中睡眠,首先無法切換上下文(因為沒有中斷描述符,當前上下文的狀態得不到儲存),其次,沒有人來喚醒它,因為它不是作業系統的排程單位。

此外,中斷的發生是非常非常頻繁的,在乙個中斷睡眠期間,其它中斷發生並睡眠了,那很容易就造成中斷棧溢位導致系統崩潰。

如 果上述條件滿足了(也就是有中斷描述符,並成為排程器的排程單位,棧也不溢位了,理論上是可以做到中斷睡眠的),中斷是可以睡眠的,但會引起很多問題.例 如,你在時鐘中斷中睡眠了,那作業系統的時鐘就亂了,排程器也了失去依據;例如,你在乙個ipi(處理器間中斷)中,其它cpu都在死迴圈等你答覆,你確 睡眠了,那其它處理器也不工作了;例如,你在乙個dma中斷中睡眠了,上面的程序還在同步的等待i/o的完成,效能就大大降低了……還可以舉出很多例子。 所以,中斷是一種緊急事務,需要作業系統立即處理,不是不能做到睡眠,是它沒有理由睡眠。

中斷產生是隨機的,假設某次中斷乙個核心執行緒,而且按照你說的方案,這個執行緒的task結構就會被借用,執行緒就會去睡眠。被打斷執行緒的優先順序如果太低,那 麼它很難有機會再執行,某些情況下可能造成系統hang。如果臨時提高被打斷執行緒的優先順序,那麼又需要設計新的喚醒機制來保證阻塞同一鎖上的高優先順序的線 程被先喚醒。同時,要實現臨時提高被打斷執行緒的優先順序,又需要再鎖的獲取流程增加改變優先順序的演算法。

程序上下文 中斷上下文

請問程序上下文是什麼意思?1.程序上下文一般在程序切換中提到,也就是當程序要切換時關於當前程序的暫存器內容以及記憶體頁表的詳細資訊等等內容,一句話概括也就是關於描述程序的資訊。2.同意樓上的,就是很多書本上提到的程序控制塊pcb,儲存著程序的很多詳細資訊 3.補充 linux完全注釋中的一段話 當乙...

程序上下文 中斷上下文

核心空間和使用者空間是現代作業系統的兩種工作模式,核心模組執行在核心空間,而使用者態應用程式執行在使用者空間。它們代表不同的級別,而對系統資源具有不同的訪問許可權。核心模組執行在最高端別 核心態 這個級下所有的操作都受系統信任,而應用程式執行在較低級別 使用者態 在這個級別,處理器控制著對硬體的直接...

程序上下文 中斷上下文

當乙個程序在執行時,cpu的所有暫存器中的值 程序的狀態以及堆疊的內容被稱為該程序的上下文。程序上下文 當核心需要切換到另乙個程序時,它需要儲存當前程序的所有狀態,即儲存當前程序的上下文,以便在再次執行該程序時,能夠得到切換時的狀態執行下去。中斷上下文 在linux中,當前程序上下文均儲存在程序的任...