news 2026/10/31 3:31:34

Linux 启动流程全链路解析:从上电复位到 login 提示符,这一篇就够了!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux 启动流程全链路解析:从上电复位到 login 提示符,这一篇就够了!

📢 引言:按下电源键的那一刻,发生了什么?

你好,我是你们的底层技术探路者。

每天我们都在与 Linux 打交道,无论你是做嵌入式开发、服务器运维还是 Android ROM 定制。当你按下电源键,屏幕亮起,直到出现登录提示符,这短短几秒钟内,CPU 执行了数以亿计的指令。

这段旅程被称为Boot Process。它是计算机科学中最精妙的接力赛:

  1. ROM Code:点燃火炬。
  2. Bootloader:冲刺跑,初始化硬件。
  3. Kernel:接管世界,构建秩序。
  4. User Space:繁荣的文明建立。

今天,我将扒开 Linux 的外衣,深入源码(基于 ARM64 架构),带你彻底搞懂这条“全链路”。

本文硬核指数 ⭐⭐⭐⭐⭐,建议先收藏,再细品!


🏁 第一阶段:史前时代 —— 硬件上电与 ROM Code

在 Linux 内核介入之前,必须先有“立足之地”。

1.1 上电复位 (Power-on Reset)

当电压稳定后,SoC 内部的时序控制逻辑会产生复位信号。此时,CPU 的所有寄存器被重置,PC 指针 (Program Counter)指向一个固定的物理地址(通常是0xFFFF0000或0x00000000)。

1.2 BROM (Boot ROM)

这个地址映射的是 SoC 内部的一小块只读存储器(iROM)。这里的代码是芯片出厂时固化的,不可修改。
它的任务非常简单且关键:

  1. 初始化最基本的时钟。
  2. 检测启动介质(拨码开关决定是从 SD 卡、eMMC 还是 NAND Flash 启动)。
  3. 将 Bootloader 的第一阶段代码加载到片内 SRAM 中。

为什么是 SRAM?因为此时 DDR(内存)还没初始化,根本没法用!SRAM 虽然贵且小(通常只有几十 KB),但它不需要初始化就能直接读写。


🏃 第二阶段:短跑运动员 —— Bootloader (U-Boot)

Bootloader 的王者无疑是U-Boot。由于 BROM 只能加载很小的代码,U-Boot 通常设计为两级架构:SPL + U-Boot Proper。

2.1 SPL (Secondary Program Loader)

SPL 是 U-Boot 的“先遣队”,体积极小,运行在 SRAM 中。
核心任务:

  • 初始化 DDR 控制器:这是最重要的一步,让巨大的外部内存可用。
  • 将完整的 U-Boot (u-boot.bin) 搬运到 DDR 中。
  • 跳转到 DDR 执行。

2.2 U-Boot Proper (完全体)

此时我们已经运行在宽敞的 DDR 里了。U-Boot 开始大展拳脚:

  1. board_init_f(Frontend):初始化串口(为了打印 Log)、定时器、分配堆栈。
  2. board_init_r(Rear):初始化网卡、Flash、USB 等外设。
  3. 加载内核:读取uImage或Image到内存。
  4. 加载设备树 (DTB):读取.dtb文件到内存。

2.3 关键时刻:移交控制权

在 U-Boot 的最后,会执行bootm命令。它做了一件极具仪式感的事情——设置寄存器,然后通过汇编指令跳转。

对于 ARM64:

  • x0寄存器:存放设备树(DTB)在内存中的物理地址。
  • x1,x2,x3:通常保留为 0。
  • Jump:直接跳转到内核的入口地址。

Load SPL to SRAM

Init DDR & Load U-Boot

Load Kernel & DTB

Power On

BROM / ROM Code

U-Boot SPL

U-Boot Proper in RAM

Kernel Entry


🧠 第三阶段:内核觉醒 —— 汇编入口 (head.S)

