uboot启动流程详解

前言

本文参考正点原子教程以及其他博客,如有侵权请联系本人删除

三星exynos-4412 soc的uboot代码启动分析

参考文章:基于Cortex-A9 uboot代码启动分析

大致流程

不同的厂家的启动顺序是不太一样的,本篇主要以三星的exynos-4412 soc为基础,讲解该基于该板子的uboot启动顺序。
在这里插入图片描述
根据上图,系统启动的大概顺序:

  • iROM在SOC内部,是一个64KB的ROM,他树池化一些系统启动必须的功能。比如:时钟、栈。
  • iROM负责从特殊的启动外设加载BL1的image到soc内部的256KB的SRAM中。启动的外设由操作按钮来决定的。根据不同按键的值,iROM将会对bl1 的image做不同的校验。
  • BL1初始化系统时钟和DRAM控制器,然后从启动外设加载OS image到DRAM中。根据启动按钮的值的不同,BL1会对OS做不同的校验。
  • 启动完成之后,BL1跳转到操作系统(kernel)。

iROM会根据OM 引脚的不同选择不同的启动设备,对应的OM寄存器需要提供对应的启动信息。

uboot启动详细流程

在三星的SoC中, 启动流程可以分为三个阶段BL0,BL1,BL2,BL3,三星自己的手册对BL1的解释也不尽相同,一种是将在iRAM中运行的程序都归结为BL1; 一种是将iRAM中三星加密的代码bl1.bin作为BL1, iRAM中剩余的部分作为BL2, 本文采用后者, 他们的主要分工如下:

  • BL0: ARM的起始地址都是0地址, 三星的芯片一般将0地址映射到iROM中, BL0就是指iROM中固化的启动代码, 主要负责加载BL1
  • BL1: 三星对于bootloader的加密代码bl1.bin, 要放在外设中uboot.bin的头上, 和一部分uboot.bin一起加载到iRAM中运行.
  • BL2: 从(nand/sd/usb)中拷贝的uboot.bin头最大14K到iRAM中代码中除去bl1.bin后剩余的部分, 负责设置CPU为SVC模式, 关闭MMU, 关闭中断, 关闭iCache, 关闭看门狗, 初始化DRAM,初始化时钟, 初始化串口, 设置栈, 校验BL2并将其搬移到DRAM高位地址, 重定位到DRAM中执行BL3
  • BL3:是指在代码重定向后在内存中执行的uboot的完整代码, 负责初始化外设,更新向量表, 清BSS, 准备内核启动参数, 加载并运行OS内核

可以借助下图理解这个流程
在这里插入图片描述
我们常说的uboot是一个两阶段bootloader,就是指上述的BL2和BL3。BL2主要做硬件直接相关的初始化,使用汇编编写;BL3主要为操作系统的运行准备环境,主要用C编写,这里以ARM平台为例分析其启动流程。下面是启动过程中主要涉及的文件

arch/arm/cpu/armv7/start.S
board/samsung/myboard/lowlevel_init.S
arch/arm/lib/crt0.S
arch/arm/lib/board.c
arch/samsung/myboard/myboard.c

BL2

BL2的主要文件和任务流程如下

arch/arm/cpu/armv7/start.S
\1. 设置CPU为SVC模式
\2. 关闭MMU
\3. 关闭Cache
\4. 跳转到lowlevel_init.S low_level_init
board/samsung/origen/lowlevel_init.S
\5. 初始化时钟
\6. 初始化内存
\7. 初始化串口
\8. 关闭看门狗
\9. 跳转到crt0.S _main
arch/arm/lib/crt0.S
\10. 设置栈
\11. 初始化C运行环境
\12. 调用board_init_f()
arch/arm/lib/board.c
\13. board_init_f对全局信息GD结构体进行填充
arch/arm/lib/crt0.S
\14. 代码重定位------------BL2的最后的工作, 执行完就进入DRAM执行BL2

正点原子阿尔法开发板uboot代码启动分析

BOOT启动方式

