共计 945 个字符,预计需要花费 3 分钟才能阅读完成。
本文系转载,著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
来源:微信公众号 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/sc…
它的 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)