Acerca del inicio del sistema integrado (COMPARTIR PARA TODOS)

  

El inicio de Linux incorporado se divide en dos partes, inicio del sistema y inicio de Linux. El inicio del sistema completará la CPU y los dispositivos de E /S relacionados y cargará Linux en la memoria antes de que Linux se cargue en la memoria. El arranque del sistema es implementado principalmente por el BootLoader. Después de que BootLoader cargue el kernel de Linux en la memoria, pase el poder a LinuxKernel y entre en la sección de arranque de Linux. El siguiente es un análisis detallado del proceso de inicio y los archivos utilizados.

Primero, el inicio del sistema y BootLoaderBootLoader son muy diferentes de la PC debido a la diferencia del sistema incorporado. Aquí, el inicio de Hyper250 (Inter Xscale GDPXA250) se toma como ejemplo para el análisis. Como no hay una placa de controladores BIOS, EnbeddedOS debe ser manejado por el cargador de arranque para completar todo el hardware y completar la inicialización del hardware. Todos los archivos de inicialización están en el directorio hyper250 /Bootloader. Primero analice los componentes del archivo de arranque: hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /start_xscale.S contiene dos archivos de biblioteca: hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /config. El archivo config.h de Hhyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /start_xscale.h completa principalmente la definición de macro y configuración de cada hardware del sistema, xscale.h completa principalmente la configuración del chip del sistema y la operación del sistema .

