什么是SPL?

SPL(secondary program loader)是一个十分小的bin文件,它是用来引导主u-boot文件。对于一些SRAM很小的SOC,无法一次性加载ROM中的bootloaderSRAM中,因为一般SRAM远远小于bootloader的大小。这时候SPL应运而生了。

加载过程

嵌入式系统的SOC内部会有比较小的SRAM,而外部的一般会有DDR或者SDRAM,后面的RAM就是外部RAMSPL会先被加载到SRAM中,然后初始化DDR或者SDRAM,总之会初始化外部的RAM,然后再把主u-boot加载到RAM

如下图所示:

  1. 图中①是 SPL在u-boot第一阶段的装载程序,初始化最基本的硬件,比如关闭中断,内存初始化,设置堆栈等最基本的操作,设置重定位;
  2. 图中②是会装载主u-boot程序,然后初始化其他板级硬件,比如网卡,nand flash等待,设置u-boot本身的命令和环境变量;
  3. 图中③是加载kernelRAM,然后启动内核;

整体的加载过程:

下面是StackOverflow上的一个解释:

这里以OMAP平台为例进行解释(仅提供一些实际背景而不仅仅是理论或常识)。看看初学者的一些事实:

在基于OMAP的平台上,上电后运行的第一个程序是ROM代码(类似于PC上的BIOS)。

ROM代码查找引导加载程序(必须是名为“MLO”的文件,位于MMC的活动第一个分区,必须格式化为FAT12 / 16/32, - 但这是详细信息)

ROM代码将该“MLO”文件的内容复制到静态RAM(因为常规RAM尚未初始化)。下图显示了OMAP4460 SoC的 SRAM存储器布局:

OMAP4460上的SRAM存储器布局



SRAM存储器是有限的(由于物理原因),因此我们只有48 KiB用于引导加载程序。通常,常规引导加载程序(例如U-Boot)二进制文件大于此值。

因此,我们需要创建一些额外的引导加载程序,它将初始化常规RAM并将常规引导加载程序从MMC复制到RAM,然后将跳转以执行该常规引导加载程序。这个额外的引导加载程序通常称为第一阶段引导加载程序(在两阶段引导加载程序方案中)。

所以这个第一阶段的引导加载程序是U-Boot SPL ; 和第二阶段的引导加载程序是常规的U-Boot(或适当的U-Boot)。需要说明的是:SPL代表二级程序加载器。这意味着ROM代码是加载(和执行)其他程序的第一件事,而SPL是加载(和执行)其他程序的第二件事。所以通常启动顺序是下一个:ROM code - > SPL - > u-boot - > kernel。实际上它与PC启动非常相似,它是:BIOS - > MBR - > GRUB - > kernel。

UPDATE

为了使事情完全清楚,这里是描述启动顺序的各个阶段表(明确使用术语可能的不确定性):

+--------+----------------+----------------+----------+
| Boot | Terminology #1 | Terminology #2 | Actual |
| stage | | | program |
| number | | | name |
+--------+----------------+----------------+----------+
| 1 | Primary | - | ROM code |
| | Program | | |
| | Loader | | |
| | | | |
| 2 | Secondary | 1st stage | u-boot |
| | Program | bootloader | SPL |
| | Loader (SPL) | | |
| | | | |
| 3 | - | 2nd stage | u-boot |
| | | bootloader | |
| | | | |
| 4 | - | - | kernel |
| | | | |
+--------+----------------+----------------+----------+

所以我只是使用bootloader作为U-Boot的同义词,而程序加载器作为加载其他程序的任何程序的通用术语。

参考:

what is the use of SPL (secondary program loader)

u-boot SPL的理解

TPL: SPL loading SPL(and, SPL as just another U-Boot config)

最新文章

  1. WebViewJavascriptBridge的暂时理解
  2. 【WP 8.1开发】如何处理摄像头翻转的问题
  3. MongoDB 3.0 新特性【转】
  4. hdu 4998
  5. maven使用实例记录
  6. 云计算PAAS平台测试设计之镜像管理
  7. android 67 生成和解析xml
  8. android 程序中res/values-v14/styles.xml报错的解决办法
  9. 查看进程所用的内存(使用GetWindowThreadProcessId取得进程ID,OpenProcess打开进程和GetProcessMemoryInfo取得内存信息)
  10. 使用布局(Layout资源)
  11. 基于Spring MVC 实现拦截器
  12. 第一章 IDEA的使用
  13. Nginx 简单记录
  14. SPA中,Node路由优先级高于React路由
  15. Spring 3.1新特性之二:@Enable*注解的源码,spring源码分析之定时任务Scheduled注解
  16. 【转】Paxos算法2-算法过程
  17. 课堂实验-模拟实现Sort
  18. UILabel的缩放动画效果
  19. BZOJ - 3263 三维偏序
  20. sharepint 2013 添加subsite

热门文章

  1. 时间格式的转化 vue与js 年月日 时分秒
  2. Ubuntu上mysql, 通过python连接报错Can't connect to MySQL server on xxx (10061)
  3. AppBoxFuture: Web在线报表设计与PDF生成
  4. 关于如何在Linux上使用Nugix反向代理部署net core3.1项目
  5. ES6系列-什么是ES6?新手应该怎么理解
  6. Visual Studio 添加图标和版本
  7. Linux操作系统进入单用户模式的方法
  8. tensor的复制函数torch.repeat_interleave()
  9. 小米Note 10 Lite海外发布 无缘中国市场
  10. SSH公钥登录和RSA非对称加密