soc fpga开发日记之:preloader spl探秘
-
-
coyoo
- LV4工程师
-
| 2014-05-20 13:48:44
- 浏览量 895
- 回复:8
有了前一天装载u-boot-spl.axf并进行调试的基础,可以追求一些自由:如果把u-boot-spl中初始化代码直接加到裸程序中不就可以减少一些调试上的环节,明了底层操作的细节就会有知情权,不再会被工具左右。
装载以后,我们是用run启动运行的,我们知道u-boot-spl被装载到0xffff0000的片内ram中,而run隐含了启动地址,为什么不可以直接在某个入口直接启动呢? 我经常不按常规出牌,在装载以后,cpu进入stopped状态,直接修改程序指针PC为:0XFFFF0000,呵呵,很奇妙的芝麻开门,调试指针指向了start.S。
调试窗口中自动打开了start.S:
.globl _start
_start: b reset ...
这就对了,这里就是万里长征的起点。按F6(step),就可以开始了第一条汇编就是b reset,ok,有兴趣的可逐条解读汇编代码,也可以F6信马由缰的浏览下去,好在汇编代码不多,一直到board_init_f,这是一个C函数(arch/arm/lib/spl.c)。在board_init_f中调用board_init_r函数。
board_init_r(comm/spl/spl.c)中是spl中至关重要的工作,可畏步步惊心,是系统启动的核心。。。。。。
比较重要的调用有:timer_init();
spl_board_init();
spl_board_init中完成了包括ddr3内存在内的外设的初始化。
如果需要,我们可以对spl展开详尽的分析。。。。。。
有了前一天装载u-boot-spl.axf并进行调试的基础,可以追求一些自由:如果把u-boot-spl中初始化代码直接加到裸程序中不就可以减少一些调试上的环节,明了底层操作的细节就会有知情权,不再会被工具左右。
装载以后,我们是用run启动运行的,我们知道u-boot-spl被装载到0xffff0000的片内ram中,而run隐含了启动地址,为什么不可以直接在某个入口直接启动呢? 我经常不按常规出牌,在装载以后,cpu进入stopped状态,直接修改程序指针PC为:0XFFFF0000,呵呵,很奇妙的芝麻开门,调试指针指向了start.S。
调试窗口中自动打开了start.S:
.globl _start
_start: b reset ...
这就对了,这里就是万里长征的起点。按F6(step),就可以开始了第一条汇编就是b reset,ok,有兴趣的可逐条解读汇编代码,也可以F6信马由缰的浏览下去,好在汇编代码不多,一直到board_init_f,这是一个C函数(arch/arm/lib/spl.c)。在board_init_f中调用board_init_r函数。
board_init_r(comm/spl/spl.c)中是spl中至关重要的工作,可畏步步惊心,是系统启动的核心。。。。。。
比较重要的调用有:timer_init();
spl_board_init();
spl_board_init中完成了包括ddr3内存在内的外设的初始化。
如果需要,我们可以对spl展开详尽的分析。。。。。。