Plataforma de arranque de Linux en brazo

Plataforma de arranque de Linux en brazo
Discutiremos en las plataformas del brazo. ¿Cuáles son los componentes básicos de tales plataformas?. Cuando encendemos la placa y Linux está instalado en el sistema, cómo se activa la alimentación de la secuenciación. ¿Cuáles son los otros componentes necesarios para iniciar Linux en cualquier plataforma de brazo??

Descripción

La plataforma ARM es el tablero basado en la arquitectura ARM. Hay muchos fabricantes en el mercado que diseña las plataformas basadas en esta arquitectura. En general, una plataforma ARM tiene los siguientes bloques de construcción:

  1. CPU/SOC: Esta es la principal unidad de procesamiento en la plataforma. Los componentes tienen los componentes internos, como la caché, la SCU, etc.
  2. S-ram interno: Este es el RAM que está presente dentro del SOC. El tamaño de esta memoria es limitado y será pocos KBS.
  3. DDR externo: Esta es la RAM externa, que es de tamaño significativo en comparación con la RAM interna. Esta memoria actúa como la memoria de ejecución para la CPU. En general, esto es de pocos GBS, basado en el diseño del sistema.
  4. Dispositivo de arranque: Este es el dispositivo de almacenamiento permanente externo utilizado para almacenar las imágenes de software necesarias por el sistema para arrancar. Pocos ejemplos de los componentes son los cargadores de arranque, la imagen de Linux, el sistema de archivos raíz. Estos 3 componentes son componentes básicos que necesitan cualquier sistema para arrancar Linux. El ejemplo de los dispositivos de arranque son EMMC, dispositivos de memoria flash NV, tarjeta SD, memoria USB, etc. Estos dispositivos solo se pueden usar para arrancar si el sistema admite el arranque con ese medio. Pocos sistema tienen múltiples opciones de arranque, que pueden controlarse mediante correas o interruptores DIP. Se puede seleccionar cualquier tipo de arranque requerido y las imágenes pueden programarse en los medios de arranque. La programación de las imágenes de arranque se puede hacer con la ayuda de algún programador externo como la herramienta Dediprog.

Imágenes para que el sistema inicie

El primer y más importante elemento necesario para arrancar Linux en la plataforma ARM es que necesitamos las imágenes de compilación de los cargadores de arranque, el kernel de Linux y los sistemas de archivos raíz. Estas imágenes se pueden compilar si la placa está diseñada interna a la organización, pero si el dispositivo se compra a través de algún proveedor, entonces debe proporcionar las instrucciones sobre la generación de imágenes. Incluso en algunos casos, si no proporcionan el código fuente para compilar o construir, entonces proporcionan las imágenes previas a la construcción.

Programación de las imágenes al dispositivo de arranque

Después de tener imágenes listas para arrancar en la plataforma, necesitamos grabar/programar las imágenes en el dispositivo de arranque. Debe haber instrucciones disponibles desde el proveedor o cualquier programador HW se puede utilizar para programar las imágenes en el dispositivo de arranque. El ejemplo de tal programador es dediprog.

Dediprog es la herramienta que se puede usar para programar la imagen flash en el flash NV. Este es el caso del modo de arranque flash. Se necesitan saltadores o configuración para habilitar el arranque flash si están presentes múltiples dispositivos de arranque.

Instantánea de Dediprog:

Después de todo, las imágenes se programan en los medios de arranque y toda la configuración de arranque se realiza para habilitar el tipo de arranque donde hemos mantenido las imágenes para el arranque.

El arranque del Linux se puede considerar en múltiples etapas:

  1. Fase de ROM de arranque
  2. Arranque del primer cargador de arranque en etapa
  3. Boteo del cargador de arranque de la segunda etapa, esto es un boot en general.
  4. Boteo de Linux
  5. Montaje de rootfs y ejecución de los scripts de inicio de Linux hasta que llegue la consola de inicio de sesión.

Discutamos todas estas etapas de arranque en detalle ahora.

Fase de ROM de arranque

En esta etapa, no hay acceso al DDR externo, toda la ejecución debe hacerse en el S-RAM interno. Tan pronto como se enciende el sistema, el código de ROM de arranque inicializa la interfaz de arranque y luego obtiene el cargador de arranque de la primera etapa. Una vez que el cargador de arranque está disponible en RAM interna y está listo para ejecutar, entonces el control se transfiere al cargador de arranque de la primera etapa.

