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)