為什麼中斷處理函式中不能出現阻塞
阿新 • • 發佈:2018-11-26
1、 中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷,如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的wake_up_xxx都是針對某個程序而言的,而在中斷context中,沒有程序的概念,沒有一個task_struct(這點對於softirq和tasklet一樣),因此真的休眠了,比如呼叫了會導致block的例程,核心幾乎肯定會死
2、schedule()在切換程序時,儲存當前的程序上下文(CPU暫存器的值、程序的狀態以及堆疊中的內容),以便以後恢復此程序執行。中斷髮生後,核心會先儲存當前被中斷的程序上下文(在呼叫中斷處理程式後恢復);但在中斷處理程式裡,CPU暫存器的值肯定已經變化了吧(最重要的程式計數器PC、堆疊SP等),如果此時因為睡眠或阻塞操作呼叫了schedule(),則儲存的程序上下文就不是當前的程序context了.所以不可以在中斷處理程式中呼叫schedule()。
3、中斷處理程式是帶便程序執行的,它所代表的程序必須總處理TASK_RUNNING狀態。當一箇中斷處理程式正在執行時,他所代表的IRQ線上發出的訊號就會暫時被忽略
4、同樣也是為了實現中斷巢狀進行所付出的代價,如果要保證可以中斷巢狀,就中斷處理程式必須永不阻塞。
轉載:https://blog.csdn.net/dzw19911024/article/details/79576592