美文网首页
uboot概览

uboot概览

作者: 游魂_2e0d | 来源:发表于2019-02-18 21:38 被阅读0次

    何为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文件指定链接动作。

    相关文章

      网友评论

          本文标题:uboot概览

          本文链接:https://www.haomeiwen.com/subject/sdoidqtx.html