¿Qué ocurre exactamente al arrancar un dispositivo como un ordenador o un smartphone y por qué no es instantáneo?

Primero, el circuito de espera de bajo consumo habilita la alimentación del resto del sistema, hay una breve pausa mientras los reguladores locales se ponen en marcha y los condensadores se cargan, y un microcontrolador verifica que todos los diferentes voltajes que espera están dentro del rango, entonces la línea de reinicio se libera en el sistema.

El procesador comienza a ejecutar el firmware desde la flash del sistema – comúnmente conocido como la BIOS o el firmware UEFI en los sistemas de arquitectura x86. En los sistemas ARM, se trata de la rom de máscara en el propio SoC.

El firmware realiza algunas pruebas de autocomprobación y alguna inicialización del hardware (POST).

Desde ahí, en las plataformas basadas en la BIOS x86, la BIOS lee el registro de arranque maestro desde el dispositivo de arranque definido en la CMOS, luego carga el cargador de arranque de la etapa 1 desde el MBR, que carga el código del cargador de arranque de la etapa 2 (depende del tipo de cargador de arranque). El gestor de arranque entonces carga el kernel del SO en la memoria RAM desde el disco, y comienza a ejecutarlo.

Para las plataformas x86 basadas en UEFI, la UEFI lee el contenido de la partición del sistema desde el dispositivo de arranque definido en la NVRAM, y luego carga la imagen de arranque encontrada. En los sistemas UEFI, esto puede ser el propio kernel de su SO, o un gestor de arranque intermedio de fase 2, dependiendo del SO en cuestión. A continuación, el gestor de arranque carga el kernel del SO en la memoria ram desde el disco, y comienza a ejecutarlo.

En las plataformas ARM, normalmente ejecuta el gestor de arranque (comúnmente U-Boot) desde una posición bien definida en la flash (la ubicación varía según el fabricante y está controlada por la rom del SoC), que carga y ejecuta la imagen del kernel, que más o menos siempre se almacena en bruto en el dispositivo flash.

Una vez que el kernel ha comenzado a ejecutarse, inicializa todos los dispositivos, carga el firmware en ellos (muchos controladores contienen el firmware de los dispositivos para los que son – hace más fácil hacer las actualizaciones del firmware del dispositivo), inicia los servicios del sistema, monta los sistemas de archivos, etc – las cosas divergen significativamente a partir de ahí.

Ahora al núcleo de la cuestión – ¿por qué no es instantáneo?

Para las plataformas ARM, la mayor parte del tiempo se gasta en arrancar el kernel, no en el gestor de arranque. U-Boot se ejecutará extremadamente rápido, por lo que algunos de los primeros chromebooks x86 utilizan U-Boot (junto con Coreboot, que es un sustituto de la BIOS basado en el kernel de Linux muy rápido), para reducir enormemente los tiempos de arranque.

Para las plataformas x86, en primer lugar, el código en sí es menos compacto debido a que se trata de una arquitectura CISC (Complex Instruction Set Computer) en lugar de una arquitectura RISC (Reduced Instruction Set Computer), entonces el firmware del sistema puede tener un tamaño de varios megabytes, en comparación con el puñado de bytes de ARM.

Un sistema operativo moderno y rápido con una secuencia de arranque optimizada en un medio de arranque de alto rendimiento puede pasar la mayor parte de su tiempo en la BIOS (varios segundos), que es la razón por la que UEFI se desarrolló para modernizar el proceso de arranque.

UEFI es bastante rápido en la mayoría de los casos, pero si tiene que cargar un montón de firmware para los periféricos o inicializar un montón de hardware o memoria complicados puede tardar MUCHO tiempo. Los servidores modernos, por ejemplo, pueden tardar decenas de minutos en llegar al punto en el que el firmware lee los bloques de arranque y ejecuta el gestor de arranque en un sistema de cuatro zócalos con 512 GB de memoria ECC y un montón de tarjetas de expansión, cada una con su propio firmware que debe cargarse en la RAM.

La BIOS, por otro lado, siempre ha sido lenta, llena de código heredado, y en los sistemas modernos puede tener un tamaño de varios megabytes, incluso un ordenador de sobremesa con relativamente pocos periféricos puede tardar casi un minuto en llegar al gestor de arranque.

Por el contrario, un Atmel ATMEGA 328 – el chip de la placa Arduino Uno, arranca en una fracción de segundo con el código que has escrito, ejecutándose desde los 32kb de la flash de la placa. Sólo tiene 2kb de ram, sólo tiene un ancho de datos de 8 bits, funciona a sólo 8Mhz, y tienes que inicializar cada función del chip que quieras usar tú mismo. Lo más parecido a lo que estás escribiendo en un sistema moderno es la propia BIOS.

TL;DR: Los ordenadores y los teléfonos son máquinas complejas, el software que se ejecuta en ellos consiste en cientos y miles de MILLONES de líneas de código fuente, convertidas en binarios que contienen cientos de trillones de instrucciones que los procesadores deben ejecutar, normalmente en múltiples etapas.