Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Qué es uboot?

¿Qué es uboot?

u-boot es un cargador de arranque de uso común en sistemas integrados. El cargador de arranque es un pequeño programa que se ejecuta antes de que se ejecute el sistema operativo. A través de él, podemos inicializar los dispositivos de hardware y establecer una tabla de mapeo de espacio de memoria, estableciendo así un entorno de software y hardware adecuado. Finalmente, se llama al kernel del sistema operativo para que se prepare. Cargador de arranque La tarea principal del cargador de arranque es leer la imagen del kernel desde el disco duro a la RAM y luego saltar al punto de entrada del kernel para ejecutarlo, es decir, comenzar a iniciar el sistema operativo. El sistema generalmente comienza la ejecución en la dirección 0x00000000 al encenderse o reiniciarse, y lo que está programado en esta dirección suele ser el gestor de arranque del sistema.

Estructura del directorio U-boot:

1. Los archivos de configuración relacionados con la placa de desarrollo se almacenan en la placa y cada placa de desarrollo existe en forma de un subdirectorio;

2. La carpeta Commom implementa soporte para comandos de línea u-boot, y cada comando corresponde a un archivo;

3. La CPU almacena directorios de CPU específicos y almacena los directorios relacionados con arquitecturas de CPU específicas. Cada arquitectura de CPU corresponde a un subdirectorio;

4. El directorio de documentos implementa soporte para comandos de línea u-boot, y cada comando corresponde a un archivo

5. implementa soporte para comandos de línea u-boot. Soporte para comandos de línea u-boot, cada comando corresponde a un archivo;

6. El directorio de documentos admite comandos de línea u-boot y cada comando corresponde a un archivo. Doc es el directorio de documentación, u-boot tiene documentación muy completa;

5.Los controladores son los controladores para varios dispositivos compatibles con u-boot;

6.Fs es el sistema de archivos compatible , el más utilizado es el sistema de archivos JFFS2;

7. La carpeta Incluir es el archivo de encabezado de u-boot, que contiene archivos de ensamblaje, archivos de configuración del sistema y archivos de soporte del sistema de archivos compatibles con varias plataformas de hardware.

8. Net trata sobre protocolos y códigos de red, protocolo bootp, protocolo TFTP y la implementación del sistema de archivos NFS.

9. protocolo, TFTP Implementación del protocolo y sistema de archivos NFS

9.

Uno de los directorios más importantes son los directorios /board, /cpu, /drivers e /include. Si queremos implementar el trasplante de u-boot en una plataforma, debemos analizar estos directorios en profundidad.

Proceso de inicio de u-boot:

El punto de entrada para el inicio del sistema. Dado que ahora vamos a analizar el proceso de inicio de u-boot, primero debemos averiguar qué código implementa u-boot primero y qué tareas se completan primero. Por otro lado, la IMAGEN ejecutable debe tener un punto de entrada, y sólo puede haber un punto de entrada global, por lo que es necesario indicarle al compilador dónde está este punto de entrada. De esto podemos encontrar que el punto de entrada del programa se especifica en /board /lpc2210/u-boot.lds, donde ENTRY(_start) indica que el programa comienza a ejecutarse desde _start y apunta a la CPU /arm7tdmi/start. .o archivo. Dado que utilizamos la arquitectura de CPU ARM7TDMI, la primera instrucción después del reinicio proviene de la dirección 0x00000000, por lo que asignamos Flash a esta dirección para que la CPU ejecute primero el programa u-boot después de encender el sistema.

El proceso de inicio de u-boot es un proceso de implementación de varias etapas, dividido en dos etapas:

La primera etapa está escrita en lenguaje ensamblador y las tareas principales son:

1. Autoinicialización de la CPU: incluida la inicialización de MMU, caché, sistema de reloj, controlador SDRAM, etc.

2. Reubicación: Pasar de la memoria no volátil a la RAM;

2. Pasar de la memoria no volátil a la RAM; >

2. Reubicación: Pasar de la memoria no volátil a la RAM.

Mover a RAM;

3. Asigne espacio de pila y establezca el puntero de pila

4. Borre el segmento de datos BSS

5. Salte a la entrada de la segunda etapa; función start_armboot();

La segunda etapa está escrita en lenguaje C. Las tareas principales son:

1. Asignar espacio de almacenamiento para los datos privados internos de U-boot y borrarlo;<. /p >

2. Llame a las funciones definidas en la matriz de punteros de función init_sequence en secuencia para realizar una serie de inicializaciones;

3. Si el sistema admite NOR Flash, llame a flash_init () y display_flash_config ( ) para inicializar y mostrar la detección

4. Si el sistema admite LCD o VFD, llame a lcd_setmem() o vfd_setmem() para calcular el tamaño del Framebuffer, luego asigne espacio para el Framebuffer después del segmento de datos BSS. e inicializar gd-gt; fb_base se utiliza como dirección inicial de Framebuffer;

5. Llame a mem_malloc_init() para inicializar el sistema de asignación de almacenamiento (similar al montón en lenguaje C) y asignar espacio;

6. Si el sistema admite memoria flash NAND, llame a nand_init () para la inicialización

7. /p>

8. Si el sistema admite DataFlash, llame a AT91F_DataflashInit() y dataflash_print_info() inicialice y muestre la información del dispositivo detectado.

8. es decir, moverlos de la memoria flash a la RAM; <

9. Si el sistema admite VFD, llame a drv_vfd_init() para inicializar el dispositivo VFD;

10. Dirección MAC de las variables de entorno e inicialice gd-gt; bd-gt; bi_ip_addr y gd-gt; bd-gt;

11. Llame a env_relocate () para reubicar las variables de entorno. , muévalos de la memoria flash a la RAM;

2. p>

11. Llame a jumptable_init () para inicializar la tabla de salto y su propósito exacto. no está claro;

12. Llame a console_init_r () para inicializar la consola;

p>

13 Si es necesario, llame a misc_init_r () para inicializaciones diversas

.

14. Llame a enable_interrupts () para activar las interrupciones;

15 Si es necesario, llame a board_late_init () Realice la inicialización de la placa, para AT91SAM9260EK, es principalmente la inicialización de Ethernet;

16. Ingrese al bucle principal: inicie Linux según la elección del usuario, o ingrese al bucle de comando para ejecutar el comando ingresado por el usuario;

Esta parte es una parte relativamente sin cambios. Las funciones de inicialización que llama se cambian para diferentes placas y el proceso de inicialización se cambia configurando algunas definiciones de macro. Por lo tanto, estos códigos no necesitan modificarse durante el proceso de trasplante y también se eliminan relativamente pocos archivos.

Al comienzo del archivo, se define una matriz de punteros de función. El programa recorre esta matriz para realizar una inicialización regular y luego inicializa algunos dispositivos específicos a través de algunas definiciones de macro. Finalmente, el programa ingresa a un bucle (main_loop) para recibir parámetros establecidos por el usuario o comandos de inicio.