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

     

     

  • 相关阅读:
    希腊字母写法
    The ASP.NET MVC request processing line
    lambda aggregation
    UVA 10763 Foreign Exchange
    UVA 10624 Super Number
    UVA 10041 Vito's Family
    UVA 10340 All in All
    UVA 10026 Shoemaker's Problem
    HDU 3683 Gomoku
    UVA 11210 Chinese Mahjong
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13226160.html
Copyright © 2011-2022 走看看