嵌入式 Linux 启动过程概述

georgegeorge
2 min read

嵌入式 Linux 系统的启动过程通常比桌面系统要复杂一些,因为它需要初始化硬件,加载操作系统内核,最终运行应用程序。这个过程大致可以分为以下几个阶段:

  1. 上电复位 (Power-On Reset): 当系统上电时,CPU 会执行预先定义的复位向量处的代码。

  2. 第一阶段引导加载程序 (First Stage Bootloader): 这通常是 ROM 或 SPL (Secondary Program Loader) 的角色,负责最小化的硬件初始化和加载第二阶段引导加载程序。

  3. 第二阶段引导加载程序 (Second Stage Bootloader): 这通常是 U-Boot (Universal Boot Loader) 的角色,负责更复杂的硬件初始化,加载 Linux 内核,以及传递启动参数。

  4. Linux 内核启动: Linux 内核被加载到内存并开始执行,初始化系统,并最终启动用户空间进程。

  5. 用户空间启动: init 系统(如 systemd 或 initscripts)启动,加载系统服务,最终启动用户应用程序。

ROM (Read-Only Memory)

  • 角色: ROM 是指固化在芯片中的只读存储器,通常包含 CPU 架构的初始启动代码。

  • 功能:

    • 复位向量: CPU 上电复位后,会从 ROM 中预定义的地址开始执行代码。

    • 最小化初始化: ROM 代码通常非常小,只执行最基本的硬件初始化,例如设置时钟、配置内存控制器等。

    • 加载 SPL: ROM 代码的主要任务是找到并加载 SPL (Secondary Program Loader) 到 RAM 中。

  • 特点:

    • 不可修改: ROM 内容在制造时被写入,不能轻易更改。

    • 启动起点: 是整个启动过程的起点。

    • 平台相关: 不同的 CPU 架构和芯片通常有不同的 ROM 代码。

SPL (Secondary Program Loader)

  • 角色: SPL 是第一阶段引导加载程序,通常比 ROM 代码更复杂一些。

  • 功能:

    • 更进一步的硬件初始化: SPL 会执行更进一步的硬件初始化,例如初始化 DDR 内存、配置存储设备等。

    • 加载 TPL 或 U-Boot: SPL 的主要任务是找到并加载 TPL (Third Program Loader) 或 U-Boot 到 RAM 中。

  • 特点:

    • 可修改: SPL 通常存储在可擦写的存储器中 (如 NAND Flash 或 SPI Flash),可以被更新。

    • 资源有限: SPL 通常运行在资源受限的环境中,代码大小和功能有限。

    • 简化版引导: SPL 的主要目的是引导更强大的引导加载程序。

  • 变体: 在某些系统中,SPL 也可能被称为 FSBL (First Stage Boot Loader) 或其他名称。

TPL (Third Program Loader)

  • 角色: TPL 是一个可选的引导加载程序阶段,通常介于 SPL 和 U-Boot 之间。

  • 功能:

    • 更精细的初始化: TPL 通常用于执行更精细的硬件初始化,例如初始化特定外设。

    • 加载 U-Boot: TPL 的主要任务是加载 U-Boot 到 RAM 中。

  • 特点:

    • 可选: TPL 不是所有系统中都存在的,有些系统会直接从 SPL 加载 U-Boot。

    • 过渡: TPL 通常作为 SPL 和 U-Boot 之间的过渡。

    • 复杂性: TPL 的复杂性通常介于 SPL 和 U-Boot 之间。

U-Boot (Universal Boot Loader)

  • 角色: U-Boot 是第二阶段引导加载程序,也是最常见和功能最强大的引导加载程序。

  • 功能:

    • 完整的硬件初始化: U-Boot 会执行几乎所有硬件的初始化。

    • 加载 Linux 内核: U-Boot 可以从各种存储设备(如 Flash、SD 卡、网络)加载 Linux 内核到 RAM 中。

    • 传递启动参数: U-Boot 可以设置 Linux 内核的启动参数,例如根文件系统位置、设备树等。

    • 提供用户交互界面: U-Boot 通常提供一个命令行界面,允许用户进行配置、调试和管理。

    • 支持多种文件系统: U-Boot 支持多种文件系统,方便加载内核和文件系统。

    • 网络功能: U-Boot 可以通过网络加载内核和文件系统。

  • 特点:

    • 功能强大: U-Boot 具有丰富的功能,可以满足各种嵌入式系统的需求。

    • 可配置: U-Boot 可以通过配置来定制其功能和行为。

    • 开源: U-Boot 是一个开源项目,拥有庞大的社区支持。

    • 应用广泛: U-Boot 被广泛应用于各种嵌入式系统。

总结

阶段引导加载程序存储位置主要功能
上电复位ROM芯片内部执行复位向量,最小化硬件初始化,加载 SPL
第一阶段引导加载程序SPL可擦写存储器更进一步的硬件初始化,加载 TPL 或 U-Boot
可选过渡阶段TPL可擦写存储器更精细的硬件初始化,加载 U-Boot
第二阶段引导加载程序U-Boot可擦写存储器完整的硬件初始化,加载 Linux 内核,传递启动参数,提供用户交互界面

启动流程简化:

上电复位 -> ROM -> SPL -> (TPL) -> U-Boot -> Linux Kernel -> 用户空间

补充说明:

  • 不同的嵌入式平台和架构可能略有差异,并非所有的系统都包含所有阶段的引导加载程序。

  • 在一些简单的系统中,可能直接从 SPL 加载 Linux 内核,而省略了 U-Boot。

  • 引导加载程序的选择和配置取决于具体的硬件和应用需求。

0
Subscribe to my newsletter

Read articles from george directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

george
george