1、不简单的头文件包含
- #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>".
- #include/version.h中包含了include/version_autogenerated.h,这个头文件就是配置过程中自动生成的。里面就一行内容:#define U_BOOT_VERSION "U-Boot 1.3.4"
2、启动代码的16字节头部
3、异常向量表的构建
4、用0xdeadbeef对齐填充
5、分配空间放TEXT_BASE c3e00000
6、分配空间放uboot在DDR中的物理地址 33e00000
7、设置CPU为SVC模式
8、设置L2、L1cache和MMU
9、识别并暂存启动介质,因此执行完这一段代码后r3中存储了0x03,以后备用。
10、设置栈,并调用lowlevel_init;目的:栈是在SRAM中设置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用
10.1lowlevel_init详解
(1)先将LR入栈
(2)检查复位状态,防止DDR再次初始化; 冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化 DDR。
(3)IO状态恢复
(4)关看门狗
(5)SRAM SROM相关GPIO设置
(6)开发板供电锁存
(7)判断当前代码执行在SRAM中还是在DDR。 原因:根据代码的位置判断时钟和DDR是否需要初始化
(8)[时钟初始化和DDR初始化]串口初始化打印'O'、trust zone初始化
-
- 在 裸机中DMC0的256MB内存地址范围是0x20000000-0x2FFFFFFF;
- 在uboot中DMC0的256MB内存地址范围为0x30000000-0x3FFFFFFF。
- 在uboot中,可用的物理地址范围为:0x30000000-0x4FFFFFFF。一共512MB,其中30000000-3FFFFFFF为DMC0,40000000-4FFFFFFF为DMC1。
(9)返回地址,打印'K'
11、再次设置开发板供电锁存
12、再次设置栈,目的:DDR已经被初始化了,因此要把栈挪移到DDR中,所以要重新设置栈
13、再次判断当前地址以决定是否重定位,是为了决定是否进行uboot的relocate。
14、从D0037488这个内存地址读值,SD0通道启动时,这个值为EB000000;从SD2通道启动时,这个值为EB200000,然后调用movi_bl2_copy函数执行重定位
15、建立映射表并开启MMU
- 地址映射的额外收益1:访问控制,在管理上对内存进行分块,然后每块进行独立的虚拟地址映射,然后在每一块的映射关系中同时还实现了访问控制(对该块可读、可写、只读、只写、不可访问等控制)
- 地址映射的额外收益2:cache
16、再次设置栈,本次设置栈的目的是将栈放在比较合适(安全,紧凑而不浪费内存)的地方。
17、清理bss 注意表示bss段的开头和结尾地址的符号是从链接脚本u-boot.lds得来的。
18、跳转到第二阶段,执行_start_armboot
来源:https://www.cnblogs.com/zyj23/p/12315377.html