Linux的中断能够嵌套吗?

本文系转载,著做权归做者全部。商业转载请联系做者得到受权,非商业转载请注明出处。linux

来源: 微信公众号linux阅码场(id: linuxdev)git

file

问答

问: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

file

它的commit log清晰地解释中断嵌套可能引入的一些risk,好比stack溢出等。也就是说,从这个commit开始,实际Linux已经再也不支持中断的嵌套, 也没有快慢中断的概念了,IRQF_DISABLED标记也做废了。在IRQ HANDLER里面,不管一个中断设置仍是不设置IRQF_DISABLED, 内核都不会开启CPU对中断的响应:

file

这个做废的IRQF_DISABLED标记,在内核已经没有任何的意义了。后来,这个标记自己,在内核里面也被删除了,完全成为过往:

file

硬件

中断发生后,通常硬件会自动屏蔽CPU对中断的响应,而软件层面上,直到IRQ HANDLER作完,才会从新开启中断。好比,对于ARM处理器而言,exception进来的时候,硬件都会自动屏蔽中断:

也就是说,当ARM处理器收到中断的时候,它进入中断模式,同时ARM处理器的CPSR寄存器的IRQ位会被硬件设置为屏蔽IRQ。

Linux内核会在以下2个时候从新开启CPSR对IRQ的响应:

  1. 从IRQ HANDLER返回中断底半部的SOFTIRQ
  2. 从IRQ HANDLER返回一个线程上下文

从1你们能够看出,SOFTIRQ里面是能够响应中断的。

更多精彩更新中……欢迎关注微信公众号:linux阅码场(id: linuxdev)

相关文章
相关标签/搜索