Linux 内核源码解析:从 secondary_startup_64 到 pick_eevdf 的完整调用栈分析

(参考: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 调度算法的历史性迭代,是理解现代操作系统底层机制的绝佳样本。

相关推荐
好的佩奇11 小时前
Dart 之扩展类型
android·flutter·dart
alexhilton13 小时前
2027 Android 开发者路线图:学习、面试与 AI
android·kotlin·android jetpack
LongRunning13 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
灿飞屋15 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓
疯华整猫16 小时前
我用 Trae 把 Android 内存账重算了一遍
android·性能优化·源码
民乐团扒谱机16 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
물の韜16 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
qq_3718021117 小时前
Ubuntu Linux中安装WorkBuddy
linux·运维·服务器·ubuntu
无足鸟ICT17 小时前
【RHCA+】iptraf-ng(网络监控分析)
linux·网络
独隅17 小时前
WebStorm 在 Linux 环境下的实战安装与高效开发指南
linux·ide·webstorm