Uboot学习笔记(二)Exynos4412启动过程分析

Exynos4412启动过程分析

简介

注意:这部分不具有普适性,仅针对Exynos4412芯片,不同的芯片会有不同的启动方式,但是都是比较类似的,会有细节上的不同。
这次Uboot的学习笔记我打算分为4个部分。分别是Exynos4412启动过程分析、Uboot编译过程分析、Uboot启动过程分析和Uboot引导内核分析。将对4412芯片从上电到加载Linux内核镜像的过程进行分析,我的主要参考资料就是讯为的视频以及手册、三星原厂datasheet以及网络上的博客。
首先要指出不同的处理器在加载起Uboot前的操作是区别巨大的,不同的芯片会有不同的设计模式,启动过程是各不相同的,但是加载起Uboot后的流程就区别不大了,所以我们学习的重点应该是Uboot的启动过程分析和Uboot引导内核的分析;Uboot的编译流程不同处理器的区别也不大,但这部分总的来说比较简单;对于4412的启动过程我们做到了解即可,这部分不同处理器的差别巨大,没必要死扣一种。
这篇博客会分析Exynos4412的启动过程,说实话Exynos4412的启动过程是比较复杂的,三星在其中加入了自己的不开源加密文件,一个Uboot最终镜像被分割成了四个部分,相比较来说imx6ull就会比较简单(其实我也只是大概看了看,板子还没有到手,到手以后会进行分析)。
Exynos4412的Uboot镜像由四个部分组成(EMMC启动模式),注意:下图十分关键
在这里插入图片描述
除此以外还有一个在芯片内固化的重要存储区域:iROM,这篇博客主要分析的是U-boot加载起来以前的部分,所以我们要分析iROM的流程、BL1的流程以及BL2的流程。
我们先放一张启动的总体流程图
在这里插入图片描述
这张图片就是4412的整体启动流程,首先iROM会读取OM Pin来获取系统的启动加载方式,在iROM中还会进行一系列的初始化,在iROM的最后会对BL1的代码进行校验,校验成功后会把BL1的代码搬到Internal SRAM(内部SRAM)中执行,在BL1的最后会将OS(这里的OS可能指的是用户代码而不是操作系统,因为我们一般还会有BootLoader,在BootLoader的最后才会加载操作系统)搬到外部的DRAM中运行,这是整个系统就跑起来了,我们可以看到BL1的OS代码是放在外部的存储介质中的,所以在iROM代码中最重要的是完成对Controller的初始化,这样才能从启动介质中读出BL1和以后的代码。接下来我们对三个部分的代码进行详细的分析。

iROM

iROM是从地址0x0000_0000开始的一段地址空间,存放着被固化的三星写好的程序。
在这里插入图片描述
iROM中的代码会给板子搭建起执行arm代码的基本环境,并从存储介质(Nand、SD/MMC、eMMC、USB OTG)中下载BL1的代码并进行校验
执行流程如下:
在这里插入图片描述

  • Disable watchdog:关闭看门狗,在Uboot中不用进行喂狗操作
  • Disable IRQ’s and MMU:关闭中断控制器和内存管理单元(MMU)
  • Disable D-cache, Enable I-cache:关闭数据Cache,使能指令Cache
  • Flush TLB’s and Invalidate caches:刷新TLB并失效caches
  • Make CORE1 idle:使其他核进入空闲状态,只让CPU0运行
  • Deep-stop or AFTR:这个是判断是否在待机唤醒状态,如果是的话直接跳转到BL1(快速启动)
  • Initialize Stack (IRQ, SVC):设置IRQ和SVC模式的栈空间(通过片内的ram来设置栈地址,0x0202_0100)
  • Initialize ZI/RW:初始化iROM程序中的一些变量(RW(read/write)是程序中的已初始化变量;ZI(zero)是程序中的未初始化的变量)
  • Register the function pointers:导出一些核心函数,这里的函数主要是一些读写函数(用于读写存放BL1的存储介质),函数如下:
    在这里插入图片描述
  • Get the reset status:获取复位状态
  • Set the clock divider & Set PLLs:设置时钟分频和锁相环
  • Get bootmode (OM pin):获取BOOT模式(四种介质中的哪一种),选择方式如下,注意OM[6]是永远拉低的
    在这里插入图片描述
  • 接下来的就是从介质中下载BL1,然后进行校验,校验成功的话就跳转到BL1执行
    在这里插入图片描述

BL1的格式如上图所示,Check Sum和Verify BL1的操作就是通过在BL1的Header里放着checksum value,iROM通过计算校验和并和Header里的checksum value进行比较。
Decrypt BL1是通过密钥来解密镜像,使用 RSA(Rivest-Shamir-Adleman)公钥加密算法;AES(高级加密标准)块加密算法

我们在上图中可以看到4412中是有一小块内部SRAM的(256K),这段内存是不需要进行初始化的,可以直接使用,所以在iROM程序的最后就会将BL1拷贝到这段内部SRAM中运行
具体的片内内存情况如下:
在这里插入图片描述
这段内部SRAM从0x0202_0000开始,这个图其实还是有点问题的,BL1上写的是8K,这其实是4212的内存分布图,从0x0202_0000开始的5K是相同的,分别放着

  • 设备ID、iROM版本、函数指针
  • iROM栈
  • iROM中初始化的变量

BL1

BL1是由三星提供的二进制文件,是没有源码的,主要是为了系统的安全才这么设置,这个是比其它芯片多出来的一个部分(听说ST的芯片好像也有这个部分)
BL1中的流程如下图:
在这里插入图片描述

  • 判断是否为在待机唤醒状态,如果是的话直接跳转到BL2(快速启动)
  • 从启动设备中读取BL2代码
  • 判断是否是sleep唤醒操作,如果是就直接跳转到BL2,否则继续执行
  • 进行安全性检查和判断完整性,这里根据下图看到BL2其实包含了BL2 Binary+Checksum+Signature+Padding,根据Signature去进行安全检查,根据Checksum去判断完整性:
    在这里插入图片描述

BL2

在BL1中对BL2进行检查成功后跳转到BL2执行,具体执行流程图如下:
在这里插入图片描述
它的执行流程与BL1的流程类似,但是多出了设置时钟和初始化DRAM的过程

发布了123 篇原创文章 · 获赞 598 · 访问量 34万+

猜你喜欢

转载自blog.csdn.net/a568713197/article/details/102610327