Linux: gestor de arranque en el desarrollo de Linux integrado

Casi todos los sistemas Linux integrados incluyen un gestor de arranque; técnicamente hablando, no es parte de Linux, pero el gestor de arranque es una parte clave de las aplicaciones Linux integradas.

Si bien es teórica y técnicamente posible que un sistema integrado comience a ejecutar el kernel de Linux después del reinicio, generalmente no se hace. Los sistemas integrados normalmente separan la responsabilidad de ejecutar el código de arranque inicial y la prueba automática de encendido (POST) del sistema operativo en un cargador de arranque separado.

Cuando se enciende un sistema integrado, la CPU ejecuta un código de inicialización, conocido como gestor de arranque. El gestor de arranque inicializa el hardware necesario, luego encuentra el siguiente programa para ejecutar, carga ese programa en la memoria y salta a ese programa para su ejecución. A partir de este momento, el código del cargador de arranque ya no se ejecutará, por lo que se eliminará de la memoria.

El próximo programa a ejecutar puede ser cualquier cosa. No es raro que un cargador de arranque cargue el siguiente cargador de arranque, que luego carga otro cargador de arranque. Pero de todos modos, para obtener un sistema utilizable, termina cargando el código del sistema operativo, generalmente el kernel de Linux. Un sistema simple ejecutaría un cargador de arranque después de reiniciar la CPU, luego cargaría y ejecutaría el sistema operativo.

Tener un cargador de arranque separado, en lugar de ejecutar el kernel directamente, proporciona flexibilidad; el kernel puede colocarse en diferentes lugares de la memoria para que el cargador de arranque lo encuentre y lo cargue. De esta forma, al almacenar diferentes configuraciones en el gestor de arranque, se puede utilizar el mismo gestor de arranque desde el desarrollo inicial del sistema embebido hasta la producción. Por ejemplo, en las primeras etapas de desarrollo, una plataforma integrada puede iniciarse completamente desde la red; en un desarrollo posterior, puede iniciarse desde una tarjeta SD; y un sistema de producción puede iniciarse desde NAND flash.

Se pueden pasar varias configuraciones del hardware al kernel en forma de parámetros, de modo que diferentes sistemas de hardware embebidos basados ​​en la misma plataforma, es decir, dispositivos con la misma arquitectura pero diferentes configuraciones de hardware, pueden usar el mismo archivo binario del kernel.

Los cargadores de arranque vienen en todas las formas y tamaños. Lo que desea en un cargador de arranque es que sea simple, personalizable y tenga muchas configuraciones de ejemplo para placas y dispositivos de desarrollo comunes. La siguiente tabla muestra algunos cargadores de arranque de uso común:

Nombre

Principales arquitecturas compatibles

el submarino

ARCO, ARM, Blackfin, Microblaze, MIPS, Nios2, OpenRiec, PowerPC, SH

Barebox

ARM, aleta negra, MIPS, Nios2, PowerPC

GRUB 2

X86, X86_64

pequeño núcleo

BRAZO

bota roja

BRAZO, MIPS, PowerPC, SH

CFE

MIPS de Broadcom

MALO

MIPS

arranque en U

El programa de arranque más común en los sistemas Linux integrados es U-Boot. El nombre oficial de U-Boot es Das U-Boot, pero todo el mundo lo llama simplemente U-Boot. Admite muchas arquitecturas de procesador (CPU), incluidas 68k, ARM, MicroBlaze, MIPS, Nios, SuperH, PPC, RISC-V, x86 y muchas más. También contiene una gran cantidad de código y es compatible con muchas placas de desarrollo integradas existentes.

U-Boot es un gestor de arranque de código abierto. Para su sistema integrado personalizado, el código de U-Boot se puede modificar para admitir su hardware específico.

U-Boot también tiene muchos controladores, lo que significa que puede encontrar el núcleo desde muchos lugares diferentes. U-Boot tiene FTP, memoria flash NAND, MMC, i2c y otros controladores. También incluye controladores de sistemas de archivos como FAT, ext2/3/4, Cramfs, Squashfs, JFFS2, UBIF, ZFS, btrfs, etc. Esto significa que en diferentes medios y en diferentes sistemas de archivos, U-Boot puede encontrar los archivos binarios del kernel almacenados en él.

La configuración de inicio de U-Boot se almacena en forma de variables de entorno. U-Boot generalmente almacena estas variables de entorno en la memoria flash y sus valores pueden persistir entre reinicios. Cuando se ejecuta U-Boot, busca una variable de entorno llamada "bootcmd". Luego, U-Boot expandirá esta variable y ejecutará cualquier comando en ella.

U-Boot incluye una sintaxis similar a Unix para la línea de comandos. En este entorno de línea de comandos, puede modificar las variables de entorno y almacenar los nuevos valores en flash para usarlos en arranques posteriores.

En la práctica, puede usar U-Boot para la configuración en las primeras etapas del desarrollo. Por ejemplo, configure para iniciar el kernel a través de TFTP, utilizando NFS como sistema de archivos raíz. Luego, cuando esté cerca de una versión de software, puede cambiarlo para que arranque desde la tarjeta SD usando ext4 a través de MMC. Cuando esté cerca de la producción, puede cambiar U-Boot para usar UBIFS para arrancar desde el flash NAND dentro de la placa.

Otra función importante de U-Boot es el soporte para el árbol de dispositivos. El árbol de dispositivos es una forma relativamente nueva de describir el hardware en el kernel de Linux. Los sistemas integrados rara vez tienen hardware detectable en tiempo de ejecución. El núcleo no puede encontrar nuevo hardware disponible a través de consultas de hardware. Se debe informar al núcleo qué dispositivos o hardware están presentes. En lugar de codificar la información del hardware en el código, el núcleo puede leer el árbol de dispositivos que describe el hardware y cargar los controladores apropiados. Esto permite que el mismo kernel binario se ejecute en diferentes placas basadas en la misma arquitectura.

Como sabe, U-Boot es una opción general para sistemas integrados debido a su amplia compatibilidad con dispositivos y sistemas de archivos, junto con su flexibilidad. Para obtener más información sobre U-Boot, puede visitar el sitio web del proyecto: The U-Boot Documentation — Documentación de la versión desconocida de Das U-Boot

Otros cargadores de arranque

Si bien U-Boot es el más utilizado, también hay otros cargadores de arranque disponibles para sistemas integrados. Si bien sería demasiado espacio para cubrir todos los cargadores de arranque posibles, se presentarán varios otros cargadores de arranque comunes de código abierto.

Barebox está desarrollado en base a U-Boot. Tiene mucha de la misma flexibilidad que U-Boot, pero se esfuerza por parecerse más a Linux. Utiliza una arquitectura de controlador similar al kernel de Linux, incluido el uso de un sistema de archivos interno y el uso de nodos de dispositivos en /dev dentro del sistema de archivos. URL: Barebox  .

RedBoot es un cargador de arranque para Red Hat. Utiliza la tecnología eCos RTOS internamente y proporciona un depurador, el depurador utiliza un puerto serie o Ethernet.

referencia:

1. Cómo elegir un gestor de arranque

Elegir un gestor de arranque - Dominar la programación integrada de Linux - Segunda edición [Libro]

2. El cargador de arranque incorporado proporcionado

Cargadores de arranque para sistemas Linux integrados: la nueva pila

Supongo que te gusta

Origin blog.csdn.net/guoqx/article/details/130986258
Recomendado
Clasificación