一、uboot启动分为了三个阶段BL0、BL1、BL2;
BL0表示上电后运行ROM中固化的一段程序,其中ROM中的程序是厂家写进去的,所以具体功能可能根据厂家芯片而有所不同。功能如下:

  1. 初始化系统时钟、特殊设备的控制器、启动设备、看门狗、堆栈、SRAM等硬件;
  2. 验证B1镜像,并且加载BL1镜像到SRAM中,然后跳转到BL1镜像的地址上。

BL0需要将BL1加载到对应的RAM上,这就涉及到它的启动模式,详细如下:
1.OneNand Boot模式
要了解OneNAND先得了解NOR Flash和NAND Flash。与NOR Flash相比,NAND Flash的读数据速度稍慢,但是擦写速度快得多,并且在容量、使用寿命、成本上也占有较大优势。NOR Flash的编程简单,而NAND Flash的编程较为复杂(因为它的flash管理需要特殊的接口)。NAND Flash一般用于存储数据,而NOR Flash一般用于存储启动代码。
NOR Flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内容的每一字节(有限的地址引脚是限制其容量的因素之一)。NAND Flash使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。为了弥补NAND Flash的不足,三星公司在NAND Flash芯片内集成了一个RAM接口,命名为OneNAND Flash,这类Flash拥有与NOR Flash相同的简单接口,而且不受地址引脚的限制,即容量与地址引脚无关。
其实OneNAND 其实就是采用了NOR的接口,NAND的架构,是两者的性能得到了综合。这就有了X-LOADER的产生,以前我们接触到的都是BOOTLOADER,其实这个X-LOADER也起到初始化的作用,因为我们的BOOTLOADER是放在NAND的架构下的,而CPU却是从NOR的接口下读取BOOTLOADER到SDRAM中的,所以现在要做一个工作就是要如何将BOOTLOADER在OneNAND的架构下从NAND复制到SDRAM中,这就是X-LOADER的功能了,它不仅初始化OneNAND,并且把U-BOOT从NAND的架构下复制到BufferRam中,再复制到SDRAM中。
X-LOADER还支持从SD、MMC下引导Uboot,他在CPU下有对MMC的初始化程序,可以直接把uboot.bin从MMC下复制到SDRAM中。说到底这个X-LOADER就是起到初始化OneNAND和引导U-BOOT的作用。
参考:
blog.csdn.net/flower_fancy/article/details/5935618
2.Nand Boot
从nand flash中启动uboot.和上面类似,烧写过程可以参考下面的两篇博客。
参考:
blog.csdn.net/ropenyuan/article/details/6637155
blog.csdn.net/q1302182594/article/details/51324094
3.MMC Boot
先了解一下MMC、SD、SDIO三种卡。MMC卡和SD卡都是纯粹的存储卡,而SDIO是SD+IO,也就是既有存储功能,又有IO控制功能,不过也有纯IO功能的SDIO设备。并且,这三种卡可以使用同一个插槽,系统还能正确的识别!可能是由于历史原因,在开始有linux的时候,还只存在mmc卡(不存在SD和SDIO卡),所以在linux系统里面关于这三种卡的名称统统用“mmc“来命名。
关于SD与MMC的区别主要在数据位宽(MMC:8BIT,SD:4BIT);卡的激活(MMC:CMD1,SD:ACMD41);CMD6的用法上面,详细参考blog.csdn.net/lwj103862095/article/details/38334859
参考:
blog.csdn.net/xieweihua2012/article/details/12785491
4.UART Boot
与前面相比,数据从串口读取,且不需要验证header。
5.USB Boot
与前面相比,数据从USB读取,且不需要验证header。

模式 硬件支持 BL1镜像存放起始位置 BL1镜像是否需要header
OneNand Boot OneNand flash page0
Nand Boot Nand flash page0
SD / MMC Boot SD / MMC block1
eSSD Boot eSSD block1
eMMC Boot eMMC block0
UART Boot UART
USB Boot USB

BL1是上电后启动的第二个阶段。BL1阶段会将其镜像或者代码从存储介质上(比如SD)上加载到内部SRAM上,因此它是运行在内部SRAM上的。
主要工作:初始化和SDRAM相关的部分时钟、初始化外部SDRAM、从存储介质上(比如SD)将BL2镜像加载到SDRAM上、验证BL2镜像并跳转到BL2镜像所在的地址上
BL2是上电后启动的第三个阶段,BL2阶段会将其镜像或者代码从存储介质上(比如SD)上加载到外部SDRAM上。
BL2就是指传统意义上的bootloader,也就是我们这里的uboot的主体,负责flash操作、uboot命令操作等等,并且最终目标是加载OS和启动OS,如linux。
参考:
blog.csdn.net/ooonebook/article/details/52916202

二、接下来从bootloader开始说起
Bootloader是在操作系统运行之前执行的一段小程序。而这段小程序的最终目的,正确地设置好软硬件环境,使之能够成功地引导操作系统。
主要工作包括初始化部分硬件,包括时钟、内存等等;加载内核到内存上;加载文件系统、atags或者dtb到内存上;根据操作系统启动要求正确配置好一些硬件;启动操作系统。
嵌入式几种常见的bootloader:
uboot是最常见的bootloader,开源,常用于ARM,MIPS等平台。支持monitor功能。
superboot 不开源,友善之臂的tiny210代码中默认使用这个bootloader
LK(Little Kernel)常用于高通平台,支持monitor功能。

uboot-spl

