[linux内核][linux中断]——软中断机制
點擊打開鏈接
一,linux軟中斷的概念
軟中斷(softirq)常常表示可延遲函數的所有種類,目前linux上使用的軟中斷個數是有限的,linux最多注冊32個,目前使用了10個,在interrupt.h中定義,中斷上下文:表示內核當前正在執行一個中斷處理程序或者一個可延遲函數。軟中斷(即使同一類型的軟中斷)可以并發運行在多個CPU上,因此軟中斷是可重入函數必須使用自旋鎖保護其數據結構。一個軟中斷不會去搶占另外一個軟中斷。
軟中斷和tasklet的區別
由于軟中斷必須使用可重入函數,這就導致設計上的復雜度變高,作為設備驅動程序的開發者來說,增加了負擔。而如果某種應用并不需要在多個CPU上并行執行,那么軟中斷其實是沒有必要的。因此誕生了彌補以上兩個要求的tasklet。它具有以下特性:
a)一種特定類型的tasklet只能運行在一個CPU上,不能并行,只能串行執行。
b)多個不同類型的tasklet可以并行在多個CPU上。
c)軟中斷是靜態分配的,在內核編譯好之后,就不能改變。但tasklet就靈活許多,可以在運行時改變(比如添加模塊時)。
軟中斷的實現:
軟中斷由softirq_action結構體表示
?
[cpp]?view plaincopy- struct?softirq_action{??
- ?void?(*action)(struct?sotfirq_action*)??
- kernel/softirq.c中定義了一個包含有32個該結構體的數組??
- static?struct?softirq_action?softirq_vec[NR_SOFTIRQS]??
?
?
?
1,注冊軟中斷函數 open_softirq
[cpp]?view plaincopy- void?open_softirq(int?nr,?void?(*action)(struct?softirq_action?*))??
- {??
- ????/*?softirq_vec是個struct?softirq_action類型的數組?*/??
- ????softirq_vec[nr].action?=?action;??
- }??
2,觸發軟中斷的函數 raise_softirq 參見 kernel/softirq.c文件
?
[cpp]?view plaincopy- void?raise_softirq(unsigned?int?nr)??
- {??
- ????unsigned?long?flags;??
- ??
- ????local_irq_save(flags);??
- ????raise_softirq_irqoff(nr);??
- ????local_irq_restore(flags);??
- }??
?
?
?
?
3,執行軟中斷 do_softirq 參見 kernel/softirq.c文件,如果有待處理的軟中斷,do_softirq()會循環遍歷每一個,調用它們的處理程序。
- asmlinkage?void?do_softirq(void)??
- {??
- ????__u32?pending;??
- ????unsigned?long?flags;??
- ????/*?判斷是否在中斷處理中,如果正在中斷處理,就直接返回?*/??
- ????if?(in_interrupt())??
- ????????return;??
- ????/*?保存當前寄存器的值?*/??
- ????local_irq_save(flags);??
- ????/*?取得當前已注冊軟中斷的位圖?*/??
- ????pending?=?local_softirq_pending();??
- ????/*?循環處理所有已注冊的軟中斷?*/??
- ????if?(pending)??
- ????????__do_softirq();??
- ????/*?恢復寄存器的值到中斷處理前?*/??
- ????local_irq_restore(flags);??
- }??
4,執行相應的軟中斷 - 執行自己寫的中斷處理linux中,執行軟中斷有專門的內核線程,每個處理器對應一個線程,名稱ksoftirqd/n
轉載于:https://www.cnblogs.com/zhiliao112/p/4232157.html
總結
以上是生活随笔為你收集整理的[linux内核][linux中断]——软中断机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 泰拉瑞亚光之女皇怎么召唤?
- 下一篇: 途乐y61短轴版多少钱?