嵌入式之旅之bootloader介绍


一个嵌入式系统从软件角度来看分为三个层次:

  1. 引导加载程序
    包括固化在固件(firmware)中的boot程序(可选),和BootLoader两大部分。
  2. Linux内核
    特定于嵌入式平台的定制内核
  3. 文件系统
    包括了系统命令和应用程序。

BootLoader概念

BootLoader 就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件系统带到一个合适的状态,以便为最终调用操作系统做好准备。

为什么需要进行 bootloader 移植?

  1. 每种不同的CPU体系结构都有不同 BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。
  2. 这就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而搭建的,但如果它们的硬件资源或配置不一致的话,要想在一块开发板上运行的 BootLoader 程序也能在另一块板子上运行,还是需要修改。

BootLoader 的启动流程

BootLoader 的启动过程可分为单阶段(Single-Stage)和多阶段(Multi-Stage)两种,通常的 BootLoader 具有更复杂的功能,更好的可移植性。从固态存储设备上启动的 BootLoader 大多采用两阶段,即启动过程可以分为 stage1 和 stage2:stage 1完成初始化硬件,为 stage2 准备内存空间,并将 stage2 复制到内存中,设备堆栈,然后跳转到stage 2.

stage 1通常包括以下步骤:

  • 硬件设备初始化
  • 为加载 BootLoader 的stage 2 准备RAM空间
  • 拷贝 BootLoader 的stage 2 到RAM空间
  • 设置好堆栈
  • 跳转到 stage 2 的 C 入口点

stage 2通常包括以下步骤:

  • 初始化本阶段要使用到的硬件设备
  • 将内核映像和根文件系统映像从 flash 上读到 RAM 中
  • 调用内核

bootloader概述

bootloader 分为boot + loader

  • boot目的:
    跳转到C语言中
    (1)关闭看门狗,关闭中断,关闭MMU和CACHE
    (2)配置系统工作时钟
    (3)配置SDRAM控制器(行地址数,列地址数,多少块,周期性的充电)
    (4)让sp(栈指针)指向可读可写的设备区间中,满足递减栈的规则,SDAM —
    —用哪些模式,就要初始化哪些模式下的SP
    —每个模式的值不能覆盖其他模式。
    (5)代码搬移:执行速度问题,把程序从存储器(nor-flash)搬移到快速的内存;
    只把存储器的一部分代码执行出来,把存储在其他位置上的代码搬移到内存,对应存储器的控制器的初始化;
    (6)bl main
  • loader目的:
    执行应用逻辑,点灯,uart,load linux kernel

创建接口的开发工程

  • Makefile
    1.通用Makefile,支持SD卡启动和uboot下直接运行ram
    (1)程序运行时地址不同
    DDR2:0x20000000
    SD:0x0
    (2)SD 16KB 需要加一个头信息,校验
    RAM:不需要加头信息
    2.变量集合
    IARGET:DEP 目标:依赖
    COMMAND 命令

猜你喜欢

转载自blog.csdn.net/qq_41782149/article/details/90258261