从这里开始,我们进入 Linux Kernel 的源码世界。
入口文件通常位于arch/arm64/kernel/head.S。此时,MMU(内存管理单元)是关闭的,CPU 看到的还是物理地址。

3.1 核心动作

  1. 关闭中断:在世界秩序建立之前,不接受任何干扰。
  2. 校验 CPU ID:确认当前运行在哪个核上(Boot CPU 还是 Secondary CPU)。
  3. 校验 DTB:确认 U-Boot 传来的设备树地址是合法的。
  4. 创建临时页表:这是为了开启 MMU 做准备。Linux 内核使用的是虚拟地址(如0xffff...),必须建立物理地址到虚拟地址的映射。
  5. 开启 MMU:sctlr_el1寄存器写入,开启分页机制。
  • 瞬间变化:这一行汇编执行前,PC 指针是0x40080000(物理);执行后,PC 变成了0xffff8000...(虚拟)。

3.2 跳转到 C 语言

汇编的使命结束,代码跳转到start_kernel()。


🏗️ 第四阶段:大构建师 —— start_kernel()

这是 Linux 内核中最大的函数,位于init/main.c。它是整个操作系统的“构造函数”。

由于内容太多,我将其整理为一张 Mermaid 时序图:

rest_initsched_initmm_initsetup_archstart_kernelhead.Srest_initsched_initmm_initsetup_archstart_kernelhead.S0号进程 (Swapper) 诞生创建 1号进程 (Init) 和 2号进程 (Kthreadd)Jump to C code1. 解析 DTB, 确定内存布局return2. trap_init (初始化异常向量表)3. 内存管理初始化 (伙伴系统/Slub)return4. 调度器初始化 (CFS)return5. time_init (初始化系统时钟)6. 剩下的初始化

4.1 关键初始化详解

  1. setup_arch():解析设备树,确定有多少内存,保留内存(Reserved Memory)在哪里。
  2. mm_init():初始化内存分配器。从此以后,kmalloc可以工作了。
  3. sched_init():初始化进程调度器。从此以后,多任务成为可能。
  4. rest_init():这是start_kernel的最后一步。它不会返回,而是创建了两个祖先进程:
  • PID 1 (init):所有用户进程的祖先。
  • PID 2 (kthreadd):所有内核线程的祖先。
  • PID 0 (idle):自己退化为 idle 进程,没事做的时候就跑它(省电)。

🌍 第五阶段:文明建立 —— 用户空间 (User Space)

此时,内核已经就绪,但系统还是个“空壳”,因为没有用户程序。
PID 1 进程(通常是/sbin/init)开始执行。

5.1 挂载根文件系统 (Rootfs)

内核通过解析 cmdline 中的root=/dev/mmcblk0p2参数,找到根文件系统所在的存储分区,并将其挂载到 VFS 的根目录/。
如果这一步失败,你就会看到著名的Kernel panic - not syncing: VFS: Unable to mount root fs。

5.2 Init 系统的分歧

根据 Linux 发行版的不同,Init 程序分为三类:

  1. SysVinit(老派):读取/etc/inittab,依序执行脚本。简单但慢。
  2. Systemd(现代):并行启动服务,通过 Socket 激活。复杂但快。
  3. BusyBox Init(嵌入式):轻量级,读取/etc/init.d/rcS。

5.3 最终的 Shell

Init 进程会根据配置,启动getty进程监听串口或终端。
当你输入用户名密码验证通过后,getty会exec启动一个shell(如 bash 或 sh)。

屏幕上跳出:
Welcome to Linux 6.x
Login: _

恭喜你,系统启动完成!


❓ 常见启动故障排查 (Troubleshooting)

讲了这么多原理,最后送大家几个实战锦囊。

Q1: 卡在 “Starting kernel …” 不动了?

  • 原因:通常是 U-Boot 传给内核的 DTB 地址不对,或者内核崩溃在了串口驱动初始化之前(早期的汇编阶段)。
  • 解法:开启earlycon(早期控制台),在 bootargs 中加入earlycon=uart8250,mmio32,0x...,让内核在汇编阶段就能打印 Log。

