启动与初始化
这页帮助你理解:Linux 内核不是一开机就“全部就绪”,而是按顺序把内存、CPU、调度、中断、设备等能力一点点搭起来。学这页的意义,不是背步骤,而是建立“系统是逐步成形的”这种感觉。
这块是什么
启动与初始化讲的是系统从上电、引导器把内核装入内存,到内核逐步建立自己的运行环境,并最终启动用户空间的整个过程。它像搭舞台:舞台没搭好,后面的演员都上不来。
你现在不用记住所有启动细节顺序,只要先知道:启动阶段的职责是把“系统能稳定运作的最基础条件”建立起来。
它负责什么
建立最初运行环境
- 识别当前平台和启动信息
- 准备最早期内存
- 建立基础 CPU 运行环境
- 让内核能先站起来,而不是立刻功能完整
拉起核心子系统
- 初始化中断与定时器
- 初始化调度和进程基础设施
- 初始化内存管理框架
- 让内核从“能跑”走向“能协调各类资源”
把系统交给正常流程
- 挂起各类内核线程和后台机制
- 初始化设备和驱动框架
- 启动第一个用户空间流程
- 把系统从内核自举阶段切换到常态运行阶段
大致可以分成哪几段
| 阶段 | 你现在怎么理解 | 为什么它重要 |
|---|
| 引导前半段 | 固件和 bootloader 把内核镜像装进内存,并准备启动参数。 | 没有这一步,内核甚至没机会开始自己的初始化。 |
| 早期内核阶段 | 很多高级功能还不可用,只能先搭最核心的运行条件。 | 它解释了为什么“早期内存”和“正常内存管理”不是同一回事。 |
| 子系统初始化 | 调度、内存、中断、设备等基础能力逐个被拉起。 | 后面你看到的很多子系统,都在这里找到各自的进入时机。 |
| 进入用户空间 | 内核完成自举后,把系统交给第一个用户空间进程。 | 这标志着系统真正从“搭台”进入“正常服务”状态。 |
核心概念
| 概念 | 现在怎么理解 |
|---|
| 引导链 | 从固件到引导器,再到内核自身启动的接力过程。 |
| 早期初始化 | 在很多高级功能还没准备好之前,先把最基础能力搭起来。 |
| init | 内核把系统拉起后,需要进入用户空间的第一个关键入口。 |
| 启动参数 | 外部传给内核的配置和控制信息,影响启动行为。 |
| 平台相关初始化 | 不同架构和硬件平台,会有自己特定的一部分早期启动逻辑。 |
为什么重要
- 这页帮助你建立“内核不是天生完整,而是逐步建立能力”的系统感。
- 很多你后面见到的模块,都会默认某些基础环境已经由启动阶段搭好了。
- 如果不理解启动阶段,你很容易把系统看成一大团同时存在的代码,而不是有次序的系统。
常见误解
- 误解一:启动只是“把内核装起来”。实际上它还要逐步建立运行规则和资源管理基础。
- 误解二:启动阶段和后面模块没关系。实际上后续模块的很多约束,都来自启动时哪些条件已经具备。
- 误解三:只要学驱动和文件系统,启动可以跳过。事实上它决定你是否能理解这些模块为什么以某种顺序被组织。
它不负责什么
- 它不负责长期资源调度,那是调度器长期在做的事。
- 它不负责日常文件访问,那是文件系统和 VFS 的职责。
- 它不负责具体业务逻辑,它只负责让整个系统能站起来并进入稳定运行状态。
它和其他模块的关系
| 相关模块 | 关系 |
|---|
| 内存管理 | 启动期必须先有最基础的内存能力,否则无法继续初始化别的模块。 |
| 调度器 | 初始化后系统才真正具备多任务运行的能力。 |
| 中断/定时器 | 很多外部事件处理能力必须在早期就建立。 |
| 驱动框架 | 设备不可能在系统能力都没搭好前完整接入。 |
最容易在哪些地方开始混
| 容易混的点 | 现在先怎么分开 | 为什么这很重要 |
|---|
| bootloader 和内核启动 | bootloader 负责把内核装进来并交棒,内核负责把系统自己搭起来。 | 这样你以后看启动问题时,才知道是在“把内核叫起来”之前出错,还是在“内核自举”过程中出错。 |
| 早期初始化和正常运行期 | 早期阶段很多常规能力还没齐,很多做法只是为了先活下来。 | 这解释了为什么某些初始化代码风格和正常路径很不一样。 |
| 启动顺序和模块功能 | 有些模块本身并不复杂,但必须在正确时机被拉起。 | 学习内核时,先后关系常和功能本身一样重要。 |
| 进入用户空间和内核工作结束 | 进入用户空间不是内核“退场”,而是系统开始进入长期协作状态。 | 这能帮助你把“启动完毕”和“内核不再参与”这两个错误直觉分开。 |
读完这页后,你应该能回答
- 为什么内核启动不是“一下子全部可用”?
- 为什么早期内存和正常内存管理要分开理解?
- 为什么后续各大模块都隐含依赖启动阶段已经把基础环境搭好?
后面如果你想继续深问,适合问:内核和 bootloader 的边界是什么?第一个用户空间进程为什么重要?早期内存和正常内存管理有什么区别?