# 嵌入式 Linux 启动过程概述

嵌入式 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 内核，传递启动参数，提供用户交互界面 |

**启动流程简化:**

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

**补充说明:**

* 不同的嵌入式平台和架构可能略有差异，并非所有的系统都包含所有阶段的引导加载程序。
    
* 在一些简单的系统中，可能直接从 SPL 加载 Linux 内核，而省略了 U-Boot。
    
* 引导加载程序的选择和配置取决于具体的硬件和应用需求。
