查看原文
其他

Linux的中断可以嵌套吗?

宋宝华 Linux阅码场 2022-12-14

问答

问:Linux的中断可以嵌套吗?

答:以前是可以嵌套的,现在不可以!

历史

早前的Linux内核版本,中断分为两种:

  1. 快中断,申请的时候带IRQF_DISABLED标记,在IRQ HANDLER里面不允许新的中断进来;

  2. 慢中断,申请的时候不带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的响应:

  1. 从IRQ HANDLER返回中断底半部的SOFTIRQ

  2. 从IRQ HANDLER返回一个线程上下文


从1大家可以看出,SOFTIRQ里面是可以响应中断的。

(完)


"Linux阅码场"是专业的Linux及系统软件技术交流社区,Linux系统人才培养基地,企业和Linux人才的连接枢纽。


查看我们精华技术文章请移步:

Linux阅码场精华文章汇总


求职招聘请移步:

Linux阅码场: 连接企业和Linux人才的platform总线


扫描二维码关注我们 

如果觉得好,请

转发

转发

转发

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存