嵌入式 Linux 启动过程概述


嵌入式 Linux 系统的启动过程通常比桌面系统要复杂一些,因为它需要初始化硬件,加载操作系统内核,最终运行应用程序。这个过程大致可以分为以下几个阶段:
上电复位 (Power-On Reset): 当系统上电时,CPU 会执行预先定义的复位向量处的代码。
第一阶段引导加载程序 (First Stage Bootloader): 这通常是 ROM 或 SPL (Secondary Program Loader) 的角色,负责最小化的硬件初始化和加载第二阶段引导加载程序。
第二阶段引导加载程序 (Second Stage Bootloader): 这通常是 U-Boot (Universal Boot Loader) 的角色,负责更复杂的硬件初始化,加载 Linux 内核,以及传递启动参数。
Linux 内核启动: Linux 内核被加载到内存并开始执行,初始化系统,并最终启动用户空间进程。
用户空间启动: 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。
引导加载程序的选择和配置取决于具体的硬件和应用需求。
Subscribe to my newsletter
Read articles from george directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by