1. 上电
2. 根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式 // 可以通过两种方式改变.一种是改写 eFUSE(熔丝),一种是修改相应的 GPIO 高低电平
	2.1 [00]从 FUSE 启动
	2.1 [01]串行下载
		2.1.1 简介:
			通过 USB 或者UART 将代码下载到板子上的外置存储设备中
		2.1.2 过程
				读取usb数据,下载到sram.
				从sram启动
		2.1.3 应用举例:
			DDR3 测试工具读取init scripts,会将测试使用的固件下载到 i.MX6X的内部 RAM 中,用于测试外部的 DDR3
	2.2 [11]保留
	2.3 [10]内部boot模式,从bootrom启动
		2.3.1 简介
			从bootrom启动,然后做相关初始化之后,探测BOOT_CFG1 BOOT_CFG2 BOOT_CFG4,得到需要加载的设备(QSPI WEIM Serial-ROM SD eMMC NAND 中的一种),然后从加载该设备(二级启动设备)的内容,并进行下一步动作
		2.3.2内部bootrom运行(figure8-3有bootrom的存储分布图)
			初始化时钟
			使能MMU和cache
			从指定的加载设备读取bin文件的头到sram.
			根据头初始化ddr
			然后根据头(bin文件位置a,大小b) 拷贝b大小字节(bin文件的大小)到a地址(在sdram或ocram中),开始运行bin中的代码(用户代码)
		2.3.3bin文件有什么内容
			1.image vector table(8)
			2.boot数据
			3.device configure data
			4.用户数据和代码

uboot启动流程

下图为从SD卡启动后,其uboot镜像加载到内存中的位置,这里有个疑问,这里将vectors段和start段等uboot第一阶段代码加载到SDRAM上,而这段代码执行后才会初始化SDRAM,那么在这段代码未执行之前,SDRAM是在何处初始化SDRAM的呢???
在这里插入图片描述
通过对三星exynos-4412 soc的uboot代码启动分析,我们可以知道是在boot ROM中对SDRAM进行了处初始化。可以参考正点原子手册驱动开发指南P324页
在这里插入图片描述
在这里插入图片描述
同样联想到前面裸机学习的,I.MX6ULL中内部BOOT ROM初始化DDR

类比三星exynos-4412 soc的uboot代码启动,将其BL1+BL2类比为正点原子imx6ull开发板中uboot的第一阶段代码,也即下图中的第一阶段代码,注意下图的第一阶段和第二阶段只是笔者参照三星exynos-4412 soc的uboot代码启动分析大概分的界限,仅供参考。

在正点原子教程中,第一阶段代码也被加载到了SDRAM中,可以知道在第一阶段代码中初始化了SDRAM(咨询了正点原子官方,官方给出的说法是,因为6ull的SRAM只有128KB,比较小,没办法加载第一阶段代码,所以全部加载到SDRAM,但是笔者疑惑的是,boot ROM需要加载uboot的头部来初始化SDRAM,也即boot ROM从指定的加载设备读取整个uboot bin文件的头到OCRAM(SRAM)中后,根据头初始化DDR SDRAM,又将第一阶段代码加载到SDRAM中可能因为OCRAM中仅仅执行了一部分的第一阶段代码?)

理论上boot rom会根据boot启动方式自动去emmc/sd这些存储设备从第三个扇区读取头部并加载到SRAM,初始化SDRAM,再把剩余的uboot代码加载到SDRAM中,而加载到SRAM应该是自动的,不需要我们干预。

之后重定位到SDRAM中执行第二阶段代码,类比BL3,最终完成引导加载Linux内核的任务。
在这里插入图片描述

bootz/bootm命令启动Linux内核过程

这里以bootz命令为例
在这里插入图片描述

总结

到这里 uboot 的启动流程我们就讲解完成了,但这也仅仅是 uboot 启动流程分析,当缕清了 uboot 的启动流程以后,后面移植 uboot 就会轻松很多。其实在工作中我们基本不需要这么详细的去了解 uboot,半导体厂商提供给我们的 uboot 一般是可以直接用的,只要能跑起来,可以使用就可以了。但是作为学习,我们是必须去详细的了解一下 uboot 的启动流程,否则如果在工作中遇到问题我们连解决的方法都没有,都不知道该从哪里看起。

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只嵌入式爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值