【译】《心悟内核:先懂设计,再读代码》—14、引导流程落幕:内核正式启动

📅 2026/8/19 14:48:12
【译】《心悟内核:先懂设计,再读代码》—14、引导流程落幕:内核正式启动
作者Moon Hee Lee原文 The Kernel in the Mind心悟内核:先懂设计再读代码——引导流程落幕内核正式启动在 Linux 系统中存在一个精确的关键节点标志着系统从硬件层级初始化切换至与架构无关的内核核心。这一节点由一个函数划定即定义于 /init/main.c 中的 start_kernel()。系统的执行起点远早于此最先运行的是引导加载程序。设备上电后系统固件初始化处理器与内存控制器随后加载 GRUB、U‑Boot 等引导程序。引导程序将内核镜像与可选的临时根文件系统 initrd 载入内存配置启动参数最终跳转至内核的架构专属入口。此后进入架构相关的初始化阶段该阶段由汇编语言与早期 C 语言代码实现。以 x86 平台为例涉及 head.S、head64.c 等底层文件。CPU 切换至 64 位长模式构建临时页表清空 BSS 段并初始化初始栈。此阶段系统仅运行在单核环境中断关闭、调度器未启用、无动态内存分配能力唯一目标是为 C 语言代码的执行准备安全的运行环境。最终执行流转抵达 C 语言层级入口例如 x86_64_start_kernel()再由该函数调用 start_kernel()。这一刻标志着硬件平台专属初始化流程结束通用架构无关的内核正式接管系统。start_kernel() 的早期代码运行在早期 C 环境中这是一个功能极简、约束严格的执行上下文内核后续依赖的绝大多数核心子系统均未就绪。此时尚无内存分配器、抢占机制与并发能力代码不能主动让出执行或阻塞等待只能完全依赖静态内存完成运行。为解决各类循环依赖问题内核采用分阶段初始化机制。轻量化的早期临时组件早期 RCU、早期日志打印 printk、memblock 内存分配器先行启用临时替代完整的系统模块确保各类依赖功能在系统早期拉起阶段可以安全运行。随着 start_kernel() 逐步执行整套核心基础设施按照严格顺序依次完成初始化内存分配器、调度器、定时器、中断机制、每 CPU 内存域、RCU 同步机制、工作队列。至此内核具备异步执行与并发调度的完整能力。系统基础环境稳定后内核依次执行各类初始化回调 initcall。这是一组结构化的函数执行序列负责拉起高层子系统包括块设备 I/O、文件系统、设备驱动、网络协议栈等。最后内核调用 rest_init()创建首批内核线程内核守护线程 kthreadd以及用于拉起用户空间的初始进程通常为 /sbin/init或降级兜底的命令行终端。至此内核完全就绪。系统开始调度各类任务、处理 I/O 与硬件中断、统一管理内存并跨多核协调所有子系统协同运行。start_kernel() 绝非普通函数它是 Linux 实现自举的核心枢纽。通过分层设计、静态前置布局与严谨的初始化时序它打通了裸机硬件到完整运行系统的关键链路化解组件间的相互依赖。跨过这一界限后内核不再被动适配硬件而是完全依照自身规则独立运转。如本文对你有些许帮助欢迎大佬支持我一下点赞收藏关注、关注公众号等您的支持是我持续创作的竭动力支持我的方式