前面已经添加了点灯代码了,那就让我们开始调试吧。
前面添加点灯代码的时候我们就知道,代码是能够成功运行到crt0.S中的_main的,那我们就可以直接从crt0.S中开始分析了。分析前大家可以花点时间看看crt0.S文件最上面的注释,看完应该就对_main所做的事情有所了解了。另外,我们还可以通过指令arm-none-eabi-objdump -S ./spl/u-boot-spl > u-boot-spl.S 将./spl/u-boot-spl这个可执行文件反汇编,这样就可以通过反汇编代码了解uboot真正的执行流程了。
先看下面的反汇编代码:
02024af0 <_main>:
*/
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
ldr sp, =(CONFIG_SPL_STACK)
#else
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
2024af0: e3a0d781 mov sp, #33816576 ; 0x2040000
#if defined(CONFIG_CPU_V7M) /* v7M forbids using SP as BIC destination */
mov r3, sp
bic r3, r3, #7
mov sp, r3
#else
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
2024af4: e3cdd007 bic sp, sp, #7
#endif
mov r0, sp
2024af8: e1a0000d mov r0, sp
bl board_init_f_alloc_reserve
2024afc: eb000004 bl 2024b14 <board_init_f_alloc_reserve>
mov sp, r0
2024b00: e1a0d000 mov sp, r0
/* set up gd here, outside any C code */
mov r9, r0
2024b04: e1a09000 mov r9, r0
bl board_init_f_init_reserve
2024b08: eb000004 bl 2024b20 <board_init_f_init_reserve>
mov r0, #0
2024b0c: e3a00000 mov r0, #0
bl board_init_f
2024b10: ebffff5e bl 2024890 <board_init_f>
可以看到,在_main中,会对全局变量和栈进行初始化,其中 board_init_f_alloc_reserve 和 board_init_f_init_reserve 这两个函数的代码较少,大家看注释也可了解它们具体做了什么事情。接下来我们重点分析board_init_f这个函数。board_init_f在/arch/arm/mach-exynos/spl_boot.c中实现