
Linux 6.12 内核源码深度解析:__do_softirq与软中断机制📌 技术点速览在 Linux 内核中,__do_softirq是下半部(Bottom Half)软中断处理的核心入口函数。它解决了“如何在保证硬中断(Hard IRQ)快速响应的同时,延迟处理耗时且非即时的后续任务”这一关键问题。该函数处于硬件中断处理程序与进程调度器之间的过渡地带,属于CoreKernel (内核核心服务)模块。它通过精妙的上下文切换与时间片控制,既避免了硬中断长时间占用 CPU 导致的中断丢失,又防止了软中断无限期延迟导致的用户进程饥饿。🗺️ 软件功能架构图以下是基于 Linux 6.12 源码设计的软中断执行与跨模块协同架构图。图中清晰展示了从Arch_ARM64硬件中断输入,到CoreKernel软中断核心处理,再到Scheduler调度器托管的完整生命周期。🔍 核心源码硬核解析 (基于 Linux 6.12)在 Linux 6.12 中,__do_softirq的实现进行了高度抽象。其在kernel/softirq.c中的定义非常简短,直接委托给了handle_softirqs函数:/* 源码路径: kernel/softirq.c */ asmlinkage __visible void __softirq_entry __do_softirq(void) { handle_softirqs(false); // 传入 false,表示当前并非处于 ksoftirqd 线程上下文中 }下面我们对核心实现函数handle_softirqs进行逐行硬核剖析。该函数承载了CoreKernel模块的核心职责:安全、高效、受控地分发并执行软中断回调。/* 源码路径: kernel/softirq.c */ static void handle_softirqs(bool ksoftirqd) { unsigned long end = jiffies + MAX_SOFTIRQ_TIME; // 限制单次软中断处理的最大时间(2ms) unsigned long old_flags = local_irq_save(); // 保存当前 CPU 的中断状态,并关闭本地硬中断 __u32 pending; int max_restart = MAX_SOFTIRQ_RESTART; // 限制最大循环处理次数(10次),防止软中断风暴 struct softirq_action *h; /* * 1. 获取当前 CPU 的软中断挂起状态位图。 * 每个 bit