u-boot spl 学习总结
什么是SPL?
SPL(secondary program loader)
是一个十分小的bin文件,它是用来引导主u-boot文件。对于一些SRAM
很小的SOC
,无法一次性加载ROM
中的bootloader
到SRAM
中,因为一般SRAM
远远小于bootloader
的大小。这时候SPL
应运而生了。
加载过程
嵌入式系统的SOC
内部会有比较小的SRAM
,而外部的一般会有DDR
或者SDRAM
,后面的RAM
就是外部RAM
;SPL
会先被加载到SRAM
中,然后初始化DDR
或者SDRAM
,总之会初始化外部的RAM
,然后再把主u-boot
加载到RAM
;
如下图所示:
- 图中①是
SPL
在u-boot第一阶段的装载程序,初始化最基本的硬件,比如关闭中断,内存初始化,设置堆栈等最基本的操作,设置重定位; - 图中②是会装载主
u-boot
程序,然后初始化其他板级硬件,比如网卡,nand flash等待,设置u-boot
本身的命令和环境变量; - 图中③是加载
kernel
到RAM
,然后启动内核;
整体的加载过程:
下面是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)
TPL: SPL loading SPL(and, SPL as just another U-Boot config)
u-boot spl 学习总结的更多相关文章
- SPL学习 迭代器
主要学习内容: 慕课网的spl视频教程 阮一峰SPL学习笔记 http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html SPL类详解 http ...
- LM3S之boot loader学习笔记-2
LM3S之boot loader学习笔记-2 彭会锋 () 上一篇中介绍了bootloader的基础知识,对于bootloader的作用和如何编写bootloader也有了大概的了解了,这一篇主要讲解 ...
- LM3S之boot loader学习笔记-1
LM3S之boot loader学习笔记-1 彭会锋 (首先声明,此系列文章编写参考了很多资料,其中一些内容是原版内容的引用和整理,并加入了一些自己的见解,我已经尽量标明引用部分,如有未全部标注部分, ...
- Spring Boot 项目学习 (四) Spring Boot整合Swagger2自动生成API文档
0 引言 在做服务端开发的时候,难免会涉及到API 接口文档的编写,可以经历过手写API 文档的过程,就会发现,一个自动生成API文档可以提高多少的效率. 以下列举几个手写API 文档的痛点: 文档需 ...
- Spring Boot 项目学习 (三) Spring Boot + Redis 搭建
0 引言 本文主要介绍 Spring Boot 中 Redis 的配置和基本使用. 1 配置 Redis 1. 修改pom.xml,添加Redis依赖 <!-- Spring Boot Redi ...
- Spring Boot 项目学习 (一) 项目搭建
0 引言 本文主要记录借用Idea 开发环境下,搭建 Spring Boot 项目框架的过程. 1 系列文档目录 Spring Boot 项目学习 (一) 项目搭建 Spring Boot 项目学习 ...
- Spring Boot 项目学习 (二) MySql + MyBatis 注解 + 分页控件 配置
0 引言 本文主要在Spring Boot 基础项目的基础上,添加 Mysql .MyBatis(注解方式)与 分页控件 的配置,用于协助完成数据库操作. 1 创建数据表 这个过程就暂时省略了. 2 ...
- Spring Boot的学习之路(03):基础环境搭建,做好学习前的准备工作
1. 前言 <论语·魏灵公>:"工欲善其事,必先利其器.居是邦也,事其大夫之贤者,友其士之仁者." 工欲善其事必先利其器.我们在熟悉一个陌生项目的时候,首先会大概去看一 ...
- Spring Boot的学习之路(02):和你一起阅读Spring Boot官网
官网是我们学习的第一手资料,我们不能忽视它.却往往因为是英文版的,我们选择了逃避它,打开了又关闭. 我们平常开发学习中,很少去官网上看.也许学完以后,我们连官网长什么样子,都不是很清楚.所以,我们在开 ...
- Github 上 Star 最多的个人 Spring Boot 开源学习项目
2016年,在一次技术调研的过程中认识到了 Spring Boot ,试用之后便一发不可收拾的爱上它.为了防止学习之后忘记,就在网上连载了 Spring Boot 系列文章,没想到这一开始便与 Spr ...
随机推荐
- 5个有趣的Python小知识,结果令人意外
1 字符串驻留 如果上面例子返回True,但是下面例子为什么是False: 这与Cpython 编译优化相关,行为称为字符串驻留,但驻留的字符串中只包含字母,数字或下划线. 2 相同值的不可变对象 这 ...
- Equalizing by Division
The only difference between easy and hard versions is the number of elements in the array. You are g ...
- 漫画:工作这么多年,你居然不知道 Maven 中 Optional 和 Exclusions 的区别?
欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! Maven 依赖排除(Exclusions) 因为 Maven 构建项目具有依赖可传递的特性,当你在 pom.xm ...
- Flask接口开发过程中的心得2019.10.03
完善了一下慕课网实战中的post接口开发,得到了一些进步: 代码如下: #coding=utf-8 from flask import Flask from flask import request ...
- 用functools.lru_cache实现Python的Memoization
现在你已经看到了如何自己实现一个memoization函数,我会告诉你,你可以使用Python的functools.lru_cache装饰器来获得相同的结果,以增加方便性. 我最喜欢Python的原因 ...
- php phpStudy session存放位置
如果你仅仅是想知道session保存的文件在哪里,你可以在你的PHP文件当中运行函数:session_save_path之后查看运行结果即可知道session文件的存放目录. 或者: 在php-ini ...
- 微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- java 8 Stream中操作类型和peek的使用
目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区别呢 ...
- java基础问题 (待解决)
(1)接口与抽象类的区别? (2)Java中的异常有哪几类?分别怎么使用? (3)常用的集合类有哪些?比如List如何排序? (4)ArrayList和LinkedList内部的实现大致是怎样的?他们 ...
- SQL语句学习(一)
这篇文章用来记录再学习SQL语句的过程. 首先,我们从简单的创建表开始.创建表的语法是CREATE TABLE 表名(列1的名字 列1的属性,列2的名字 列2的属性...); 如果希望将某一列作为 ...