U-Boot apreciará que la primera etapa del código de la llave

  

dirección de entrada
programa 1.u-arranque

dirección de entrada del programa ha de entenderse, por supuesto, posible que el archivo de conexión, primer vistazo al archivo de conexión " /tabla /smdk2410/u-boot.lds".

ENTRADA (_start)

Secciones

{

= 0x00000000;

. = ALIGN (4);

.text: (. texto)

{

cpu /ARM920T /start.o (.text)

*

}

= ALIGN (4); (. Rodata).

.rodata :. {*}

= ALIGN (4);

.data: {(. de datos) *}

= ALIGN (4);

.got :. {(. GOT) *}

__u_boot_cmd_start =;

.u_boot_cmd: .. {* (u_boot_cmd.)}

= __u_boot_cmd_end;

= ALIGN (4);

__bss_start. =;

.bss: {..
(. BSS) *}

= _END;

}

(1) desde la entrada (_start) Como puede verse en la función de entrada u-boot _start

(2) a partir de. = 0x00000000 dirección _start puede verse es 0x00000000, no es el caso, 0x00000000 no válidos, en el momento de la conexión a la larga ser reemplazado por TETX_BASE, específicamente solicitado config.mk referencia u-boot en el directorio raíz.

(3) muchos dicen que el Internet es _start = TEXT_BASE, creo que este argumento es correcto, de hecho, no código TEXT_BASE asignan a 0x0 donde, de hecho, el compilador para compilar, se llevó a cabo de acuerdo con el archivo vinculado. En otras palabras, la traducción de todas las direcciones son relativas a TEXT_BASE calculado. Y esta es la dirección especificada en el archivo de conexión que es 0x338f0000, se puede ver los archivos de enlace, se puede ver el interior de desmontaje dirección, dirección completa del 0x33f8XXXX.

1,1 cpu /ARM920T /start.S parte del código duda

(1)

[html] ver _TEXT_BASE plaincopy:

.word TEXT_BASE

aquí una etiqueta de lenguaje ensamblador _TEXT_BASE definida, su valor es y " .word TEXT_BASE y " dirección del enlace el valor de este código se encuentra; TEXT_BASE
definido en el tablero \\ SMDK2410 \\ config.mk presentar

(es decir 0x33F80000). Después valor TEXT_BASE pueden obtenerse por _TEXT_BASE referencia.

(2)

[html] vista plaincopy .globl _armboot_start

_armboot_start:

.word _start
externa

puede ser definido por referencia _armboot_start variable, que es el código y " .word _start " valor de la dirección de enlace está situado. Después de

figura 1 u-boot.map

compilado, generada archivo u-boot.map, como se muestra en la figura. La Figura 1 muestra los valores de dirección _armboot_start referencia 0x33f80044. UltraEdit con u-BOOT.bin abierto, posicionados compensado a 0x44 (0x44 _armboot_start obtenido a partir de la dirección donde 0x33f80044-TEXT_BASE), que se muestra en la Figura 2, este valor dirección del enlace es referido _start 33 F8 00 00 (modo poco-endian).

figura 2 u-BOOT.bin

(3)

[html] vista plaincopy .globl _bss_start

_bss_start:.

. .word __bss_start

valores __bss_start definidos en la placa /SMDK2410 /u-boot.lds archivo:

[html] vista plaincopy = ALIGN (4);

__bss_start =;

.bss :. {* (BSS).}

= _END;

= __bss_start; representa el valor __bss_start es el valor de la posición actual ... ? ¿Cuánto de ello desde la posición actual es la siguiente frase .bss: {* (. Ss)} que conozco. Inmediatamente detrás de esta posición se pone inmediatamente segmento bss los datos. Así, __ bss_start por supuesto, es la dirección inicial del segmento bss. _END es el final del segmento de dirección de BSS.

segmento BSS es el último eslabón de esta secuencia de comandos. start.S es la dirección de inicio del segmento para calcular el tamaño del código de u-boot a transferir, es decir, todo el segmento de datos anterior se moverá a TEXT_BASE, y luego saltar al start_armboot, es decir, el lenguaje C código de entrada . __bss_start Este valor es la cantidad de? valor después Compilo 0x33f979d4. archivo U-boot.map puede ser hallado, se muestra en la Fig. 3, bss segmento se asigna desde el principio 0x33f979d4.

