何为uboot
Universal Boot Loader,一款全球都在用的bootloader。
BootLoader为何物,bootloader其实就是一段裸机程序,用来衔接硬件启动和操作系统之间的程序。
所以,BootLoader的任务应该是:
- 上电即可运行
start.S就是上电后最初执行的程序 - 管理SOC和板级硬件
初始化DDR、MMU,网卡、LED - 支持一些简单的操作
读写内存,操作存储(更新OS),支持网络下载 - 为进入OS准备环境。
Linux启动要求
32bit位:
64bit位:MMU = off, D-cache = off, I-cache = dont care, r0 = 0, r1 = machine nr, r2 = atags or dtb pointer.
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()。
- 确定gd结构体指针位置,确定gd->bd指针位置
- 执行init_sequence里定义的一系列初始化函数
- 初始化flash,以及flash命令(sf、nand、onenand、MMC)
- 其他初始化
- misc_init_r();
- board_late_init();
- 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文件指定链接动作。
网友评论