本文继续分析一下 save_boot_params_ret调用的函数:_main汇编函数。
分析 _main函数的下半部分代码。
本文继之前文章的学习,地址如下:
下面继续分析 _main函数,_main函数的部分代码如下:
- 114 adr lr, here
- 115 ldr r0, [r9, #GD_RELOC_OFF] /* r0 = gd->reloc_off */
- 116 add lr, lr, r0
- 117 #if defined(CONFIG_CPU_V7M)
- 118 orr lr, #1 /* As required by Thumb-only */
- 119 #endif
- 120 ldr r0, [r9, #GD_RELOCADDR] /* r0 = gd->relocaddr */
- 121 b relocate_code
- 122 here:
- 123 /*
- 124 * now relocate vectors
- 125 */
- 126
- 127 bl relocate_vectors
- 128
- 129 /* Set up final (full) environment */
- 130
- 131 bl c_runtime_cpu_setup /* we still call old routine here */
- 132 #endif
继续分析_main 函数,如下是继以上代码:
- 131 bl c_runtime_cpu_setup /* we still call old routine here */
- 132 #endif
- 133 #if !defined(CONFIG_SPL_BUILD) || defined(CONFIG_SPL_FRAMEWORK)
- 134 # ifdef CONFIG_SPL_BUILD
- 135 /* Use a DRAM stack for the rest of SPL, if requested */
- 136 bl spl_relocate_stack_gd
- 137 cmp r0, #0
- 138 movne sp, r0
- 139 movne r9, r0
- 140 # endif
- 141 ldr r0, =__bss_start /* this is auto-relocated! */
- 142
- 143 #ifdef CONFIG_USE_ARCH_MEMSET
- 144 ldr r3, =__bss_end /* this is auto-relocated! */
- 145 mov r1, #0x00000000 /* prepare zero to clear BSS */
- 146
- 147 subs r2, r3, r0 /* r2 = memset len */
- 148 bl memset
- 149 #else
- 150 ldr r1, =__bss_end /* this is auto-relocated! */
- 151 mov r2, #0x00000000 /* prepare zero to clear BSS */
- 152
- 153 clbss_l:cmp r0, r1 /* while not at end of BSS */
- 154 #if defined(CONFIG_CPU_V7M)
- 155 itt lo
- 156 #endif
- 157 strlo r2, [r0] /* clear 32-bit BSS word */
- 158 addlo r0, r0, #4 /* move to next */
- 159 blo clbss_l
- 160 #endif
第 141~159 行,清除 BSS 段。
- 77 ENTRY(c_runtime_cpu_setup)
- 78 /*
- 79 * If I-cache is enabled invalidate it
- 80 */
- 81 #ifndef CONFIG_SYS_ICACHE_OFF
- 82 mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
- 83 mcr p15, 0, r0, c7, c10, 4 @ DSB
- 84 mcr p15, 0, r0, c7, c5, 4 @ ISB
- 85 #endif
- 86
- 87 bx lr
- 88
- 89 ENDPROC(c_runtime_cpu_setup)
继续分析_main 函数,如下是继以上代码:
- 162 #if ! defined(CONFIG_SPL_BUILD)
- 163 bl coloured_LED_init
- 164 bl red_led_on
- 165 #endif
- 166 /* call board_init_r(gd_t *id, ulong dest_addr) */
- 167 mov r0, r9 /* gd_t */
- 168 ldr r1, [r9, #GD_RELOCADDR] /* dest_addr */
- 169 /* call board_init_r */
- 170 #if defined(CONFIG_SYS_THUMB_BUILD)
- 171 ldr lr, =board_init_r /* this is auto-relocated! */
- 172 bx lr
- 173 #else
- 174 ldr pc, =board_init_r /* this is auto-relocated! */
- 175 #endif
- 176 /* we should not return here. */
- 177 #endif
- 178
- 179 ENDPROC(_main)
board_init_r(gd_t *id, ulong dest_addr)
这个就是_main 函数的运行流程。
在_main 函数里面调用了 board_init_f、relocate_code、relocate_vectors 和 board_init_r 这 4 个函数,接下来依次看一下这 4 个函数都是干啥的。