U-Boot(Universal Boot Loader)是一个广泛使用的开源引导加载程序,通常用于嵌入式系统。其主要功能是初始化硬件设备并加载操作系统内核。在了解U-Boot的启动流程之前,首先需要理解U-Boot的基本架构和主要步骤。以下是U-Boot启动流程的详细说明:
U-Boot 启动流程
-
ROM Code(第一阶段引导加载程序)
- 处理器上电复位后,从固化在片内ROM中的代码开始执行。
- ROM代码负责初始化最基本的硬件,如设置时钟、配置内存控制器等。
- 根据配置,从预定义的启动介质(如NAND、NOR、SD卡等)加载第二阶段引导加载程序,即U-Boot。
-
SPL(Secondary Program Loader)或TPL(Third Program Loader)
- SPL是一个精简版的U-Boot,用于初始化更多硬件,并加载完整的U-Boot到RAM中运行。
- 如果系统存储器较小,可能会有一个额外的TPL阶段,TPL会进一步初始化硬件环境,为加载SPL做好准备。
- SPL主要职责包括初始化DRAM控制器、复制U-Boot到DRAM以及跳转到U-Boot的起始地址。
-
U-Boot 主体
- U-Boot分为两个主要阶段:前期初始化和主引导过程。
前期初始化(Pre-initialization)
- 板级初始化(board_init_f):
- 初始化UART串口,用于输出调试信息。
- 初始化早期内存分配器。
- 设置全局数据结构(
gd),存储U-Boot运行时的全局信息。
内存初始化(Memory Initialization)
- 初始化DRAM,使得U-Boot能在DRAM中运行。
- 将全局数据结构从片上SRAM复制到DRAM中。
主引导过程
- 板级初始化(board_init_r):
- 完成剩余设备的初始化,如I2C、SPI、USB等。
- 初始化文件系统(如FAT、ext4等)。
- 加载环境变量(环境变量存储在非易失性存储器中,如EEPROM、Flash等)。
- 自动启动脚本(Boot Script)
- 检查并执行启动命令,这些命令可以存储在环境变量中。
- 典型的启动命令包括加载操作系统内核、设备树文件(DTB)和根文件系统(Root Filesystem)。
-
加载操作系统
- U-Boot根据环境变量中的启动命令,加载操作系统内核镜像到内存中。
- 通常还会加载设备树文件(DTB)和初始RAM盘(Initramfs)。
- 跳转到操作系统内核的入口点,并将控制权交给操作系统内核。
U-Boot 启动过程示例
下面是一个典型的U-Boot启动命令:
setenv bootcmd 'mmc dev 0; fatload mmc 0:1 $loadaddr uImage; bootm $loadaddr'
saveenv
boot
setenv bootcmd ...:设置启动命令,内容为从MMC设备0加载uImage文件到内存,然后启动内核。saveenv:保存环境变量。boot:执行启动命令。
关键点总结
- ROM Code负责最基本的硬件初始化,并加载SPL/TPL。
- SPL/TPL初始化更多硬件,并将U-Boot主体加载到RAM中。
- U-Boot 主体负责全面初始化硬件设备,加载并执行操作系统内核。
- 环境变量在U-Boot中起着关键作用,决定了启动行为和参数。
通过了解这些步骤,可以更好地调试和定制U-Boot,以满足特定的嵌入式系统需求。