Linux设备驱动程序 之 中断和锁

 中断和锁

1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;

硬中断可以打断软中断,所以软中断中访问共享数据需要禁止中断;考虑如下情况,当软中断中获取到锁,之后被硬中断打断,硬中断此时尝试获取锁,因为锁已经被软中断持有,硬中断获取不到,产生死锁;

2. 硬中断和进程上下文共享数据,硬中断中使用spin_lock/spin_unlock,进程上下文中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;

硬中断可以打断进程上下文,所以进程上下文中访问共享数据需要禁止中断;考虑如下情况,当进程上下文中获取到锁,之后被硬中断打断,硬中断此时尝试获取锁,因为锁已经被进程上下文持有,硬中断获取不到,产生死锁;

3. 多个相同硬中断共享数据,不存在这种情况;

同一个中断处理程序同时只有一个实例,当一个中断处理程序运行时,相应中断线在所有处理器上都会屏蔽掉;

4. 多个不同的硬中断共享数据,需要使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore;

硬中断可以被一个比自己优先级高的硬中断打断,考虑如下情况,当优先级低的中断中获取到锁,之后被优先级高的中断打断,高优先级中断此时尝试获取锁,因为锁已经被低优先级中断持有,高优先级中断获取不到,产生死锁;

5. 软中断(包括tasklet和timer)和进程上下文共享数据,软中断中需要使用spin_lock/spin_unlock,进程上下文中需要使用spin_lock_bh/spin_unlock_bh;

软中断可以打断进程上下文,所以进程上下文中访问共享数据需要禁止中断下半部;考虑如下情况,当进程上下文中获取到锁,之后被软中断打断,软中断此时尝试获取锁,因为锁已经被进程上下文持有,软中断获取不到,产生死锁;

6. 多个相同软中断(不包括tasklet和timer)之间共享数据,需要使用spin_lock/spin_unlock;

多个相同的软中断可以在不同CPU上同时运行,他们之间访问共享数据需要加锁;

7. 多个不同软中断(不包括tasklet和timer)之间共享数据,需要使用spin_lock/spin_unlock;

多个不同的软中断可以在不同CPU上同时运行,他们之间访问共享数据需要加锁;

8. 多个相同tasklet(timer)之间共享数据,不存在这种情况;

tasklet(timer)同时只会有一个实例运行,在SMP环境也是如此,只有一个运行中的实例,不需要加锁;

9. 多个不同tasklet(timer)之间共享数据,需要使用spin_lock/spin_unlock;

多个不同的tasklet(timer)是可以在不同CPU上同时运行的,他们之间访问共享数据需要加锁;

中断打断关系

1. 同类型的硬中断同时只会有一个实例执行,SMP环境也是如此,同级中断会被屏蔽掉;

2. 不同类型的硬中断可以同时在不同CPU上同时执行;

3. 同一个CPU上的优先级高的硬中断可以打断优先级低的硬中断;

4. 硬中断可以打断软中断,可以打断进程上下文;

5. 相同软中断(不包括tasklet和timer)可以在不同CPU上同时执行;

6. 同一个CPU上的软中断(不包括tasklet和timer)是串行执行的,他们不会互相抢占;

7. 相同tasklet(timer)同时只会有一个实例执行,SMP环境也是如此;

8. 不同的tasklet(timer)可以同时在不同的CPU上同时执行;

9. 软中断可以打断进程上下文;

 

本文链接:Linux设备驱动程序 之 中断和锁

转载声明:转载请注明来源:Linux TCP/IP Stack,谢谢!


发表评论

电子邮件地址不会被公开。 必填项已用*标注