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. 软中断可以打断进程上下文;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值