Cosa succede esattamente quando si avvia un dispositivo come un computer o uno smartphone e perché non è istantaneo?

Prima di tutto, il circuito di standby a basso consumo abilita l'alimentazione al resto del sistema, c'è una breve pausa mentre i regolatori locali si avviano e i condensatori si caricano, e un microcontrollore verifica che tutte le diverse tensioni che si aspetta siano entro i limiti, poi la linea di reset viene rilasciata sul sistema.

Il processore inizia ad eseguire il firmware dalla flash di sistema - comunemente conosciuto come il BIOS o il firmware UEFI sui sistemi con architettura x86. Sui sistemi ARM, questa è la mask rom sul SoC stesso.

Il firmware esegue alcuni autotest e alcune inizializzazioni hardware (POST).

Da lì, sulle piattaforme basate su BIOS x86, il BIOS legge il master boot record dal dispositivo di avvio definito nel CMOS, poi carica il bootloader stage 1 dal MBR, che carica il codice del bootloader stage 2 (dipende dal tipo di bootloader). Il bootloader quindi carica il kernel del sistema operativo in ram dal disco, e inizia ad eseguirlo.

Per le piattaforme basate su UEFI x86, l'UEFI legge il contenuto della partizione di sistema dal dispositivo di avvio definito in NVRAM, quindi carica l'immagine di avvio trovata. Sui sistemi UEFI, questa può essere o il kernel stesso del vostro sistema operativo, o un bootloader intermedio di fase 2, a seconda del sistema operativo in questione. Il bootloader quindi carica il kernel del sistema operativo in ram dal disco, e inizia ad eseguirlo.

Sulle piattaforme ARM, tipicamente esegue il bootloader (comunemente U-Boot) da una posizione ben definita sulla flash (la posizione varia a seconda del produttore ed è controllata dalla rom del SoC), che carica ed esegue l'immagine del kernel, che è più o meno sempre memorizzata grezza sul dispositivo flash.

Una volta che il kernel ha iniziato l'esecuzione, inizializza tutti i dispositivi, carica il firmware in essi (molti driver contengono il firmware dei dispositivi per cui sono stati creati - rende più facile fare gli aggiornamenti del firmware del dispositivo), avvia i servizi di sistema, monta i filesystem, ecc - le cose divergono significativamente da lì.

Ora veniamo al nocciolo del problema - perché non è istantaneo?

Per le piattaforme ARM, la maggior parte del tempo è spesa nell'avvio del kernel, non nel bootloader. U-Boot verrà eseguito estremamente velocemente, ed è per questo che alcuni dei primi chromebook x86 usano U-Boot (insieme a Coreboot, che è un sostituto del BIOS basato sul kernel Linux molto veloce), per tempi di avvio notevolmente ridotti.

Per le piattaforme x86, innanzitutto il codice stesso è meno compatto a causa dell'architettura CISC (Complex Instruction Set Computer) invece che RISC (Reduced Instruction Set Computer), quindi il firmware di sistema può essere grande diversi megabyte, rispetto a una manciata di byte per ARM.

Un sistema operativo moderno e veloce con una sequenza di avvio ottimizzata su supporti di avvio ad alte prestazioni può passare la maggior parte del suo tempo nel BIOS (diversi secondi), motivo per cui UEFI è stato sviluppato per modernizzare il processo di avvio.

UEFI è abbastanza veloce nella maggior parte dei casi, ma se deve caricare un mucchio di firmware per le periferiche o inizializzare un mucchio di hardware complicato o la memoria può richiedere molto tempo. I server moderni, per esempio, possono impiegare decine di minuti per arrivare al punto in cui il firmware legge i blocchi di avvio ed esegue il bootloader su un sistema quad socket con 512GB di memoria ECC e un mucchio di schede di espansione, ciascuna con il proprio firmware da caricare nella RAM.

Il BIOS d'altra parte è sempre stato lento, pieno di codice legacy, e sui sistemi moderni può essere di diversi megabyte, anche un desktop con relativamente poche periferiche può impiegare quasi un minuto per arrivare al bootloader.

Per contrasto, un Atmel ATMEGA 328 - il chip sulla scheda Arduino Uno, si avvia in una frazione di secondo con il codice che hai scritto, in esecuzione dai 32kb di flash onboard. Ci sono solo 2kb di ram, ha una larghezza di dati di soli 8 bit, funziona a soli 8Mhz, e devi inizializzare tu stesso ogni funzione del chip che vuoi usare. La cosa più vicina a quello che stai scrivendo su un sistema moderno è il BIOS stesso.

TL;DR: I computer e i telefoni sono macchine complesse, il software che ci gira sopra consiste in centinaia e migliaia di MILIONI di linee di codice sorgente, convertite in binari contenenti centinaia di trilioni di istruzioni che i processori devono eseguire, di solito in più fasi.