本文系轉載,著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。linux
來源: 微信公衆號linux閱碼場(id: linuxdev)git
問:Linux的中斷能夠嵌套嗎?微信
答:之前是能夠嵌套的,如今不能夠!線程
早前的Linux內核版本,中斷分爲兩種:3d
快中斷,申請的時候帶IRQF_DISABLED標記,在IRQ HANDLER裏面不容許新的中斷進來;code
慢中斷,申請的時候不帶IRQF_DISABLED標記,在IRQ HANDLER裏面容許新的其餘中斷嵌套進來。blog
老的Linux內核中,若是一箇中斷服務程序不想被別的中斷打斷,咱們能看到這樣的代碼:get
request_irq(FLOPPY_IRQ, floppy_interrupt,\ - IRQF_DISABLED, "floppy", NULL)
在2010年以下的commit中,IRQF_DISABLED被做廢了:it
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e58aa3d2d0ccio
它的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的響應:
從1你們能夠看出,SOFTIRQ裏面是能夠響應中斷的。
更多精彩更新中……歡迎關注微信公衆號:linux閱碼場(id: linuxdev)