El siguiente análisis del archivo config.h: (1) definición de macro del dispositivo de bus de almacenamiento: define el tamaño del Flash, la longitud de la palabra y otra información, define la dirección base, el tamaño y el tamaño de bloque de la SRAM.
(2) Configuración de memoria dinámica: defina el tamaño y la dirección base de la DRAM.
(3) Información del paquete: nombre del paquete, número de versión.
(4) Establezca la posición de BOOT LOADER: el valor máximo de la DRAM y la SRAM, la ubicación de carga de la DRAM y la dirección base de la pila.
(5) Establezca la ubicación del núcleo: la dirección base de DRAM y SRAM, el valor máximo de KERNEL y el número de bloques en KERNEL.
(6) Establezca la ubicación del sistema de archivos: el directorio base de la DRAM y la SRAM, el valor máximo del sistema de archivos y la cantidad de bloques en el sistema de archivos.
(7) Establezca el programa LOADER: la dirección base de memoria estática del programa LOADER, el valor máximo del programa LOADER y el número de bloques.
(8) Configuración de la red El siguiente archivo de análisis e inicio_xcalse.h: (1) define la dirección de la base de memoria (A0000000) (2) define la dirección de la base de compensación (40D00000) y la compensación de la pila de protección de interrupciones (3) define la dirección de la base de administración del reloj ( 41300000) y el desplazamiento del registro y su valor inicial (4) definen la dirección base del registro de la interfaz GPIO (40E00000) y el desplazamiento de cada registro (5) define el valor inicial de cada registro de la interfaz GPIO (6) define la dirección base del registro de control de la memoria (48000000 Y el desplazamiento de cada registro (7) define el valor inicial del registro de control de memoria (8) define los parámetros del registro de administración de energía (9) define la dirección base del registro FFUART (40100000) y el desplazamiento de cada registro (10) define cada FFUART El valor inicial del registro se analiza mediante el archivo start_xcalse.S: (1) configurando la dirección base de interrupción (40D00000), completando la inicialización de la pila de protección contra interrupciones (2) inicializando la interfaz GPIO (3) inicializando la memoria SDRAM (4) copiando el cargador de arranque desde el flash a En SDRAM (5), cargue la imagen del kernel de Linux, cargue el kernel de Flash (000C 0000) en SDRAM (A0008000).
(6) Configure la pila de protección (7) para llamar a la función principal de main.c c_main () anterior a start_xcalse. S inicializa el hardware relacionado con el sistema a través de un archivo de ensamblaje escrito por el estándar de programación APCS Y completó la carga de BootLoader y la carga del kernel de Linux, y finalmente transfirió el poder a main.c. Lo siguiente analizará el archivo main.c: hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /main.c y dos archivos de biblioteca hyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /main.hhyper250 /Bootloader /X-Hyper250R1.1-Boot /src /include /scc.h # 2

Segundo, análisis del proceso de arranque de Linux

1.Makefile analysis: Análisis de arch /arm /boot /Cuando se usan los archivos en el directorio comprimido, el análisis del Makefile es muy importante, porque el núcleo se generará en este directorio. El trabajo principal aquí es comprimir y descomprimir el núcleo. Este directorio generará los archivos vmlinux, head.o, misc.o, head-xscale.o y piggy.o después de la compilación. Entre ellos, vmlinux es un kernel que no ha sido comprimido. Head.o es el archivo de encabezado del kernel, responsable de la configuración inicial. Misc.o será el principal responsable de la descompresión del núcleo, que está después de head.o. El archivo head-xscale.o es principalmente para la inicialización de Xscale y se fusionará con head.o en el momento del enlace. Piggy.o es un archivo intermedio, que en realidad es un kernel comprimido, pero no hay un enlace al archivo de inicialización y al archivo extraído. 2. Análisis de descompresión: después de que BootLoader complete el inicio del sistema y llame al kernel de Linux a la memoria, llame a bootLinux (), que saltará al principio del kernel. Si el kernel no está comprimido, se puede iniciar. Si el núcleo está comprimido, se descomprimirá, y hay un programa de descompresión en el encabezado del núcleo comprimido. La primera ubicación de origen de archivo de la entrada del kernel comprimido está en arch /arm /boot /compress /head.S. Llamará a la función decompress_kernel (), que se encuentra en el archivo arch /arm /boot /compress /misc.c, decompress_kernel () llama a proc_decomp_setup (), arch_decomp_setup (), y luego imprime el mensaje "Sin comprimir Linux" ... and" después de llamar a gunzip (). Ponga el kernel en la ubicación especificada. Los archivos que se ejecutan por primera vez son: arch /arm /boot /compress /head.Sarch /arm /boot /compress /head-xscale.Sarch /arm /boot /compress /misc.c Estos archivos se utilizan principalmente para descomprimir el kernel y comenzar. Imagen del núcleo. Una vez que se arranca el kernel, se liberará el espacio de memoria ocupado por estos archivos. Además, una vez que el sistema se reinicia por reinicio, cuando el BootLoader coloca el kernel comprimido en la memoria, primero se debe ejecutar el código. El siguiente análisis del archivo head.S: (1) Para la configuración de salida DEBUG de varias CPU de Arm, la macro se utiliza para unificar la operación.
(2) Establezca las direcciones de inicio y finalización del kernel y guarde la ID de arquitectura.
(3) Si se usa la CPU en ARM2 o superior y se usa el modo de usuario normal, se actualizará al modo de superusuario y luego se apagará.
(4) Analice el desplazamiento delta de la estructura LC0 para determinar si es necesario volver a cargar la dirección del kernel (r0 almacena el desplazamiento y determina si r0 es cero). Ya sea que necesite volver a cargar la dirección del kernel aquí, pensé principalmente en analizar tres archivos de arch /arm /boot /boot /make /arch /arm /boot /comprimido /make /arch /arm /boot /comprimido /vmlinux.lds.in, principalmente para ver vmlinux La ubicación de la sección principal del archivo de enlace .lds.in, LOAD_ADDR (_load_addr) = 0xA0008000, y la posición de TEXT_START (_text, _start) solo se establece en 0, BSS_START (__ bss_start) = ALIGN (4). El resultado de esto depende de la forma en que se descomprime el kernel, es decir, si el kernel está descomprimido en la memoria (RAM) o FLASH, porque aquí, nuestro BOOTLOADER mueve el kernel comprimido (zImage) a RAM 0xA0008000. Ubicación, nuestro núcleo de compresión se organiza en la memoria (RAM) a partir de la dirección 0xA0008000, por lo que nuestro r0 obtiene la dirección de desplazamiento (0xA0008000). El siguiente paso es traducir la dirección relativa de la imagen del kernel a la dirección física de la memoria, que es la dirección del kernel sobrecargada.

Copyright © Conocimiento de Windows All Rights Reserved