Q2: 提示 “No init found”?

  • 原因:Rootfs 挂载成功了,但是找不到/sbin/init,或者该文件没有执行权限,或者架构不对(在 ARM 上跑了 x86 的程序)。
  • 解法:检查 Rootfs 制作过程,检查动态库依赖。

Q3: 内存识别不全(比如 4G 只有 2G)?

  • 原因:U-Boot 传递的内存参数不对,或者设备树里memory节点配置错误。

🎯 总结

Linux 的启动流程,是一场宏大的接力赛。

  • 硬件负责提供跑道。
  • Bootloader是第一棒,负责热身和起跑。
  • Kernel是第二棒,负责制定规则和构建环境。
  • Init是最后一棒,将应用生态带给用户。

理解了这个流程,你就不再是一个只会写代码的 Coder,而是一个拥有上帝视角的系统工程师。

🚀 下一步行动

你在调试 Linux 启动时遇到过最崩溃的问题是什么?

  • A. 卡在 U-Boot 进不去内核。
  • B. Rootfs 挂载失败,Panic。
  • C. 驱动加载时死机。

👉 欢迎在评论区留言交流!如果你想看如何手写一个简单的 Bootloader,请点赞告诉我,下期安排!


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/31 2:45:27

Redshift vs Octane 深度对比:哪款渲染器更适合 Cinema 4D 工作流程?

在 Cinema 4D 的世界里,选择合适的 GPU 渲染器能够显著提升你的创作效率和渲染质量。当前主流的两个选择是 Redshift 和 OctaneRender,它们各有特点,适合不同风格的项目需求。本文将从核心性能和工作流程体验角度,为你做一个清晰对…

作者头像 李华
网站建设 2026/10/31 3:39:14

【vtkPolyDataPointSampler 】——多边形数据点采样技术详解

VTK核心类解析:vtkPolyDataPointSampler 多边形数据点采样技术详解 简单说,vtkPolyDataPointSampler 就是 VTK里的 “点生成器”—— 专门给 3D 模型(比如三角形、多边形组成的物体)表面或内部,按需求打一堆采样点,生成的点云能直接用在后续的可视化、建模或计算里。 一…

作者头像 李华
网站建设 2026/10/26 11:03:00

电子签章选型指南:云巨头生态服务与垂直专业厂商的六大维度解析

随着电子签章应用在市场越来越普及和受追捧,超级大厂也相继推出了自己的电子签章产品,如华为的华为云电子签、阿里的阿里云电子签、腾讯的腾讯电子签服务。那这些大厂推出的电子签章产品和服务与传统第三方电子签公司北京安证通有什么相同和区别呢&#…

作者头像 李华
网站建设 2026/10/28 0:15:14

具身智能:行业成果与核心困难点全解析

具身智能作为 AI 与机器人融合的前沿领域,正从实验室走向产业应用,呈现出技术突破与落地挑战并存的发展态势。以下是当前行业成果与核心困难点的系统梳理。 一、行业成果:技术突破与场景落地加速 1. 核心技术突破 技术维度关键成果典型案例…

作者头像 李华
网站建设 2026/10/27 9:29:11

大模型微调全攻略:定制专属模型,简单得像打开浏览器

文章系统介绍大模型微调生态系统,详述多种开源(Qwen、DeepSeek等)和闭源(GPT、Claude等)模型特点及适用场景,对比全参数、LoRA/QLoRA等微调方法的算力需求与效果。重点推荐LLaMA-Factory Online平台,通过其可视化界面,开发者无需编…

作者头像 李华
网站建设 2026/10/31 4:25:01

⓫⁄₇ ⟦ OSCP ⬖ 研记 ⟧ Windows权限提升 ➱ 滥用Windows服务提权(上)

郑重声明:本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。 🔋 点赞 | 能量注入…

作者头像 李华