由uboot编译生成,对应于BL1阶段,也就是BL1的镜像,uboot-spl.bin。其代码运行于IRAM中
主要工作有:

  1. 初始化部分时钟(和SDRAM相关)
  2. 初始化DDR(外部SDRAM)
  3. 从存储介质上(比如SD\eMMC\nand flash)将BL2镜像加载到SDRAM上
  4. 验证BL2镜像的合法性
  5. 跳转到BL2镜像所在的地址上

uboot.bin

由uboot编译生成,对应于BL2阶段,也就是BL2的镜像,uboot.bin。其代码运行于SDRAM中.
主要工作有:

  1. 初始化部分硬件,包括时钟、内存等等
  2. 加载内核到内存上
  3. 加载文件系统、atags或者dtb到内存上
  4. 根据操作系统启动要求正确配置好一些硬件
  5. 启动操作系统

monitor工作,主要是处理命令行的命令,以下是部分操作:

  1. flash操作
  2. 环境变量操作
  3. 启动操作

下一篇:http://www.cnblogs.com/yeqluofwupheng/p/7347925.html

uboot学习之uboot启动流程简述的更多相关文章

  1. uboot学习之五-----uboot如何启动Linux内核

    uboot和内核到底是什么?uboot实质就是一个复杂的裸机程序:uboot可以被配置也可以做移植: 操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别:区别就是我们操 ...

  2. Android FM模块学习之一 FM启动流程

    最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层. 上层就是FM的按扭操作和界面显示,从而调用到FM底层驱动来实现广播收听的功能. FM启动流程:如下图: 先进入FMRadio.jav ...

  3. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  4. nginx学习十一 nginx启动流程

    今天用了一天的时间看nginx的启动流程,流程还是非常复杂.基本的函数调用有十几个之多.通过看源代码和上网查资料,弄懂了一些函数.有些函数还在学习中,有些函数还待日后学习,这里记录一下今天所学.加油! ...

  5. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  6. uboot学习之uboot.bin的运行流程

    上篇博客:http://www.cnblogs.com/yeqluofwupheng/p/7347925.html 讲到uboot-spl的工作流程,接下来简述一下uboot.bin的工作流程,这对应 ...

  7. uboot学习之BL3的流程

    BL2的最后通过汇编调用了board_init_r函数,此时进入BL3的阶段,此时的主要工作: 这一阶段涉及的文件及任务如下 arch/arm/lib/board.c           1. boa ...

  8. Tiny4412 Android 启动流程

    Android系统的启动主要包括三个阶段: ①BootLoader启动 ②Linux Kernel启动 ③Android系统启动 前面我们大致分析了前面两个步骤,即u-boot和内核的启动流程(内核启 ...

  9. Caddy源码阅读(二)启动流程与 Event 事件通知

    Caddy源码阅读(二)启动流程与 Event 事件通知 Preface Caddy 是 Go 语言构建的轻量配置化服务器.https://github.com/caddyserver/caddy C ...

随机推荐

  1. 学习Lowdb小型本地JSON数据库

    Lowdb是轻量化的基于Node的JSON文件数据库.对于构建不依赖服务器的小型项目,使用LowDB存储和管理数据是非常不错的选择. 一:lowdb 使用及安装 在项目中的根目录安装 lowdb 命令 ...

  2. python 18 re模块

    目录 re 模块 1. 正则表达式 2. 匹配模式 3. 常用方法 re 模块 1. 正则表达式 \w 匹配字母(包含中文)或数字或下划线 \W 匹配非字母(包含中文)或数字或下划线 \s 匹配任意的 ...

  3. Django之上传图片,分页,三级联动

    Django1.8.2中文文档:Django1.8.2中文文档 上传图片 配置上传文件保存目录 1)新建上传文件保存目录. 2)配置上传文件保存目录. 后台管理页面上传图片 1)设计模型类. 2)迁移 ...

  4. XMLHttpRequest的概述

    XMLHttpRequest的概述 一.前言 XMLHttpRequest 最早是在IE5中以ActiveX组件的形式实现的.非 W3C 标准. 创建XMLHttpRequest对象(由于非标准所以实 ...

  5. 在IIS下部署PHP

    没有.net ramework 4.0 的要先安装 dotNetFx40_Full_x86_x64.exe PHP压缩包 推荐用5.6.29版 IIS下PHP压缩包下载地址:"http:// ...

  6. 模板汇总——splay

    #define lch(x) tr[x].son[0] #define rch(x) tr[x].son[1] ; , root; struct Node{ ], pre, sz; void init ...

  7. Erlang 不同版本内容

    OTP 22.0 Erlang/OTP 22是一个新的主要版本,具有新的特性和改进,同时也具有不兼容性. 要更深入地了解OTP 22发行版的亮点,您可以阅读我们的博客: http://blog.erl ...

  8. 【Offer】[51] 【数组中的逆序对】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数.例如,在数组 ...

  9. PHPOffice 导入

    1.因为Phpexecel已经停止维护,所以要使用心得phpoffice; 2.注意引入 use PhpOffice\PhpSpreadsheet\Helper\Sample; use PhpOffi ...

  10. 实时统计每天pv,uv的sparkStreaming结合redis结果存入mysql供前端展示

    最近有个需求,实时统计pv,uv,结果按照date,hour,pv,uv来展示,按天统计,第二天重新统计,当然了实际还需要按照类型字段分类统计pv,uv,比如按照date,hour,pv,uv,typ ...