Linux Kernel5.10的软中断(softirq)的本质
快速鏈接:
.
👉👉👉 個人博客筆記導讀目錄(全部) 👈👈👈
說明:
在默認情況下,本文講述的都是ARMV8-aarch64架構(gòu),linux kernel 5.14
Linux Kernel的中斷的底半部分實現(xiàn)有三種,分別是:
- 軟中斷
- tasklet
- 工作隊列
軟中斷
軟中斷的本質(zhì)是什么?
其實就是在硬件中斷(也叫中斷頂半部分)執(zhí)行完畢后,通過wakeup_softirqd()的方式喚醒一個softirq隊列,然后中斷程序返回,softirq隊列也在適當?shù)臅r候開始執(zhí)行。
irq_handler —> gic_handle_irq() —> handle_domain_irq() —> __handle_domain_irq() —> 基本處理完硬件中斷后,調(diào)用—>irq_exit() —> —> __irq_exit_rcu() —> invoke_softirq() ----> __do_softirq()—>到此處(1)硬件中斷處理完成(即中斷上半部分執(zhí)行完成),gic_handle_irq()主函數(shù)返回;(2) 喚醒softirq隊列,中斷底半部分開始執(zhí)行
系統(tǒng)中有哪些軟中斷(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 }那么軟中斷,如何注冊、如何使用? 這重要嗎? 系統(tǒng)就這么幾種軟中斷,又不讓你去實現(xiàn)。我們的驅(qū)動中也一般不用,用的時候過來抄一抄即可,可搜索以下API
- 注冊軟中斷 open_softirq
- 觸發(fā)軟中斷 raise_softirq
- 執(zhí)行軟中斷 do_softirq
思考:軟中斷 是否可以睡眠?
個人認為,要看你的系統(tǒng)的配置。如下圖所示,如果是else里的配置,ksoftirqd也是task,故是可以睡眠的。如果是if里的配置,softirq就是一段程序而已,不是進程,沒有task_struct,所以是不能睡眠的
總結(jié)
以上是生活随笔為你收集整理的Linux Kernel5.10的软中断(softirq)的本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Kernel5.10的核间通
- 下一篇: armv8的Serror的理解