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

相关推荐
xbzb1 小时前
Linux iSCSI 存储部署与 CHAP 认证完全指南
linux·服务器·iscsi·chap·共享硬盘
事圆则缓1 小时前
面向对象六大基本原则:从概念到 Android 实战
android
IT大白鼠2 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 5 篇 · 多模态与虚拟化AI 能「看」图:多模态与虚拟化管理
linux·运维·人工智能
斑马1392 小时前
ARM学习笔记(七)——LCD液晶显示
arm开发·笔记·学习
IT大白鼠2 小时前
彭大帅的AI运维助手——自然语言管理 Linux 集群与网络设备——第 2 篇 · 安全守规矩的 AI:分级安全管控是灵魂
linux·运维·人工智能
风华同学2 小时前
免密SSH登录Ubuntu
linux·运维·ubuntu
꯭自꯭闭꯭2 小时前
达梦守护集群手工切换及故障切换
linux·运维·服务器·数据库
程序员-珍2 小时前
关于协程相关问题
android·安卓
wdfk_prog2 小时前
Wi-Fi Direct 教程 04:Interface 协议子系统初始化——WPA/EAPOL、WPS、DPP/NAN、GAS 与 P2P callback
android·运维·服务器·ubuntu·p2p·wps·wifi-direct