在SMP系统上并行运行同一中断的多个实例

时间:2014-08-05 17:11:16

标签: linux-kernel linux-device-driver interrupt interrupt-handling

是否可以在linux中的多处理器系统上同时运行同一中断的多个实例? 如果不可能,为什么我们需要使用自旋锁在中断处理程序之间进行同步?

由于 卡塔斯

2 个答案:

答案 0 :(得分:1)

Is it possible to run multiple instances of a same interrupt simultaneously on a multi processor system in linux?

中断处理程序通常是序列化的。意思是,只有一个处理程序实例正在运行(在任一处理器上)。当它正在运行时,如果再次生成相同类型的中断,则仅在当前中断完成后对其进行处理,从而进行序列化。虽然"这个"处理程序由其中一个核心执行,其他核心可能是不同实例的服务处理程序。

Why do we need to synchronize between interrupt handlers using spin locks?

即使在这种情况下也要使用自旋锁,因为必须保护数据不受某些其他线程的影响(例如,下半部分,用户读/写处理函数等)。 场景可能是这样的:

my_ISR()
{
    lock(&l);
    // data is accessed here
    unlock(&l);    
}

my_other_thread()
{
    lock(&l);
    // same data is accessed here
    unlock(&l);
}

答案 1 :(得分:0)

在SMP架构上,高级可编程中断控制器( APIC )用于将来自外设的中断路由到CPU。

APIC,基于
1。路由表(中断亲和性设置为特定处理器),
2.中断的优先级,
3. CPU上的负载

例如,考虑在IRQ第32行接收到中断,这通过APIC,中断被路由到特定的CPU,现在考虑CPU0,这个中断线被屏蔽,直到ISR被处理,这意味着你将如果正在执行ISR,则不会获得相同类型的中断

一旦处理完ISR,只有中断线未被屏蔽以备将来中断