(参考:Linux内核6.18.8)


Linux 内核启动与调度:从 secondary_startup_64 到 pick_eevdf 的调用栈深度解析
在 Linux 内核的启动过程中,辅助 CPU 核心(Secondary CPU)的唤醒与初始化是多核系统协同工作的基石。通过分析 GDB 调试输出的调用栈(Backtrace)及其对应的流程图,我们可以清晰地窥见从底层汇编入口到高级进程调度算法的完整执行路径。1. 核心启动的"接力跑"调用栈的底部揭示了 x86_64 架构下辅助核心的启动序列。流程始于汇编语言编写的入口点 secondary_startup_64(head_64.S),这是 CPU 上电后的第一条指令执行处。随后,控制权移交至 C 语言环境,依次经过 x86_64_start_kernel 和 x86_64_start_reservations,完成内存布局确认与早期硬件保留区的处理。这一阶段标志着 CPU 从实模式或保护模式正式迈入长模式(Long Mode),为内核运行做好准备。2. 初始化与调度的交汇随着 start_kernel 的执行,内核完成了大部分子系统的初始化。紧接着,rest_init 函数被调用,它负责启动内核线程(如 kthreadd)并执行最终的清理工作。值得注意的是,调用栈显示在 rest_init 中触发了 schedule_preempt_disabled。这表明在内核初始化的关键阶段,系统主动发起了一次调度,且此时处于抢占被禁用的状态,以确保上下文切换的原子性与安全性。3. CFS 调度器的深层逻辑进入调度核心后,调用链展示了经典的 CFS(完全公平调度器)逻辑:__schedule -> pick_next_task -> __pick_next_task。当调度类判定为公平调度类时,流程进入 pick_next_task_fair。最引人注目的是栈顶的 pick_eevdf 函数。这是 Linux 6.6 内核引入的重大变革------EEVDF(Earliest Eligible Virtual Deadline First)算法取代了运行多年的 CFS rb-tree 逻辑。pick_eevdf 负责根据虚拟截止时间(vdelay)来挑选下一个最"渴望"运行的任务实体(sched_entity),标志着 Linux 调度器进入了更精准的低延迟时代。综上所述,这段调用栈不仅记录了 CPU 核心的启动过程,更见证了 Linux 调度算法的历史性迭代,是理解现代操作系统底层机制的绝佳样本。