¿Qué es un cargador de arranque? Etapas De Su Proceso.

Cuando dicen que el sistema se está 'iniciando', se sabe que significa que el sistema se estaba preparando para que el usuario comience a usar sus aplicaciones, pero ¿sabes cómo exactamente se está 'preparando'? no te preocupes este artículo está dedicado a explicarte qué es un cargador de arranque dedicado a los profesionales y aficionados.

Esta es la explicación más simple de un gestor de arranque integrado. Pero, ¿qué hace realmente el código del cargador de arranque durante este corto tiempo y cómo prepara el sistema? Exploremos este proceso con más detalle en este artículo.

 

También puedes leer: 10 Mejores Programas Para Crear Un USB Booteable

Índice()

    Qué es un cargador de arranque

    Un cargador de arranque integrado es conocido como una pieza de software que lleva a un sistema de un estado de encendido a un estado utilizable. Para ser más específico, es el código que se ejecuta desde el momento en que presiona el botón de encendido, hasta el momento en que llega a la función principal en su código.

    Qué es un cargador de arranque
    Qué es un cargador de arranque

    Que tan necesario es un cargador de arranque

    Todo el software que se ejecuta en cualquier sistema se puede dividir en 2 piezas grandes:

    • Gestor de arranque (enciéndalo justo antes de la función 'principal')
    • Firmware (de main, la aplicación de usuario)

    Tomemos un ejemplo familiar de una PC con Windows. Presiona el botón de encendido y generalmente espera la pantalla de inicio de sesión. El código que se ejecuta desde el momento en que presiona el botón de encendido hasta que aparece la pantalla de inicio de sesión se llama cargador de arranque.

    En los sistemas Linux, los cientos de líneas de texto que aparecen antes de que se le solicite que ingrese sus credenciales de inicio de sesión son el resultado del software del cargador de arranque que se ejecuta detrás de escena.

    En un microcontrolador típico, los vecinos de un microprocesador incluyen SRAM, DRAM, flash, EEPROM, temporizadores, controladores GPIO y controladores en serie para protocolos de comunicación en serie como USB, UART, Ethernet, SPI e I2C. Estos vecinos se denominan normalmente periféricos en chip.

    Los sistemas integrados están diseñados para olvidar todo cuando se apagan (excepto los datos que ya están almacenados en su memoria no volátil como flash o EEPROM).

    Etapas del cargador de arranque

    En el momento en que se aplica la energía el microprocesador dentro de un SoC no recuerda a ninguno de sus vecinos. Lo único que recuerda un microprocesador integrado es qué instrucción debe ejecutar tan pronto como se encienda. Este código suele ser una sola instrucción, generalmente llamada código de reinicio.

    Este código generalmente no hace más que transferir la ejecución a otro fragmento de código llamado código de inicialización de hardware. El código de inicialización del hardware es donde ocurre la magia y se explica en la siguiente sección.

    Etapa 1: inicialización del hardware

    Un ejemplo familiar del mundo de las PC aquí es el software que se ejecuta en el corto período de tiempo entre que presiona el botón de encendido en su computadora y la pantalla se ilumina con el logotipo de su proveedor de placa base.

    Solía ​​pensar que presionar el botón de encendido solo le da electricidad a la computadora y, como resultado, enciende la pantalla como una bombilla en nuestras casas. Nunca tuve la menor idea de que se está ejecutando algún código ni siquiera para hacer este proceso simple y que hay una razón para su existencia.

    El nombre de esta pieza de código es código de inicialización de hardware y hace todo el trabajo duro de preparar el sistema para la siguiente etapa de arranque. Despierta el procesador, que a su vez despierta algunos de los otros periféricos en la placa base de la computadora y uno de ellos es la tarjeta gráfica que está conectada a nuestro dispositivo de salida favorito 'el monitor'.

    Un punto importante a tener en cuenta

    Aquí es que solo se inicializan los periféricos que se necesitan para la siguiente etapa del proceso de arranque. Estos también se conocen como periféricos críticos.

    En el caso de una PC, generalmente esta lista de periféricos críticos generalmente solo incluye la pantalla y el teclado, aunque en estos días la tendencia entre los fabricantes de placas base es agregar el periférico del mouse también a esta lista de periféricos críticos. Entenderá por qué el teclado, el mouse y la pantalla son necesarios en un momento.

    Como dije anteriormente, un microprocesador no recuerda ninguno de sus periféricos en el momento en que se aplica la energía. Entonces, básicamente, puede pensar en el proceso de inicialización del hardware de esta manera, es el código que presenta el microprocesador a sus vecinos (periféricos) y luego hace que el procesador inicialice / active los periféricos para que estén todos listos para funcionar.

    Etapa 2: ¿Modo de cargador de arranque o modo de aplicación? ¡Tiempo de decisión!

    La siguiente decisión es elegir un modo. Una vez que los componentes individuales de la placa base comienzan a trabajar juntos y nos dan un "sistema informático", comienza la segunda etapa del cargador de arranque. En esta segunda etapa del proceso de arranque, el usuario del sistema debe tomar una decisión. O entra en él:

    • "Modo predeterminado" también conocido como "modo de aplicación" o
    • "Modo especial" también conocido como "modo de cargador de arranque"

    En una PC, el modo predeterminado es el modo que lo lleva a la pantalla de inicio de sesión y el modo de cargador de arranque lo lleva a la configuración del BIOS. Puedes decidir qué modo elegir presionando uno de los botones que se encuentran en la parte inferior derecha de la pantalla en la pantalla del logotipo del fabricante de la placa base.

    Esta decisión de qué modo ingresar generalmente se toma usando el estado de una entrada al sistema. Volvamos a nuestro ejemplo de arranque de computadora. Si está pensando en el mensaje “presiona el botón ESC para ingresar al BIOS”. ¡Sí, esa es la fase de toma de decisiones!

    Esta decisión generalmente se deja en manos del usuario por un período breve, durante el cual el sistema espera para ver si el usuario quiere que entre en el "modo de cargador de arranque".

    Si no ves ninguna de estas entradas

    Lleva al usuario al "modo de aplicación". Las teclas F2, F6, F11 y eliminar en la imagen anterior son ejemplos de las teclas de arranque. (Estas claves pueden variar según el fabricante de la placa base). Usando estas entradas, el sistema toma tu decisión sobre si ingresar al modo de aplicación o al modo de cargador de arranque.

    En los sistemas integrados, el método más simple para obtener esta entrada es a través de GPIO. Si un pin GPIO en particular lee cero (dependiendo de la implementación, puede ser cero o uno), entonces el sistema puede entrar en "modo cargador de arranque", de lo contrario, el sistema puede entrar en "modo de aplicación".

    Pero dado que puede haber ruido en los pines GPIO, el método ampliamente adoptado es leer un valor en una ubicación particular en la memoria no volátil (digamos en la dirección 0). Y según el valor en esta ubicación, el sistema puede elegir ingresar a un modo particular.

    Aquí también se pueden usar otros periféricos dependiendo de la aplicación y las capacidades del producto. Por ejemplo, los fabricantes de microcontroladores suelen proporcionar controladores de cargador de arranque que se pueden personalizar para que el sistema escuche los puertos serie, USB y Ethernet para ingresar al modo de cargador de arranque, ya que el estado de los GPIO es susceptible a voltajes de ruido.

    Usos del modo de cargador de arranque en sistemas integrados

    En las PC típicas, puede usar el cargador de arranque para configurar cosas como qué disco usar para arrancar el sistema operativo, la velocidad de la RAM, la velocidad de la CPU y muchos más, como en la imagen a continuación. En los sistemas integrados, las opciones disponibles son bastante simples.

    El usuario puede realizar tareas como:

    • Configurar algunas opciones predeterminadas para que las utilice el software de la aplicación
    • Para actualizar el software de la aplicación durante la fase de desarrollo del producto. Esto sucede cada vez que cargamos software en el microcontrolador.
    • Actualización del software, generalmente para agregar funciones o eliminar errores después de la fase de lanzamiento del producto.

    En este punto, el trabajo de un cargador de arranque está completo y el código del modo de aplicación puede comenzar a ejecutarse.

    Etapa 3: el código de inicio

    Una vez que salga de la fase de inicialización del hardware, el sistema todavía no está listo para ejecutar el programa de aplicación. En los sistemas integrados, el microprocesador ejecuta el código de inicio para preparar el sistema.

    La función principal de este software es preparar el entorno de ejecución para la aplicación escrita en lenguajes de nivel superior. (Hasta este punto, el código generalmente está escrito en lenguaje ensamblador, y todos los fabricantes de microcontroladores generalmente hacen este código ellos mismos y, los programadores de aplicaciones, ¡no tienen que lidiar con él!)

    Los lenguajes como C y C ++, que se utilizan más en el desarrollo de sistemas integrados, necesitan un entorno de tiempo de ejecución con pilas y montones para ejecutar el programa.

    Un código de inicio genérico tiene las siguientes funciones.

    • Asigna espacio y copia todas las variables globales en el código en la RAM
    • Se inicializa la pila y el puntero de pila
    • El montón está inicializado
    • Llama a la función principal en su programa

    Una vez finalizado este proceso, el sistema está listo para ejecutar código escrito en lenguajes de nivel superior como C.

    Etapa 4: Proceso de inicio del sistema operativo (opcional)

    Una vez que el entorno de ejecución está listo, el siguiente paso es iniciar el sistema operativo. Este paso es opcional en los sistemas integrados, ya que la mayoría de ellos están diseñados sin un sistema operativo.

    Mientras enciendas la PC, hay un breve lapso de tiempo entre la pantalla de inicio y la pantalla de inicio de sesión del usuario. Por lo general, este espacio se llena con un logotipo en Windows y Mac, y algunas líneas de texto en los sistemas Linux. ¡Aquí es cuando nuestras PC ejecutan el código para iniciar los sistemas operativos!

    Aquí se cargan todos los demás controladores, como nuestras tarjetas de interfaz de red y otros periféricos importantes necesarios para que el usuario final pueda hacer un uso completo de nuestro sistema.

    En el caso de un sistema integrado

    Los sistemas operativos como RTOS o Embedded Linux o Windows IoT suelen hacer algo similar a las PC, con la única diferencia de que los periféricos son diferentes. Una vez terminada esta fase llama a la tarea principal para ejecutar el código escrito por nosotros los desarrolladores.

    En sistemas embebidos sin un sistema operativo, esta inicialización adicional se lleva a cabo dentro de la función principal, para poner en marcha todos los periféricos necesarios para obtener un sistema en pleno funcionamiento.

    Seguridad del cargador de arranque

    El cargador de arranque generalmente se coloca al comienzo de la memoria flash o ROM. Esta área particular de ROM / flash generalmente está protegida con mecanismos especiales contra la piratería para que los usuarios no autorizados no puedan cargar su propio software en un dispositivo determinado.

    Estos mecanismos generalmente se activan una vez que se vende el producto y esto hace que el cargador de arranque esté bloqueado para el usuario final. Por ejemplo, digamos que no puedes hackear la lavadora de tu amigo y romperla como una broma.

    Esta es una explicación simple de lo que hace un gestor de arranque y supongo que esto es suficiente incluso para la mayoría de los desarrolladores integrados profesionales que escriben código de aplicación, ya que esta pieza de código generalmente es desarrollada por los fabricantes del microcontrolador particular que está utilizando y se le entrega como un descarga gratuita junto con sus IDE recomendados.

    Cargadores de arranque:

    Conexión por cable: el más conocido podría ser el cargador de arranque Arduino, cuando descarga un nuevo binario (boceto compilado) a través del USB, la descarga se realiza a través del cargador de arranque.

    Conexión inalámbrica: son muy comunes, es posible que haya escuchado el término actualización por aire , esa característica también se basa en un cargador de arranque, solo que la transferencia de datos se hace inalámbrica.

    Cargadores de arranque seguros: transfieren los datos de forma cifrada, por lo que no es posible alterar o espiar el contenido. Las opciones de implementación son bastante variadas, generalmente en la fase inicial se realiza una autenticación mutua, esta puede basarse en encriptación simétrica o asimétrica.

    Para mayor seguridad, la autenticación mutua se realiza con criptografía asimétrica y se intercambia la clave de sesión simétrica, que luego se utiliza para la transferencia de datos de carga de arranque (el descifrado simétrico es mucho más rápido).

    ¿Cuándo necesitas uno? Casi siempre

    He trabajado en varios cargadores para la industria automotriz y de aviación usando CAN, LIN, RS232, ethernet, en una amplia gama de DSP y controladores integrados.

    Acabo de completar la ampliación de un cargador proporcionado por un proveedor para que el SAMv71 utilice un controlador en serie. La nota de la aplicación Atmel AT16743 tiene una buena discusión sobre los conceptos genéricos del cargador antes de entrar en los detalles de SAMv71.

    Esta nota de la aplicación hace una distinción entre privacidad, integridad y autenticación que es importante tener en cuenta. La privacidad consiste en cifrar el firmware y / o las comunicaciones. Integridad significa usar un CRC o hash para verificar la actualización.

    La autenticación consiste en verificar la identidad del remitente y el receptor del firmware. También cubre la decisión de saltar a la aplicación o al cargador y varias formas de tomar la decisión.

    En mi experiencia, siempre es una buena idea tener la capacidad de actualizar el cargador. Los cargadores en los que he trabajado fueron configurados para ejecutarse completamente desde RAM. La carga completa del cargador se guarda en RAM hasta que se haya validado toda la actualización.

    En ese momento, la memoria flash del cargador se borra y se escribe. Esto reduce la ventana de tiempo en la que el dispositivo podría perder energía y convertirse en un "ladrillo". Con productos de aviación, automotriz y marítima que utilizan cargadores, nunca hemos construido una unidad en el campo. No es necesario actualizar el cargador con mucha frecuencia si el diseño se mantiene simple y está bien probado.

    También puedes leer: Cuál es la diferencia entre MBR y GPT

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir