Linux的中斷可以嵌套嗎?
- 2019 年 11 月 11 日
- 筆記
本文系轉載,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
來源: 微信公眾號linux閱碼場(id: linuxdev)

問答
問:Linux的中斷可以嵌套嗎?
答:以前是可以嵌套的,現在不可以!
歷史
早前的Linux內核版本,中斷分為兩種:
快中斷,申請的時候帶IRQF_DISABLED標記,在IRQ HANDLER裡面不允許新的中斷進來;
慢中斷,申請的時候不帶IRQF_DISABLED標記,在IRQ HANDLER裡面允許新的其他中斷嵌套進來。
老的Linux內核中,如果一個中斷服務程式不想被別的中斷打斷,我們能看到這樣的程式碼:
request_irq(FLOPPY_IRQ, floppy_interrupt, - IRQF_DISABLED, "floppy", NULL) 現在
在2010年如下的commit中,IRQF_DISABLED被作廢了:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e58aa3d2d0cc

它的commit log清晰地解釋中斷嵌套可能引入的一些risk,比如stack溢出等。也就是說,從這個commit開始,實際Linux已經不再支援中斷的嵌套, 也沒有快慢中斷的概念了,IRQF_DISABLED標記也作廢了。在IRQ HANDLER裡面,無論一個中斷設置還是不設置IRQF_DISABLED, 內核都不會開啟CPU對中斷的響應:

這個作廢的IRQF_DISABLED標記,在內核已經沒有任何的意義了。後來,這個標記本身,在內核裡面也被刪除了,徹底成為過往:

硬體
中斷髮生後,一般硬體會自動屏蔽CPU對中斷的響應,而軟體層面上,直到IRQ HANDLER做完,才會重新開啟中斷。比如,對於ARM處理器而言,exception進來的時候,硬體都會自動屏蔽中斷:
也就是說,當ARM處理器收到中斷的時候,它進入中斷模式,同時ARM處理器的CPSR暫存器的IRQ位會被硬體設置為屏蔽IRQ。
Linux內核會在如下2個時候重新開啟CPSR對IRQ的響應:
- 從IRQ HANDLER返回中斷底半部的SOFTIRQ
- 從IRQ HANDLER返回一個執行緒上下文
從1大家可以看出,SOFTIRQ裡面是可以響應中斷的。
更多精彩更新中……歡迎關注微信公眾號:linux閱碼場(id: linuxdev)