Arranque del primer cargador de arranque en etapa

Inmediatamente después de que la placa se enciende, no hay acceso a la RAM externa disponible para la CPU. La ejecución comienza desde el vector de reinicio. Reset Vector es la ubicación desde donde la CPU comienza a ejecutar las primeras instrucciones de programación. En esta etapa, solo la RAM interna está disponible. Más tarde, el DDR externo se inicializa y luego se obtiene el cargador de arranque de la segunda etapa del medio de arranque y se carga al DDR externo inicializado y el controlador se pasa al cargador de arranque de la segunda etapa I I.mi., U-Boot.

Arranque del cargador de arranque de la segunda etapa o el boot U

Este es un software mínimo necesario para la configuración del entorno que necesita el kernel Linux antes de arrancar. Varios conductores y interfaces HW están habilitados en un entorno U-Boot. Este gestor de arranque proporciona la línea de comando y, por lo tanto, podemos modificar las varias configuraciones en tiempo de ejecución. El objetivo principal de esta etapa es preparar la configuración/placa para el kernel de Linux. En esta etapa, la imagen de Linux se puede obtener de varias opciones disponibles. La imagen de Linux se puede cargar a través de cualquier interfaz desde las diferentes interfaces. Esta etapa obtiene la imagen del núcleo de Linux y pasa el control de ejecución al gestor de arranque.

Arranque Linux

Después de la segunda etapa, el cargador de arranque ha copiado la imagen de Linux al DDR externo. Pasará el control de ejecución a la imagen de Linux. Una vez que la imagen de Linux se inicia, inicia la inicialización de todos los dispositivos/periféricos en el tablero. Inicializa todo el subystem, incluidos todos los controladores y dispositivos. Después de que todos los controladores y dispositivos se inicialicen en esta etapa y el núcleo de Linux se ejecuta a la máxima capacidad posible.

Una vez que se realiza el arranque o la inicialización de los controladores, hay una búsqueda del dispositivo rootfs. La ubicación del dispositivo rootfs también se puede configurar o modificar a partir de los parámetros de la línea de comando de Linux. Los parámetros de línea de comandos para Linux son las variables de entorno en el entorno U-Boot, por lo tanto, actualizar la ubicación del dispositivo RootsFS es solo una modificación de la variable de entorno en U-Boot. También hay otra información disponible en el entorno U-Boot.

Pocos ejemplos son la ubicación del proceso de inicio, el tamaño de la memoria, permitiendo el Devmem, aumentando los niveles logarítmicos del núcleo, etc. Hay pocas otras opciones de variables de entorno U-Boot están disponibles para facilitar otros casos de usuario en U-Boot. Por ejemplo, la asignación de direcciones IP en el BOOT U se realiza con la ayuda de la variable de entorno.

Montaje de rootfs y ejecución de los scripts de inicio de Linux:

El dispositivo rootfs se busca y se monta y luego se busca el proceso de inicio dentro del dispositivo rootfs. Después de que la imagen de inicio se encuentra, el control se transmite al init después de invocar el proceso de inicio. Este es el primer proceso de usuarios que inicia la ejecución. Una vez que Init obtiene el control, inicializa los servicios del espacio de usuario ejecutando los scripts de inicio.

Se inician todos los demonios y los servicios a nivel de sistema se inician ejecutando los servicios de inicio presentes en / etc. / o si el sistema está basado en SystemCTL, entonces todos los servicios se inician según las pautas mencionadas para el sistema SystemCTL. Después de que se inician todos los servicios, se invoca el programa Shell, lo que crea un mensaje de sesión de inicio de sesión para el usuario.

El usuario puede usar esta consola de comando para solicitar varios servicios desde el kernel de Linux.

Ahora, veamos los registros de arranque del sistema Linux que demostrará la etapa de arranque que hemos discutido hasta ahora. Tenga en cuenta que estos no son registros completos. He eliminado pocas líneas en el medio, ya que son enormes troncos. No es relevante para el tema, por lo tanto, acabo de proporcionar los registros relevantes para nuestra discusión.

Nota: No se puede observar la fase ROM de arranque en los registros, ya que UART no está disponible en esta etapa.
Arranque del primer cargador de arranque de la etapa:
U-Boot SPL 2019.04 (17 de agosto de 2021 - 18:33:14 +0000)
Tratando de arrancar desde Ram
Boteo del cargador de arranque de segunda etapa o Boot U:
U-Boot 2019.04 (17 de agosto de 2021 - 18:33:14 +0000)
SOC: AST2600-A1
RST: Power On
Modo LPC: SIO: Habilitar: Superio-2e
ETH: MAC0: RMII/NCSI, MAC1: RMII/NCSI, MAC2: RMII/NCSI, MAC3: RMII/NCSI
Modelo: proveedor BMC
DRAM: ya inicializado, 1008 MIB (Capacidad: 1024 MIB, VGA: 16 MIB), ECC OFF
PCIe-0: enlace hacia abajo
MMC: EMMC_SLOT0@100: 0
Entorno de carga de SPI Flash ... SF: detectado N25Q256A con tamaño de página 256 bytes, borde de tamaño 4 kib, total 32 MIB
*** ADVERTENCIA - Bad CRC, utilizando un entorno predeterminado
En: serial@1e784000
Fuera: serie@1e784000
Err: serial@1e784000
Modelo: proveedor BMC
EEPROM ETH2Addr: EA = AA: BB: CC: DD: DE: E0
BMC ETH2Addr = AA: BB: CC: DD: DE: E3
NET: FTGMAC100_PROBE - NCSI detectado
ETH2: ftgmac@1E670000ftgmac100_probe - NCSI detectado
Advertencia: ftgmac@1e690000 (ETH3) Uso de la dirección MAC aleatoria - FA: 12: FB: CA: BC: FF
, ETH3: ftgmac@1E690000
Presione cualquier llave para detener el autoboot: 2 1 0
## Carga del núcleo desde la imagen de ajuste en 20100000 ..
Uso de la configuración 'conf-1'
Probar la subimagen del núcleo 'kernel-1'
Descripción: Linux Kernel
Tipo: imagen del núcleo
.
.
.
.
Compresión: sin comprimir
Inicio de datos: 0x2067e1c4
Tamaño de datos: 54387 bytes = 53.1 kib
Arquitectura: brazo
Verificar la integridad del hash ... ok
Arrancar usando el blob FDT al 0x2067e1c4
Carga de imagen del núcleo ... ok
Cargando Ramdisk a 8FBE0000, finalizar 8ffffbf0 ... OK
Cargando el árbol del dispositivo a 8FBCF000, finalizar 8FBDF472 ... OK
Botando Linux:
Núcleo inicial ..
[0.000000] arrancando Linux en CPU físico 0xf00
[0.000000] Linux versión 5.1.3.SDK-V00.05.07 (cienauser@haxv-srathore-2) (GCC versión 8.3.0 (BuildRoot 2019.05-rc2)) #3 SMP Sol 29 de agosto 14:19:01 UTC 2021
[0.000000] CPU: procesador ARMV7 [410FC075] Revisión 5 (ARMV7), CR = 10C5387D
[0.000000] CPU: Instrucciones DIV disponibles: Código de división de parcheo
[0.000000] CPU: caché de datos de no alias de PIPT / VIPT, caché de instrucción de alias de VIPT
[0.000000] de: FDT: Modelo de máquina: AST2600 A1 EVB
[0.000000] Política de memoria: Cache de datos WRITEALLOC
[0.000000] Memoria reservada: CMA Memory Pool a 0xBB000000, tamaño 64 MIB
[0.000000] de: MEM reservado: video de nodo inicializado, ID compatible compartido-DMA-Pool
[0.000000] Memoria reservada: CMA Memory Grupo a 0xb7000000, tamaño 64 MIB
[0.000000] de: MEM reservado: RVAS de nodo inicializado, ID compatible compartido-DMA-Pool
[0.000000] Memoria reservada: Grupo de memoria DMA creado en 0xb6e00000, tamaño 2 MIB
[0.000000] de: MEM reservado: nodo inicializado SSP_Memory, ID compatible compartido-DMA-Pool
[0.000000] Memoria reservada: Grupo de memoria DMA creado a 0xb6d00000, tamaño 1 MIB
.
.
.
.
[1.184367] 0x00000000000000-0x0000000F0000: "U-Boot"
[1.191246] 0x0000000F0000-0x00000000100000: "U-Boot-Env"
[1.198363] 0x000000100000-0x000002060000: "Fit"
[1.203661] MTD: la partición "ajuste" se extiende más allá del final del dispositivo "BMC" - Tamaño truncado a 0x1F00000
[1.215347] Vendor-SMC 1E620000.SPI: Bus_Width 2, usando la frecuencia SPI de 50 MHz
[1.223375] Vendor-SMC 1E620000.SPI: N25Q256A (32768 Kbytes)
[1.229723] Vendor-SMC 1E620000.SPI: ventana CE1 [0x22000000 - 0x24000000] 32MB
[1.237996] Vendor-SMC 1E620000.SPI: ventana CE2 [0x24000000 - 0x30000000] 192mb
[1.246357] Vendor-SMC 1E620000.SPI: Registro de control de lectura: [203C0441]
[1.316884] Vendor-SMC 1E630000.SPI: Bus_Width 2, usando la frecuencia SPI de 50 MHz
[1.324821] Vendor-SMC 1E630000.SPI: bytes de identificación JEDEC no reconocidos: 00 00 00 00 00 00
[1.333384] Vendor-SMC 1E630000.SPI: Chip 0 no existe.
.
.
.
[1.631342] UHCI_HCD: controlador de interfaz de controlador de host USB Universal
[1.638622] Plataforma-UHCI 1E6B0000.USB: detectó 2 puertos desde el árbol del dispositivo
[1.646217] Plataforma-UHCI 1E6B0000.USB: Solución de implementación de proveedores habilitados
[1.664722] Plataforma-UHCI 1E6B0000.USB: controlador de host UHCI genérico
[1.671844] Plataforma-UHCI 1E6B0000.USB: nuevo bus USB registrado, asignado el número 2
[1.680671] Plataforma-UHCI 1E6B0000.USB: IRQ 42, IO MEM 0x1E6B0000
[1.687977] USB USB2: Se encontró un nuevo dispositivo USB, IDVENDOR = 1D6B, IDPRODUCT = 0001, BCDDEVICE = 5.01
[1.697237] USB USB2: nuevas cadenas de dispositivos USB: MFR = 3, producto = 2, SerialNumber = 1
[1.705311] USB USB2: Producto: Controlador de host genérico UHCI
[1.711542] USB USB2: Fabricante: Linux 5.1.3.SDK-V00.05.07 uhci_hcd
[1.718824] USB USB2: Number Serial: 1E6B0000.USB
[1.724589] Hub 2-0: 1.0: Hub USB encontrado
[1.728830] Hub 2-0: 1.0: 2 puertos detectados
[1.734689] USBCORE: Controlador de interfaz nuevo registrado USB-storage
[1.753347] Vendor_vhub 1e6a0000.USB-VHUB: HUB virtual inicializado en modo USB2
[1.762327] Conductor de entradas I2C /Dev
[1.767491] I2C_NEW_VENDOR 1E78A080.i2c-bus: new-i2c: i2c-bus [0]: adaptador [100 kHz] modo [2]
.
.
.
[2.960181] Liberando la memoria del núcleo no utilizado: 1024k
[2.970760] MMCBLK0: MMC0: 0001 R1J57L 27.5 GIB
[2.976119] mmcblk0boot0: mmc0: 0001 r1j57l partición 1 16.0 MIB
[2.983067] mmcblk0boot1: mmc0: 0001 r1j57l partición 2 16.0 MIB
[2.989980] MMCBLK0RPMB: MMC0: 0001 R1J57L PARTICIÓN 3 128 KIB, CHARDEV (246: 0)
[2.999275] MMCBLK0: P1
[3.012035] Mapeaciones de W+X verificadas: Pasadas pasadas, no se encontraron páginas w+x
Montaje de rootfs y ejecución de los scripts de inicio de Linux
[3.018367] Run /sbin /init como proceso init

Conclusión

Hemos visto el proceso completo de arranque de Linux en detalles con registros de muestra. También hemos discutido los diversos bloques de construcción del arranque de Linux. También se discutieron pocos otros requisitos previos necesarios para que Linux arrancara. Hay varias etapas involucradas en el arranque de Linux en cualquier placa de procesador de brazo, todas las etapas se discutieron en detalle y se asignaron con los registros de arranque de muestra. Esta discusión es suficiente para proporcionar la comprensión básica sobre el arranque de Linux en los sistemas ARM.