一、前言
在开始分析u-boot重定向之前,先总结一下前两小节u-boot在运行的过程中都有哪些操作:
1.设置CPU为SVC模式
2.设置异常向量表
3.关闭Cache和MMU
SOC芯片的设置
4.处理唤醒的条件
5.判断是否在内存中运行
6.如果不在内存中运行,则初始化系统时钟和内存控制器(第一阶段)
如果在内存中运行,则不需要初始化系统时钟和内存控制器(第二阶段)
7.初始化uart
8.设置了sp
9.调用board_init_f
-----------------------------------------------------------------
第一阶段代码:
board_init_f 功能将u_boot从存储器搬移到内存,跳到内存中运行
第二阶段代码:
board_init_f
(1)执行了初始化序列表 (板子相关的初始化操作)
(2)为u_boot重定向预留内存
最上面两幅图的 board_init_f 分别定义的函数 分别是u_boot 第一与第二阶段的board_init_f代码,分别实现自搬移到内存和初始化序列表等不同的功能。具体实现是 : 自搬移函数所在的mmc_boot.c文件所在目录下有个makefile文件,它的条件是 如果定义了CONFIG_SPL_BUILD 就生成 .o 文件 所以spl目录下的Makefile生成的第一阶段的u_boot中包含这个mmc_boot.o文件,因为spl目录下的Makefile中定义了 CONFIG_SPL_BUILD := y ,而生成第二阶段的U_boot的Makefile中没有定义这一句话,所以 它就会生成右面这幅图的 . o 文件,互不干扰。
在刚开始学习的时候,有点想不通为什么spl目录下的Makefile中定义了 CONFIG_SPL_BUILD := y 了,但第一阶段与第二阶段的代码还是都生成了,后来仔细想了想才明白他是有两个Makefile生成了不同阶段的u-boot(有两个,一个顶层目录下的u-boot还有一个spl目录下的u-boot),所以互不干扰。