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

相关推荐
刚入门的大一新生3 分钟前
Linux-进程池
linux·运维·服务器
YB13756 分钟前
Jetpack Compose 动画animate*AsState
android
高晶9 分钟前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
隐擎fox1 小时前
深入 Android 移动端风控与协议层对抗:内核级虚拟环境检测、网络堆栈特征伪装与住宅 IP 协同实战
android·网络·python·网络协议·tcp/ip
鱼很腾apoc1 小时前
【MySQL】第4期 用户管理与 C 语言连接编程详解
linux·服务器·c语言·mysql·connector/c
刚入门的大一新生1 小时前
Linux-进程间通信1
linux·运维·服务器
张宇Joaquin2 小时前
Linux系统下磁盘扇区512n、512e和4kn的区别
linux·运维·数据库
道虽迩,不行不至2 小时前
数据库自动连库执行增量脚本-Linux
linux·数据库
GeW2 小时前
新质生产力发展路线图来了,Linux和数据库人该怎么接
linux·数据库
yunwei372 小时前
eBPF 示例:使用 CUPTI 构建 GPU 火焰图分析器
linux·后端·性能优化