Part4.3U-Boot工作流程分析

分三块讲解,因为U-boot有几千个文件,所以需要梳理一下思路和构成。
第一阶段是BootLoader1,第二阶段是BootLoader2
本部分会按照2440,,6410,210顺序进行分析
1、2440处理器初始化
其中最重要的文件是“Makefile”文件
重要的开发板都有配置选项。

比如说2440这一行第三项为smdk2440。然后我们需要到board/samsing中找到一个子目录,存放的是支持文件,其中链接器脚本u-boot.lds用来链接所有u-boot文件
通过这里可以看到放在第一个的是什么文件(start.s)
然后根据ENTRY(_START)表明起始地址是start.s中_start地方开始的,这是程序的入口
分析BootLoader1、BootLoader2
在source insight中打开start.s。具体地址根据u-boot.lds确定(找到程序代码段入口)

我们这里只分析它做了什么,不分析它怎么做的; 基本上就是靠注释判断它做了什么;还有根据判断、跳转和宏定义看程序执行情况
首先上电之后先进入reset代码,
点击某个函数,再按一下工具栏的书,会将所有的同名函数都列举出来
shift+F8会高亮显示


接下来运行一下配置
make smdk2440 config指令
再来执行一次make
将u-boot.elf反汇编一下,后面动作基本上都是在这里反汇编的文件中看的
在start_armboot可以找到内存地址
在/uboot/config.mk中可以找到TEST_BASE(代码段基地址)/board/samsung/smdk2440/config.mk有代码段基地址

这里反汇编后有条指令是b low_level_init,可以在config.mk中看到这个地址是在内存中的。但是b指令是相对跳转,PC指针位置和链接地址的值是不同的,比如PC=100时候执行 b low_level_init指令,那么这个时候还是不会进入内存。会调到110.
代码不一定非得运行在链接地址处,像你说的在sram里它使用的都是位置无关码因此在哪都一样,但是如果使用了位置有关码,那就和链接地址扯上关系了,必须得在链接地址处运行

BootLoader2从start_armboot开始运行,初始化环境变量
不管软件初始化,只关注硬件初始化

第二阶段三种处理器代码基本上没区别
2、6410处理器初始化
同理,先找到smdk6410,打开链接器脚本,找到入口

就 外设基地址初始化 不同
3、210处理器
210的U-boot和6410差不多,不过区别就是6410处理器的bootlooder1、bootlooder2没有明显界限,而210采用高级的U-boot文件,所以它会把bootlooder1、bootlooder2划分为两个单独的bin文件
进入uboot-210/spl/uboot-spl.lds,看bin文件产生的源文件

这个是210的uboot存放准则

这部分实现了上图的2、3两步,BL2放到内存中并让pc指针跳转到内存中运行


第二阶段文件在arch/arm/cpu/armv7/u-boot.lds
实际上第二阶段代码还是和前面两个处理器一样,只是名字改了一下
这里有一个特殊的函数save_boot_param, 特殊之处在于没有函数体

在attribute 中指明了这个函数是一个弱函数(如果两个同名函数指定其中一个函数为弱函数,那么这个函数会自动失效,不会报错)
alias指这个函数和另一个函数关联起来,没有函数体会自动执行那个别名函数,而在这里指定的上面一个函数为空函数,所以这两个函数都是空函数
210处理器U-boot运行过程:
两部分,第一部分为u-boot,其中前面24KB为BL1,后面都是BL2。而BL1中只有16KB是有效的,后面8KB全是0
第二部分为210内存,低地址是IROM,固件程序,三星烧写好的
启动以后IROM会把BL1复制到IRAM里面去,大小为16KB。
运行时BL1会把BL2复制到内存当中去,然后跳转到BL2运行。

浙公网安备 33010602011771号