figura 3 u-boot.map

puede verse en la Fig. 1, referido como el _bss_start dirección del enlace 0x33f80048, es decir, cuando la dirección de inicio se almacena en la sección de BSS. Abrir u-BOOT.bin, posicionados compensado a 0x48 (0x48 _bss_start obtenido a partir de la dirección donde 0x33f80048-TEXT_BASE), el valor determinado en la Fig. 2 como 33 F9 79 D4 (modo poco-endian).

2.SDRAM inicialización, lowleverl_init.S

_TEXT_BASE:

.word TEXT_BASE

.globl lowlevel_init

lowlevel_init:

/* configuración de control de memoria * /

/* hacer r0 relativa la ubicación actual para que * /

/* lee SMRDATA de flash en lugar de la memoria! * /

LDR R0, = SMRDATA

LDR r1, _TEXT_BASE

sub r0, r0, r1

LDR r1, BWSCON = /* Ancho de bus de estado del controlador * después /

añadir r2, r0, # 13 * 4

y no entienden SMRDATA _TEXT_BASE restar estas dos direcciones, ¿qué valor tiene en el extremo. ¿Por qué debería restar?

Nuestro programa se almacena en Flash, hay una dirección de carga dirección llamada, por supuesto, es a partir de esta dirección de 0x0 y referencia compilador utilizados están basados ​​en _TEXT_BASE dirección y nos llamaron un enlace o dirección de ejecutar. A continuación, cargar y ejecutar las direcciones no son los mismos, por lo que piden a nuestro código no se ha trasladado a (0x33f80000) se utiliza para estar en esta posición TEXT_BASE no utilizar estas etiquetas. Si los números de llamada directa, el programa sobre la marcha, sólo para ejecutar antes de que puedan llamar a los números de SDRAM, porque 0x33f80000 de SDRAM. Sólo podemos encontrar un 0x0 compensar dirección relativa a cabo, sólo pueden ser datos de definición muy SMRDATA, que no tiene nada que ver con esta parte de la dirección del código, la compensación se basa en el PC sea. Para analizar los siguientes códigos:

ldr r0, = etiqueta de dirección absoluta SMRDATA SMRDATA logra, que es mayor que _TEXT_BASE; r1 LDR, _TEXT_BASE tomar dirección base (0x33f80000). r0 sub, después de r0, r1 SMRDATA obtiene restando el desplazamiento con respecto _TEXT_BASE.

código de arranque 3.UBOOT reubicación

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

aa /* cambie de U-Boot en la memoria RAM * /

adr r0, _start /* r0 < - la posición actual del código * /

LDR r1, _TEXT_BASE /* prueba si se corre desde la memoria flash o RAM * /

han sido confusos r0, r1, cuando son iguales, cuando se varía, adr y LDR directiva para ver la diferencia entre

adr pequeña dirección se lee Directiva, la instrucción basada en la dirección del valor PC desplazamiento relativo se lee en un registro; grande LDR Directiva leer rango de direcciones, de inmediato o de carga 32 es una dirección en el registro especificado.

_start dirección del enlace se ha determinado en el momento de la relación entre la dirección de desplazamiento de cada instrucción, independientemente de la posición, el desplazamiento es negativo, como es siempre el segmento de código de dirección _start de partida. Supongamos que la cantidad de desplazamiento entre la instrucción _start PC dirección del enlace se denomina x, el valor es negativo, el adr r0 ejecución, cuando _start, r0 ldr equivalente, = PC + x (x < 0), el cuando el valor de R0 es el segmento de código de inicio. Debido a que la dirección de la PC está cargado actualmente en la dirección del código, y se refiere a la dirección de instrucción basada en el enlace _start (código de enlace de dirección de inicio) de la adición de cambio, el código se almacena en la dirección de inicio, es decir, de carga la dirección de inicio.

Copyright © Conocimiento de Windows All Rights Reserved