Comprensión de los diversos parámetros de dirección involucrados en los núcleos uBoot y Linux

  

Comprensión de los diversos parámetros de dirección involucrados en los núcleos uBoot y Linux



************************************************* < Br>

arch /arm /Makefile

//El kernel ejecuta la dirección virtual TEXTADDR = 0xC0008000

******************* ******************************

arch /arm /boot /Makefile

//kernel load address ZRELADDR = 0x20008000

************************************* ************

arch /arm /boot /comprimido /Makefile

//Dirección del programa autoextraíble ZTEXTADDR = 0x00000000

(linux -2.4.19- La función autoextraíble gunzip del kernel rmk7 se encuentra en

/lib/inflate.c, que es la versión gzip-1.0.3, y ahora está comprimida en la PC mediante la función gzip

. El archivo no puede ser reconocido por la versión gzip-1.0.3 de gunzip, por lo que linux-2.4.19-rmk7

la función de extracción automática del kernel es equivalente a no ser utilizada. El valor predeterminado ZTEXTADDR = 0x00000000

significa no Uso.
(Solo se puede cargar con la descompresión de gunBip de uBoot)

)

************************* ************ **********

//dirección de almacenamiento de uImage = 0x21000000

********************* **************************

mkimage -A brazo -O linux -C gzip -a 0x20008000 -e 0x20008000 -d Linux.bin.gz uImage

-A: Tipo de CPU

-O: Sistema operativo

-C: Método de compresión utilizado

-a: Dirección de carga del kernel

-e: Dirección de entrada del kernel

*********************** ************************

do_bootm de uBoot (cmd_tbl_t * cmdtp, int flag, int argc, char * argv []);

La función verificará el encabezado de los datos de uImage con formato mkimage almacenados en la dirección 0x21000000

typedef struct image_header {

uint32_t ih_magic; /* Image Header Magic Número * /

uint32_t ih_hcrc; /* Cabecera de comprobación CRC del encabezado de imagen * /

uint32_t ih_time; /* Marca de tiempo de la creación de imagen * /

uint32_t ih_size; /* Tamaño de datos de imagen * /

uint32_t ih_load; /* Dirección de carga de datos * /

uint32_t ih_ep; /* Dirección del punto de entrada * /

uint32_t ih_dcrc; /* Datos de la imagen Control de CRC * /

uint8_t ih_os; /* Sistema operativo * /

uint8_t ih_arch; /* CPU architecture * /

uint8_t ih_type; /* Tipo de imagen * /

uint8_t ih_comp; /* Tipo de compresión * /

uint8_t ih_name [IH_NMLEN]; /* Nombre de la imagen * /

} image_header_t;

(el valor de ih_ep es 0x20008000, el valor de ih_load es 0x20008000)

Si cada cabeza El valor del dominio y crc son legales, entonces do_bootm llamará a la siguiente función de descompresión de gunzip para descomprimir el núcleo comprimido en la dirección

0x21000000 + sizeof (image_header_t):

gunzip ((void *) ntohl (hdr - > ih_load), 0x400000, datos, (int *) &len);

1. Hdr- > ih_load es la dirección de datos de salida 0x20008000

2.0x400000 para el límite superior de datos de salida descomprimidos Gunzip -4M

3. Los datos son los datos de la dirección de los datos de entrada = 0x21000000 + sizeof (image_header_t);

4. Len es la longitud de los datos de entrada len = ntohl (hdr- > ih_size);

El tamaño real de los datos descomprimidos se almacenará una vez que se complete la descompresión

El archivo del kernel de Linux comprimido uImage se descomprime a través de gunzip Después de la función, pase

do_bootm_linux (cmdtp, flag, argc, argv, addr, len_ptr, verificar);

para pasar los cinco parámetros necesarios para la operación del kernel al kernel de Linux

kernel = (void (*) (bd_t *, ulong, ulong, ulong, ulong)) hdr- > ih_ep;

1. Hdr- > ih_ep es 0x20008000

/*

* Parámetros del kernel de Linux:

* r3: ptr para cargar datos de información

* r4: initrd_start O 0 si no hay initrd

* r5: initrd_end: no se utiliza si r4 es 0

* r6: Inicio de la cadena de línea de comando

* r7: Fin de la línea de línea de comando < Br>

* /

(* kernel) (kbd, initrd_start, initrd_end, cmd_start, cmd_end);

Esto completa la transferencia de 5 parámetros necesarios para el inicio del sistema Linux. El trabajo de uBoot ha terminado, y Linux se ejecutará oficialmente en la dirección 0x20008000.

Copyright © Conocimiento de Windows All Rights Reserved