U-boot中SPL功能和源码流程分析

摘要:
在U-boot目录中,有一个名为SPL的重要目录。SPL究竟是什么?SPL是在uboot的第一阶段执行的代码。SPL由芯片内部固化的ROM引导。在最新版本的uboot中,您可以看到SPL还支持nandflash、SDCARD和其他启动方法。SPL重用uboot中的代码。SPL的主要功能是连接系统硬件SRAM和u-boot。很容易认为SPL和uboot代码可以通过编译选项分离和重用。SPL分析过程到此结束。这里我们只做一个粗略的分析,然后对每个部分进行详细的介绍。

在U-boot目录下,有个比较重要的目录就是SPL的,SPL到底是什么呢?为什么要用它呢?

SPL(Secondary programloader)是uboot第一阶段执行的代码。主要负责搬移uboot第二阶段的代码到

系统内存(System Ram,也叫片外内存)中运行。SPL是由固化在芯片内部的ROM引导的。我们知道很多芯

片厂商固化的ROM支持从nandflash、SDCARD等外部介质启动。所谓启动,就是从这些外部介质中搬移一段

固定大小(4K/8K/16K等)的代码到内部RAM中运行。这里搬移的就是SPL。在最新版本的uboot中,可以看到

SPL也支持nandflash,SDCARD等多种启动方式。当SPL本身被搬移到内部RAM中运行时,它会从nandflash、

SDCARD等外部介质中搬移uboot第二阶段的代码到系统内存中。

SPL复用的是uboot里面的代码.

SPL的主要功能就是衔接系统的硬件SRAM和u-boot之间的纽带。

1.BasicArm Initialization
2.UART console initialization
3.Clocks and DPLL Locking(minimal)
4.SDRAM initialization
5.Mux(minimal)
6.Boot Device Initialization, based on where we are booting from MMC1, or MMC2,or Nand, or Onenand
7.Bootloading real u-boot from the Boot Device and passing control to it.

怎么编译SPL呢?

上文中说道“SPL复用的是uboot里面的代码”,那要生成我们所需要的SPL目标文件,我们又该如何下手呢?

很容易想到,通过编译选项便可以将SPL和uboot代码分离、复用。这里所说的编译选项便是CONFIG_SPL_BUILD,

在make Kconfig的时候使能。最终编译生成的SPL二进制文件有u-boot-spl,u-boot-spl.bin以及u-boot-spl.map。

源码流程

从ARM的启动流程上来看,可以看出SPL在哪一层的:

RomBoot --> SPL --> u-boot --> Linux kernel --> file system --> start application

(RomBoot是固化在SoC内部的。)

容易想到,通过编译选项便可以将SPL和uboot代码分离、复用。这里所说的编译选项便是CONFIG_SPL_BUILD,

在make Kconfig的时候使能。最终编译生成的SPL二进制文件有u-boot-spl,u-boot-spl.bin以及u-boot-spl.map。

SPL的启动一般要从链接文件看,链接文件决定一个可执行程序的各个段的存储(加载)地址,以及运行(链接)地址。

下面来看看SPL的链接文件U-boot-spl.lds:

4OUTPUT_ARCH(arm)
  5ENTRY(_start)
  6SECTIONS
  7{
  8.text :
  9{
 10   __start =.;
 11   *(.vectors)
 12   arch/arm/cpu/armv7/start.o (.text*)
 13   *(.text*)
 14  } >.sram

从lds的起始地址来看,这里面主要撒地方做了两件事情,一个是

*(.vectors)是调用中断向量表:arch/arm/lib/vectors.S 另外

一个就是运行启动代码:

arch/arm/cpu/armv7/start.o (.text*)

在启动代码start.S中,代码的流程是什么样的呢?

(reset) <arch/arm/cpu/armv7/start.S > (b lowlevel_init: arch/arm/cpu/armv7/lowlevel_init.S)
(b _main) --> <arch/arm/lib/crt0.S> (bl board_init_f) --> <arch/arm/lib/spl.c> (board_init_r)
--> <common/spl/spl.c> (jump_to_image_no_args去启动u-boot)
到此SPL的生命周期结束。
到此SPL的分析流程结束了,这里只做个粗略的分析,后面再针对每个部分做详细的介绍。
参考文档:
1 http://blog.csdn.net/voice_shen/article/details/17373671
2 http://bbs.chinaunix.net/thread-4248378-1-1.html

免责声明:文章转载自《U-boot中SPL功能和源码流程分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇EDIFACT学习链接总结:String类型与Int类型的转换【实现插入操作主键自增】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)使用SVN+CruiseControl+ANT实现持续集成之一

在前面的文章中, 介绍自己当时所在团队的处境(使用.NET开发),一个不到十个人的研发团队在保证正常开发进度同时需要并发支持四、五十个项目问题处理,经常为了程序版 本冲突、日常测试版本、发布版本提供等重复枯燥无味的手工劳动,导致团队成员身心俱疲。经历这样痛苦的一段时间,终于忍受不了,通过命令行实现了包括获 取、编译、发布过程的集成,大大减轻版本编译的时间,此...

NDK+MSYS2+Android sdk编译opencv源码

由于今天太晚了,详细笔记有空再记。     要添加的有ANDROID_ABI,这个根据需求添加自己需要的ABI          然后是ANDROID_STL,因为gunstl已经不被支持,这里使用c++_shared或c++_static都可以。    然后是ANDROID_STL,因为gunstl已经不被支持,这里使用c++_shared或c++_st...

Flink 源码(二): Flink Client 实现原理与源码解析(一)

来源:https://mp.weixin.qq.com/s/WiRyQEoDfuowT3LNfZ-NSw 0 本文大纲: 一、我们本次的目的是什么? 这次我们的目的是,在本地的 IDEA 中去 debug flink-clients 代码,然后远程提交给 flink standalone 集群上去执行,看一看 flink 客户端在提交代码之前都干了什么。...

python源码为何都是pass

最近看Python代码  按照一个函数递进的看下去,最后发现,遇到很多源码什么逻辑都没写,仅仅以一个pass  结尾          但却能得到应该得到的结果,这点真的很奇怪,上网查找后 觉得下面的说法还挺符合我的想法,在这里粘贴出来,以后学习深入后继续增加或者修改相关表述: python是C语言实现的,尽管有很多标准库是由python代码实现,但是涉及...

《老罗Android开发视频教程》老罗来交国庆的答卷了

     之前在博客园、开源中国、安卓巴士发表的《老罗将死,或者Android也将就换代,但是互联网的,共享,互助精神将永存》,计划出300集免费的、高质量的、全面的Android开发视频教程,得到了很多人的支持,但是同样也遭到了一些人的质疑,说老罗是空有一翻热情,肯定会半途而废的,因此老罗决定在隔一段时间就在博客园里面给大家交个答卷,也让这些人看...

迅为龙芯2K1000开发板系统编译编译Linux内核

龙芯目前主推的内核版本有 linux‐2.6.32 和 linux‐3.10 两个版本,其中 linux‐2.6.32 主要用于龙芯1号 CPU、龙芯2H和龙芯3A , linux‐3.10 主要用于龙芯 3A2000 和 2K 以上的 CPU 版本。LS2K1000 使用的内核版本为 linux‐3.10。交叉编译器版本为 gcc‐4.9.3‐64‐gn...