proceso de inicio de uboot que involucra la función de ensamblaje _main

1. El proceso de inicio de Uboot implica funciones

Este artículo continúa analizando la función llamada por save_boot_params_ret: _función de ensamblaje principal.

Analice la mitad inferior del código de la función _main.

Este artículo sigue el estudio del artículo anterior, la dirección es la siguiente:

Proceso de inicio de uboot que involucra la función de ensamblaje _main-CSDN Blog

  2. _función de ensamblaje principal

Sigamos analizando la función _main, parte del código de la función _main es el siguiente:

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

En la línea 114 , configure el registro lr en aquí , de modo que cuando se ejecuten otras funciones más tarde y regresen, regresará a la posición aquí en la línea 122 .
No. 115 , lea el valor de gd->reloc_off y cópielo en el registro r0 , GD_RELOC_OFF=68 .
Línea 116 , el valor del registro lr se suma al valor del registro r0 y el valor se reasigna al registro lr .
Porque el código debe reubicarse a continuación . Es decir, copie el código en una nueva ubicación ( la dirección inicial actual del almacenamiento de uboot es 0X87800000 . A continuación , uboot se copiará al último espacio de direcciones de DDR y la memoria a partir de 0X87800000 quedará libre ) , incluido aquí , Por lo tanto, aquí en lr se debe utilizar la posición reubicada.
Línea 120 , lea el valor de gd->relocaddr y asígnelo al registro r0 . En este momento, el registro r0 contiene la dirección de destino que será copiada por uboot , que es 0X9FF47000 . GD_RELOCADDR=48 .
La línea 121 llama a la función relocate_code , que es la función de reubicación de código. Esta función es responsable de copiar uboot a un nuevo lugar. Esta función está definida en el archivo arch/arm/lib/relocate.S. Esta función será analizada en detalle. más tarde.
La línea 127 llama a la función relocate_vectors para reubicar la tabla de vectores de interrupción. Esta función está definida en el archivo arch/arm/lib/relocate.S . Esta función se analizará en detalle más adelante.

Continúe analizando la función _main. La siguiente es la continuación del código anterior:

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

Las líneas 141 ~ 159 borran el segmento BSS .

La línea 131 llama a la función c_runtime_cpu_setup . Esta función está definida en el archivo arch/arm/cpu/armv7/start.S . El contenido de la función es el siguiente: Debería ser la función de desactivar I-cache:
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)

Continúe analizando la función _main. La siguiente es la continuación del código anterior:

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)
La línea 167 establece los dos parámetros de la función board_init_r . La función board_init_r se declara de la siguiente manera:
board_init_r(gd_t *id, ulong dest_addr) 
El primer parámetro es gd , por lo que r9 se lee y se guarda en r0 .
Línea 168 , establezca el segundo parámetro de la función board_init_r en la dirección de destino, por lo que r1= gd->relocaddr .
Línea 174 , llama a la función board_init_r , esta función está definida en el archivo common/board_r.c , que se detallará más adelante.
Analiza esta función.

 

Este es el proceso en ejecución de la función _main .

En la función _main , se llaman las cuatro funciones board_init_f , relocate_code , relocate_vectors y board_init_r . A continuación, echemos un vistazo a lo que hacen estas cuatro funciones a su vez.

Supongo que te gusta

Origin blog.csdn.net/wojiaxiaohuang2014/article/details/133437881
Recomendado
Clasificación