赞
踩
SPL是uboot第一阶段执行的代码. 主要负责搬移uboot第二阶段的代码到内存中运行. SPL是由固化在芯片内部的ROM引导的. 我们知道很多芯片厂商固化的ROM支持从nandflash, SDCARD等外部介质启动. 所谓启动, 就是从这些外部介质中搬移一段固定大小(4K/8K/16K等)的代码到内部RAM中运行. 这里搬移的就是SPL. 在最新版本的uboot中, 可以看到SPL也支持nandflash, SDCARD等多种启动方式. 当SPL本身被搬移到内部RAM中运行时, 它会从nandflash, SDCARD等外部介质中搬移uboot第二阶段的代码到外部内存中.
当我们在uboot下执行make命令的时候, 它最核心的功能是执行Makefile中的all目标编译出相应的文件. 我们来看看这个all目标
[plain] view plain copy
all依赖于$(ALL-y) 和 $(SUBDIR_EXAMPLES), 这里我只关注ALL-y, 如下:
[plain] view plain copy
因为本节是讨论SPL, 所以我们只关注其中的一句ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin
这句话表明
接着往下看
[plain] view plain copy
这里可以发现, u-boot-spl.bin依赖于 $(SUBDIR_TOOLS) depend
接下来进入spl目录, 看看它的Makefile : 这里只分析与SPL相关的部分
[plain] view plain copy
[plain] view plain copy
[cpp] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
OK, 分析结束, 接下来, 就基于我们上面的分析开始分析代码了.
u-boot-spl.lds: 它的位置在上文中我们分析了
下面我们看看start.S
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
当初次上电或者复位时, Uboot最新运行的就是这里的代码
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
以前老版本的uboot, lowlevel_init一般都是在board/xxx下面的板级文件夹下面实现的. 现在直接放到CPUDIR下面了, 那它做了什么事情呢
我个人感觉, 新版本的uboot在CPUDIR下实现了一个lowlevel_init.S文件, 主要目标是初始化sp, 这样s_init就可以用C语言实现了. 而以前的老版本里面, s_init里面要做的事情都是用汇编做的.
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
[plain] view plain copy
至此,SPL结束它的生命,控制权交于u-boot或Linux
在接下来的一篇中, 我们会分析当控制权交给u-boot之后, uboot的运行流程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。