Linux Kernel5.10的软中断(softirq)的本质
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構,linux kernel 5.14
Linux Kernel的中斷的底半部分實現有三種,分別是:
- 軟中斷
- tasklet
- 工作隊列
軟中斷
軟中斷的本質是什么?
其實就是在硬件中斷(也叫中斷頂半部分)執行完畢后,通過wakeup_softirqd()的方式喚醒一個softirq隊列,然后中斷程序返回,softirq隊列也在適當的時候開始執行。
irq_handler —> gic_handle_irq() —> handle_domain_irq() —> __handle_domain_irq() —> 基本處理完硬件中斷后,調用—>irq_exit() —> —> __irq_exit_rcu() —> invoke_softirq() ----> __do_softirq()—>到此處(1)硬件中斷處理完成(即中斷上半部分執行完成),gic_handle_irq()主函數返回;(2) 喚醒softirq隊列,中斷底半部分開始執行
系統中有哪些軟中斷(softirq隊列里有什么),也是固定的,Linux Kernel中定義的軟中斷的定義如下:
(linux/include/linux/interrupt.h)enum {HI_SOFTIRQ=0,TIMER_SOFTIRQ,NET_TX_SOFTIRQ,NET_RX_SOFTIRQ,BLOCK_SOFTIRQ,IRQ_POLL_SOFTIRQ,TASKLET_SOFTIRQ,SCHED_SOFTIRQ,HRTIMER_SOFTIRQ,RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */NR_SOFTIRQS }; (linux/kernel/softirq.c)74 static void wakeup_softirqd(void) 75 { 76 /* Interrupts are disabled: no need to stop preemption */ 77 struct task_struct *tsk = __this_cpu_read(ksoftirqd); 78 79 if (tsk && tsk->state != TASK_RUNNING) 80 wake_up_process(tsk); 81 }那么軟中斷,如何注冊、如何使用? 這重要嗎? 系統就這么幾種軟中斷,又不讓你去實現。我們的驅動中也一般不用,用的時候過來抄一抄即可,可搜索以下API
- 注冊軟中斷 open_softirq
- 觸發軟中斷 raise_softirq
- 執行軟中斷 do_softirq
思考:軟中斷 是否可以睡眠?
個人認為,要看你的系統的配置。如下圖所示,如果是else里的配置,ksoftirqd也是task,故是可以睡眠的。如果是if里的配置,softirq就是一段程序而已,不是進程,沒有task_struct,所以是不能睡眠的
總結
以上是生活随笔為你收集整理的Linux Kernel5.10的软中断(softirq)的本质的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Kernel5.10的核间通
- 下一篇: Linux常用的基本命令ls、cd、mk