linux 中断没有优先级的问题
本文是原「蜗窝讨论区」的历史存档(2016-10-13),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。
现在比较新的Linux内核中断还是没有优先级区分吗?那么没有优先级的话,只要一个类型的中断上半部在执行,随便其他类型的中断都可以打断它,发生中断嵌套。
那么如果正在执行的是时钟tick等一些比较重要的中断,被一些不重要的中断经常打断时,这些不重要的中断上半部如果设计的不怎么好,执行时间过长的话,Linux怎么保证时钟tick及其他对时延要求很苛刻的中断的及时响应呢?
现在一些RTOS都有中断优先级概念,保证高优先级任务处理时不被低优先级中断打扰,Linux在中断设计方面感觉做的实时性还是比较差?
其实新版本的内核已经不再区分fast handler(全程关闭本地中断)和slow handler了(开中断,其他类型的interrupt可以中断该handler的执行),取而代之的是全部采用了fast handler,也就是说,该handler会安安静静的全部执行完毕,不会被其他中断打断(除非你的handler中自己主动打开中断)。当然,配合这样的设计,所有的中断的handler(即上半部处理)都必须尽快完成,如果需要消耗非常多的CPU,那么考虑推迟到bottom half去执行。
中断优先级,这似乎应该是中断控制器的内容,GIC其实是支持中断优先级的概念的。
我已经明白了,谢谢 linuxer, 我查到我当前Linux版本时3.0.35,这个版本的./include/linux/interrupt.h 对IRQF_DISABLED的描述是: keep irqs disabled when calling the action handler. * DEPRECATED. This flag is a NOOP and scheduled to be removed
就是说内核实现为空,这应该就是说明该版本内核,用户自定义的中断上半部执行时,不会被其他任何中断打断的,会全部执行完毕的,是吧。 因为因为废弃IRQF_DISABLED这个FLAG后,肯定默认行为是中断执行时,禁止其他中断的执行。
