uboot概览

2019-02-18  本文已影响0人  游魂_2e0d

何为uboot

Universal Boot Loader,一款全球都在用的bootloader。
BootLoader为何物,bootloader其实就是一段裸机程序,用来衔接硬件启动和操作系统之间的程序。
所以,BootLoader的任务应该是:

  1. 上电即可运行
    start.S就是上电后最初执行的程序
  2. 管理SOC和板级硬件
    初始化DDR、MMU,网卡、LED
  3. 支持一些简单的操作
    读写内存,操作存储(更新OS),支持网络下载
  4. 为进入OS准备环境。
    Linux启动要求
    32bit位:
    MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
    r1 = machine nr, r2 = atags or dtb pointer.
    
    64bit位:
    MMU = off, D-cache = off, I-cache = on or off,
    x0 = physical address to the FDT blob.
    

一般start.S很少动;初始化板级硬件,根据不同的项目会有变化;
现在一般uboot修改的重点在于增加各种命令来实现各种特殊功能(升级,恢复设备,debug),还有传递一些特殊的参数供内核使用(mem分配,分区表)

uboot核心流程

上电运行start.S,进行最基本的初始化,如有必要,运行lowlevel_init.S。跳转到start_armboot(),初始化gd,按照init_sequence初始化各个外设,最后执行main_loop()。

  1. 确定gd结构体指针位置,确定gd->bd指针位置
  2. 执行init_sequence里定义的一系列初始化函数
  3. 初始化flash,以及flash命令(sf、nand、onenand、MMC)
  4. 其他初始化
  5. misc_init_r();
  6. board_late_init();
  7. main_loop();

hi3519v101 start.S

SVC模式
关cache
关MMU
检测是不是自举模式还是pcie启动,也包括是冷启动还是热启动
串口初始化
DDR初始化和DDR training
正常启动时,会检测启动方式,对代码进行相应的拷贝,重定位
设置堆栈
清bss段
跳转到第二阶段,即C语言阶段

uboot二进制

u-boot编译出来是一段二进制的代码(未压缩前),也就是熟悉的elf文件。
lds文件是编译器用来控制输出文件内各部分在程序地址空间内的布局,一般使用编译器默认的脚本,可用ld -verbose查看。
对于uboot这个二进制,链接过程使用u-boot.lds文件指定链接动作。

上一篇下一篇

猜你喜欢

热点阅读