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. 軟中斷可以打斷進程上下文;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM