U-Boot启动流程解析与SPL演进

需积分: 10 1 下载量 134 浏览量 更新于2024-09-07 收藏 187KB PDF 举报
"U-Boot启动顺序文档详细阐述了U-Boot在ARM平台上的启动流程,包括SPL(Small Program Loader)和U-Boot主程序的启动步骤、近期的改动以及未来的发展计划。该文档适合于正在开发或研究U-Boot启动流程的人员参考学习。" U-Boot启动顺序: U-Boot的启动过程分为两个主要阶段:SPL和U-Boot主程序。 1. SPL启动序列: - 启动开始:当系统加电后,CPU开始执行ROM中的固件代码。 - CPU栈设置:初始化CPU栈,为后续处理做准备。 - board_init_f_mem:这个函数用于早期内存的配置,它会初始化全局数据结构(gd)和早期内存分配(earlymalloc)。 - jump加载U-Boot:SPL加载并跳转到完整的U-Boot映像。 - spl_board_init:执行特定板级的初始化任务。 - board_init_r:在DRAM中设置栈,并继续执行剩余的初始化工作。 - dram_init:初始化DRAM控制器,确保内存可用。 - board_init_f:完成板级的剩余初始化。 2. U-Boot主程序启动序列: - crt0.s:通用的启动代码,用于设置C环境。 - driver model接管:驱动模型接手初始化工作,简化了对一些初始化序列的调用。 - main_loop:进入U-Boot的主要循环,等待用户输入命令。 近期的改动: - SPL中引入了board_init_f_mem函数,用于在board_init_f之前进行最小化处理,不包含DRAM初始化。 - 减少board_init_f之前的步骤,改为正常返回,而不是跳转到board_init_r。这样等到DRAM初始化完成后,再重新定位栈(通过CONFIG_SPL_STACK_R配置)。 未来的宏大计划: - 对于SPL,目标是让所有板子都使用一个通用的board_init_f函数,将特定板级的初始化移到board_early_init_f或其他类似函数中,以减少代码量。 - 对于U-Boot主程序,计划逐步淘汰更多初始化函数,简化启动过程,同时默认的printf实现也将变得更小,以优化性能。 这个文档对于理解U-Boot的启动流程及其演变至关重要,对于嵌入式系统开发者和Linux驱动开发者来说,是一份有价值的参考资料。通过掌握这些知识,可以更有效地调试和优化U-Boot,以适应不同的硬件平台和应用场景。