日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[linux内核][linux中断]——软中断机制

發布時間:2023/11/27 生活经验 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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
  1. struct?softirq_action{??
  2. ?void?(*action)(struct?sotfirq_action*)??
  3. kernel/softirq.c中定義了一個包含有32個該結構體的數組??
  4. static?struct?softirq_action?softirq_vec[NR_SOFTIRQS]??

?

?

?

1,注冊軟中斷函數 open_softirq

[cpp]?view plaincopy
  1. void?open_softirq(int?nr,?void?(*action)(struct?softirq_action?*))??
  2. {??
  3. ????/*?softirq_vec是個struct?softirq_action類型的數組?*/??
  4. ????softirq_vec[nr].action?=?action;??
  5. }??


2,觸發軟中斷的函數 raise_softirq 參見 kernel/softirq.c文件

?

[cpp]?view plaincopy
  1. void?raise_softirq(unsigned?int?nr)??
  2. {??
  3. ????unsigned?long?flags;??
  4. ??
  5. ????local_irq_save(flags);??
  6. ????raise_softirq_irqoff(nr);??
  7. ????local_irq_restore(flags);??
  8. }??

?

?

?

?


3,執行軟中斷 do_softirq 參見 kernel/softirq.c文件,如果有待處理的軟中斷,do_softirq()會循環遍歷每一個,調用它們的處理程序。

[cpp]?view plaincopy
  1. asmlinkage?void?do_softirq(void)??
  2. {??
  3. ????__u32?pending;??
  4. ????unsigned?long?flags;??
  5. ????/*?判斷是否在中斷處理中,如果正在中斷處理,就直接返回?*/??
  6. ????if?(in_interrupt())??
  7. ????????return;??
  8. ????/*?保存當前寄存器的值?*/??
  9. ????local_irq_save(flags);??
  10. ????/*?取得當前已注冊軟中斷的位圖?*/??
  11. ????pending?=?local_softirq_pending();??
  12. ????/*?循環處理所有已注冊的軟中斷?*/??
  13. ????if?(pending)??
  14. ????????__do_softirq();??
  15. ????/*?恢復寄存器的值到中斷處理前?*/??
  16. ????local_irq_restore(flags);??
  17. }??



4,執行相應的軟中斷 - 執行自己寫的中斷處理linux中,執行軟中斷有專門的內核線程,每個處理器對應一個線程,名稱ksoftirqd/n

轉載于:https://www.cnblogs.com/zhiliao112/p/4232157.html

總結

以上是生活随笔為你收集整理的[linux内核][linux中断]——软中断机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。