La ROM de arranque es un tipo de ROM que se utiliza para arrancar un sistema informático. [1] Hay dos tipos: una ROM de arranque de máscara que no se puede cambiar posteriormente y una EEPROM de arranque .
Al encender el sistema, el hardware normalmente arranca sin inicializar. Para continuar con el arranque, es posible que el sistema deba leer un cargador de arranque desde algún dispositivo periférico. A menudo es más fácil implementar rutinas para leer desde dispositivos de almacenamiento externos en el software que en el hardware. Una ROM de arranque proporciona un lugar para almacenar este código de carga inicial, en una ubicación fija inmediatamente disponible para el procesador cuando comienza la ejecución.
La ROM de arranque se asigna a la memoria en una ubicación fija y el procesador está diseñado para comenzar a ejecutarse desde esta ubicación después de reiniciarse. Por lo general, se coloca en el mismo chip que la CPU, pero también puede ser un chip ROM externo , como es común en los sistemas más antiguos. En los sistemas modernos, la ROM de arranque (ya sea integrada en la CPU o en un chip ROM externo) generalmente utiliza una memoria flash NOR que admite la ejecución en el lugar .
La ROM de arranque inicializará los buses de hardware y los periféricos necesarios para el arranque. En algunos casos, la ROM de arranque es capaz de inicializar la RAM y, en otros casos, depende del gestor de arranque hacerlo.
Al final de la inicialización del hardware, la ROM de arranque intentará cargar un cargador de arranque desde periféricos externos (como un eMMC, una tarjeta microSD, una EEPROM externa, etc.) o a través de protocolos específicos en un bus para transmisión de datos (como USB, UART, etc.).
En muchos sistemas en un chip , los periféricos o buses desde los cuales la ROM de arranque intenta cargar el cargador de arranque (como eMMC para el cargador de arranque integrado o EEPROM externa para la implementación de UEFI), y el orden en el que se cargan, se pueden configurar. Esta configuración se puede realizar fundiendo algunos fusibles electrónicos dentro del sistema en un chip para codificar esa información, o haciendo que pines o puentes específicos del sistema en un chip estén en alto o bajo.
Algunas ROM de arranque son capaces de comprobar la firma digital del gestor de arranque y se negarán a ejecutar el gestor de arranque y detendrán el arranque si la firma no es válida o no ha sido firmada con una clave autorizada. Con algunas ROM de arranque, el hash de la clave pública necesaria para verificar las firmas está codificado en fusibles electrónicos dentro del sistema en un chip . Algunas ROM de arranque del sistema en un chip también admiten una infraestructura de clave pública y el hash de la clave pública de la autoridad de certificación (CA) está codificado en los fusibles electrónicos en su lugar, y la ROM de arranque podrá entonces comprobar si el gestor de arranque está firmado por una clave autorizada verificando esa clave con la clave pública de la CA (cuyo hash está codificado en los fusibles electrónicos ). [2] [3]
Esa característica puede utilizarse para implementar funciones de seguridad o utilizarse como raíz de confianza de hardware en una cadena de confianza , pero una vez configurada, a los usuarios se les niega la libertad de reemplazar el cargador de arranque por el que desean. Debido a esto, la característica ha generado fuertes preocupaciones en la comunidad de software libre. [4]
Justo antes de saltar al gestor de arranque , algunos sistemas en un chip también eliminan la ROM de arranque del mapeo de memoria, mientras que otros no lo hacen, lo que hace posible volcar la ROM de arranque para un análisis posterior. [3] Si la ROM de arranque todavía está visible, los gestores de arranque también pueden llamar al código de la ROM de arranque (que a veces está documentado).
Cuando un sistema en un chip (SoC) entra en modo de suspensión a RAM , en muchos casos, el procesador se apaga por completo mientras que la RAM se pone en modo de autoactualización. Al reanudar, la ROM de arranque se ejecuta nuevamente y muchas ROM de arranque pueden detectar que el SoC estaba en modo de suspensión a RAM y pueden reanudar saltando directamente al núcleo , que luego se encarga de encender nuevamente los periféricos que estaban apagados y restaurar el estado en el que se encontraba la computadora antes.
En muchos sistemas Allwinner en un chip (A10, A20, A64), la ROM de arranque espera a que se cargue un cargador de arranque a través de USB (si un PIN específico es alto) o intenta arrancar en varios periféricos en un orden fijo. [5]
Algunos sistemas Allwinner en un chip pueden verificar la firma de los cargadores de arranque. [6] Pero la mayoría de los dispositivos que se fabrican no están configurados para ello. Esto ha permitido que el software libre y de código abierto agregue soporte para muchos sistemas Allwinner en un chip y dispositivos que los usan en cargadores de arranque como U-Boot . [7]
En los dispositivos iPhone , iPad , Apple Watch , iPod Touch y Apple TV , la ROM de arranque se denomina "SecureROM" [8] y es una versión simplificada de iBoot . Proporciona un mecanismo de actualización del firmware del dispositivo (DFU), que se puede activar mediante una combinación de teclas especial. [9]
La ROM de arranque de los sistemas en chip (SOC) NXP permite configurar los periféricos a través de pines específicos del sistema en chip. En la familia I.MX6 también permite configurar el orden de arranque a través de efuses .
La ROM de arranque de varios SoC NXP tiene muchas formas de cargar el gestor de arranque de primera etapa (desde eMMC, microSD, USB, etc.).
Se pueden configurar varios SoCs NXP para verificar la firma de los cargadores de arranque. Muchos dispositivos con dichos SoCs se vendieron sin esa verificación configurada y en esos dispositivos los usuarios pueden instalar el cargador de arranque que deseen, incluidos varios cargadores de arranque de software libre y de código abierto como Das U-Boot [10] y Barebox .
La ROM de arranque de varios sistemas en chip de Texas Instruments admite la configuración de los periféricos a través de pines específicos del sistema en chip.
La ROM de arranque de varios sistemas de Texas Instruments en un chip tiene muchas formas de cargar el cargador de arranque de primera etapa (que se denomina MLO en los manuales de referencia de los sistemas en un chip ):
En el sistema en chip OMAP36xx , la ROM de arranque busca el cargador de arranque de primera etapa en los sectores 0x0 y 0x20000 (128 KB), [11] y en el sistema en chip AM3358 , [12] además busca en 0x40000 (256 KiB) y 0x60000 (384 KiB). En ambos casos su tamaño máximo es 128 KiB. Esto se debe a que el cargador de arranque (de primera etapa) se carga en una SRAM que está dentro del sistema en chip .
Los sistemas en chip OMAP y AM335x pueden configurarse para verificar la firma de los cargadores de arranque. Muchos dispositivos con dicho sistema en chip se vendieron sin la verificación configurada y en esos dispositivos los usuarios pueden instalar el cargador de arranque que quieran, incluidos varios cargadores de arranque de software libre y de código abierto como Das U-Boot [13] y Coreboot [14] y Barebox .
Los microcontroladores de la familia STM32 de STMicroelectronics tienen una ROM integrada (también denominada "ROM en chip") e incluyen memoria del sistema [15] para facilitar la instalación de un sistema vacío. Ciertas combinaciones de pines o, a veces, fusibles de seguridad y/o comprobaciones de flash vacío fuerzan al chip a arrancar desde la ROM en lugar del firmware en la flash principal. Esto permite instalar chips vacíos sin recurrir a interfaces de programación de hardware. Técnicamente, esta ROM se almacena en un área dedicada de la matriz flash y ST la programa durante la producción. La mayoría de los microcontroladores STM32 pueden instalarse al menos mediante UART, algunos admiten USB y, eventualmente, otras interfaces como, por ejemplo, I2C , SPI o CAN . El núcleo Cortex-M normalmente obtiene vectores de las direcciones conocidas 0x00000000 (valor inicial del puntero de pila ) y 0x00000004 (valor inicial del contador del programa ). Sin embargo, los pines y/o fusibles definen qué memoria se asigna a estas direcciones. La memoria del sistema es una de las opciones de mapeo, otra sería típicamente el firmware principal en flash. En este caso, se supone que el firmware debe hacer todas las tareas que hacen las ROM de arranque; parte del firmware podría actuar como un cargador de arranque similar a la ROM de arranque de ST. El hardware podría proporcionar una aplicación de solo lectura en el área de arranque, convirtiéndola en una versión de ROM de arranque proporcionada por el usuario.
En los dispositivos que ejecutan iOS , los exploits de ROM de arranque (como los exploits limera1n, [16] alloc8, [17] y checkm8 [8] [16] ) a veces se usan para hacer jailbreak a iOS . La ventaja para las personas que desean hacer jailbreak a sus dispositivos sobre los exploits que afectan a iOS es que, dado que la ROM de arranque no se puede modificar y que los dispositivos que ejecutan iOS no tienen fuses para agregar código a la ROM de arranque, Apple no puede reparar la vulnerabilidad en los dispositivos existentes.
La ROM de arranque del SoC Tegra de Nvidia (utilizado por la Nintendo Switch ) contenía una vulnerabilidad que hacía posible que los usuarios ejecutaran el gestor de arranque que quisieran. [18] [19]