Board logo

标题: linux的中断线程化实现 [打印本页]

作者: yuyang911220    时间: 2017-6-11 15:57     标题: linux的中断线程化实现

2.6.25.8内核实现了中断线程化,内核为每一个中断向量建立了一个中断线程,具体就是在结构irq_desc中增加了一个task_struct来代表这个线程:

在中断产生的时候,还是和往常一样进入do_IRQ,这个函数几乎没有 什么变化,在do_IRQ中调用了irq_desc的handle_irq函数,这个handle_irq是向量相关的,比如有边缘触发等等,这个方式涉 及到了硬件规程,故不深入讨论,实际上,每个总线邦定到一个中断向量,而总线的中断方式是总线相关的所以中断向量的方式也就和硬件相关了,这里就以 Level type为例来说明,Level type的handle_irq是handle_level_irq:

我们看看每个中断向量的中断线程是怎么初始化的,初始化的细节可以带给我们一大部分必要的信息,在实际开发中一定注意这一点,一个好的初始化带来的是将来操作的方便与清晰:

最终在thread_XX_irq中调用handle_IRQ_event来实际处理中断请求。当该中断向量上没有中断要处理的时候,对应的中断线程就主动切出了,而中断来临的时候redirect_hardirq会wakeup对应向量上的中断线程。
   现在我们来看看linux中断线程化的意义,传统的linux内核上,中断都是作为最高优先级的执行绪存在的,它实际上并没有什么软件优先级的概念,而是 硬件架构决定了硬件中断到来的时候在该中断没有被屏蔽的条件下必须处理,即便是linux中最高优先级的实时进程也要向中断让路,这就大大削弱了 linux的实时性能,一个实时任务正在运行,将一直被中断打断,特别是在网络负载大的时候,虽然linux将耗时的操作都置于软中断,但是毕竟哪怕很小 延时的硬件中断也要延时,多个小的延时积累起来可能会有很大的延时,这不是实时操作所希望的,于是就有了一种想法,能否让中断也参与到优先级排队,于是中 断线程化就是必然结果了。可是即便大操作放到了线程中,但是毕竟像common_interrupt和do_IRQ还是没有在线程中进行,因此还是会有中 断打断实时任务,linux的这种中断线程化实现仅仅将实时任务被硬件打断的延时降低到了很低的程度,实时任务被中断打断本身并没有得到改善,改善这个境 地的一个方案就是引入硬件中断优先级并和线程优先级联系,在处理实时任务时非使能屏蔽掉不相关的任何硬件中断,使它们不再发生,就像solaris那样, 当然这可以利用硬件的特性,引入“cpu当前优先级”的概念,当cpu处于优先级p时,任何低于p的中断都不能发生,cpu当前优先级和线程优先级以及中 断优先级直接关联,关于这个方案的实现可以参考windows的IRQL或者solaris的IPL。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0