zoukankan      html  css  js  c++  java
  • uboot框架熟悉(一)itop4412-uboot2015引导阶段程序在各存储介质的分布

      本文分析itop4412开发板在uboot引导启动阶段,程序在各存储介质的分布情况,为理解uboot代码框架提供基础。以uboot2015为例,以外部SD/MMC作为启动介质。

    目录

          一、itop4412-uboot2015镜像文件组成

          二、itop4412-uboot启动流程

                1>> 开机运行iROM中的代码

                2>> BL1阶段

                3>> BL2(SPL)阶段

                4>> uboot第二阶段代码

    一、itop4412-uboot2015镜像文件组成

      在ubuntu中将uboot镜像烧写到SD卡的命令如下,功能是将uboot镜像文件itop4412-uboot.bin文件烧写到SD卡第1个扇区开始的地方:

        dd iflag=dsync oflag=dsync if=itop4412-uboot.bin of=/dev/sdb seek=1

      其中itop4412-uboot.bin由如下文件制作成:

        cat E4412_N.bl1.SCP2G.bin bl2.bin env.bin u-boot.bin > itop4412-uboot.bin

      其中,

      E4412_N.bl1.SCP2G.bin  :8KB,三星提供的bin文件,没有源码,下文称为BL1

      bl2.bin :16KB,uboot启动第一阶段代码,在uboot2015中称为SPL阶段,下文称为BL2

      env.bin :8KB,内容是全0的bin文件,在SD卡中占位8KB用于存储uboot的环境变量

      u-boot.bin :小于512KB,uboot启动第二阶段代码

      因此,itop4412 uboot2015镜像组成文件中,bl2.bin和u-boot.bin是移植uboot2015编译生成,其他几个是现成的bin文件,直接从讯为提供的SDK中获取。SD卡中程序分布如下:

     二、itop4412程序启动流程

      上图是itop4412的datasheet中的启动流程框图。上图中的BL1是由三星公司提供的,没有源码。OS是我们自己的程序,一般是我们自己移植的uboot。

    启动流程:

    1>> 开机运行iROM中的代码

     

      itop4412内部有个64KB的iROM,这个iROM的物理地址是0x0000_0000。ARM芯片启动时从物理地址0x0000_0000的存储介质中取第一条指令开始运行。三星在iROM中固化了一段启动代码,因此,芯片上电时首先运行iROM中的这段代码。这段代码主要做以下4个工作:

      1. 初始化出程序运行的基本环境,比如关闭看门狗、设置栈以及初始化时钟等;

      2. 读取OM脚判断uboot的启动介质(内部EMMC、外部SD/MMC卡等);

      3. 从启动介质加载BL1阶段代码到iRAM中特定的地址(0x0202_1400)处;itop4412的iRAM有256KB,起始物理地址是0x0202_0000;

      4. iROM中的启动代码对BL1代码做完整性校验,校验通过后,跳转到iRAM中的BL1运行。

      下图是官方文档中iRAM中程序的内存分布图,从图中可以看出,iROM中的程序除了做上述工作外,还将Product_ID、iRom_Version和Function_Ptr(这个是一些内存拷贝函数的指针,这些函数用于将EMMC或者SD/MMC中的程序拷贝到动态内存DRAM中,在uboot代码的第一阶段BL2程序中需要调用这里的函数将启动介质中的u-boot程序拷贝到DRAM中)拷贝到了iRAM的起始处,然后在iRAM中设置了自己使用的栈。

      至此,iROM结束使命,BL1开始运行。

    2>> BL1阶段

      BL1阶段主要做如下工作:

      1. 从启动介质拷贝BL2代码(SPL阶段)到iRAM的0x0202_3400处,因此在编译uboot时,BL2的链接地址需要设置为0x0202_3400;

      2. 校验BL2的完整性,通过后跳到BL2运行

      在BL2中有两个数据Checksum和Signature,BL1对BL2的校验就是检查这两个数据。BL2有效程序必须小于14332B,14KB-4B的地方用于存放Checksum;14KB的地方用于存放Signature。

      Uboot2015中,编译出uboot的第一阶段SPL后,使用board/Samsung/itop4412/tools/mkitop4412spl.c计算校验和放到14KB-4B的地方。

      编译SPL阶段的脚本文件scripts/Makefile.spl中调用mkitop4412spl

    3>> BL2(SPL)阶段

      至此我们自己移植的uboot开始运行,BL2还在iRAM中运行,主要做的工作是:

      1. 初始化时钟、初始化串口、初始化动态内存DRAM;

      2. 拷贝uboot第二阶段代码到DRAM中,然后跳转到DRAM中执行uboot第二阶段代码;

    4>> uboot第二阶段代码

      uboot第二阶段会提供uboot的基本功能,比如命令行交互功能、环境变量读写功能、启动内核等。

    三、总结

      整体程序运行时内存分布如下图所示:

      1. 开机运行iROM中的代码,根据OM引脚从启动介质加载BL1到iRAM中运行;

      2. BL1从启动介质加载BL2到iRAM中运行;

      3. BL2加载uboot第二阶段代码到DRAM中运行;

      4. uboot第二阶段代码运行,响应控制台命令,启动内核。

     


      本文仅是本人在熟悉uboot的代码框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。参考了网上的博客没有一一列出。如有侵权,请联系删除。

    参考博客:

       https://blog.csdn.net/pengfei240/article/details/75308150

     

     

  • 相关阅读:
    MATLAB学习1 之画图函数
    innobackupex 出现Unrecognized character x01; marked by
    innobackupex 出现Unrecognized character x01; marked by
    innobackupex 出现Unrecognized character x01; marked by
    innobackupex 出现Unrecognized character x01; marked by
    企业云桌面-03-安装第1个企业 CA-013-CA01
    python 串行执行和并行执行
    cx_Oracle 查询 传参
    运维工程师要失业了?抛开噱头与调侃,闲聊我心中的运维!
    迭代器
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13226160.html
Copyright © 2011-2022 走看看