la catena di avvio di Linux embedded

July 30, 2026 · visitatori

L'ultima volta ho scritto del DFU come modo per flashare il firmware via USB. Quell'articolo lasciava da parte una domanda che merita una risposta a sé: cosa succede realmente tra la pressione del pulsante di accensione e la comparsa di un prompt di shell? Il DFU è solo un ramo di questo percorso, quindi vale la pena percorrerlo tutto una volta.

Le fasi

Disegnata come un diagramma di flusso Mermaid, la catena (con il posto occupato dal DFU) è così:

flowchart TD
    A[Power-on / Reset] --> B[Boot ROM<br/>immutable, on-chip]
    B --> C{Valid image on<br/>boot media?}
    C -->|No / forced| D[ROM recovery mode<br/>UART / USB]
    C -->|Yes| E[SPL<br/>first-stage bootloader]
    E --> F[U-Boot<br/>second-stage bootloader]
    F --> G{Enter DFU?}
    G -->|Yes| H[DFU mode<br/>waiting for firmware over USB]
    G -->|No| I[Load kernel + device tree]
    I --> J[Linux kernel]
    J --> K[Mount root filesystem]
    K --> L[init / systemd]

E, renderizzata:

Diagramma di flusso della catena di avvio di Linux embedded: l'accensione riporta alla boot ROM, che controlla se sul supporto di avvio è presente un'immagine valida. Se non ne trova nessuna (o il recovery viene forzato), entra in una modalità di recovery UART/USB. Altrimenti carica lo SPL, che carica U-Boot vero e proprio. U-Boot può entrare in modalità DFU per attendere il firmware via USB, oppure caricare il kernel e il device tree, avviare Linux, montare il file system radice e passare il controllo a init/systemd.

Boot ROM

Incisa nel silicio in fase di produzione — dopodiché non può più essere modificata in alcun modo. Il suo unico compito è trovare qualcosa di avviabile su uno dei pochi supporti di avvio possibili (eMMC, SD, flash QSPI, a volte USB) in base ai pin di boot-mode o agli eFuse, e saltarci. Se non trova nulla di valido, la maggior parte dei SoC ripiega a questo punto su una modalità di recovery minimale via UART o USB — il primissimo punto in cui è possibile comunicare con il chip.

SPL

Abbreviazione di Secondary Program Loader (il termine usato da U-Boot; altri produttori lo chiamano FSBL o simili). Viene eseguito da una piccola quantità di SRAM on-chip, prima ancora che la DRAM sia inizializzata, quindi deve essere minuscolo. Il suo compito principale è esattamente questo: inizializzare la DRAM, quindi caricarvi la fase successiva — U-Boot completo.

U-Boot vero e proprio

È ciò che la maggior parte delle persone intende quando dice "il bootloader". Ha driver, una shell, variabili d'ambiente, supporto di rete e un interprete di comandi. È anche qui che vive realmente il DFU — eseguire dfu 0 mmc 0 (o simile) fa entrare U-Boot in modalità DFU invece di proseguire con l'avvio normale, ed è la modalità con cui dfu-util comunica dal lato host. Altrimenti, carica in memoria l'immagine del kernel e il blob del device tree e salta al kernel.

Kernel e userspace

Il kernel si decomprime da solo, attiva la console, sonda l'hardware usando il device tree che gli è stato passato, e monta un file system radice — spesso la stessa scheda eMMC o SD da cui il bootloader ha avviato, a volte NFS durante lo sviluppo. Una volta montato il file system radice, il kernel passa il controllo al PID 1 — di solito systemd su un'immagine costruita con Yocto — ed è lì che lo "userspace" inizia davvero.

Perché questo è importante per il DFU

Il DFU ha senso solo una volta che si vede dove si colloca: è una deviazione che U-Boot può prendere al posto di caricare il kernel, non qualcosa di separato aggiunto sopra. È anche per questo che il DFU non può salvare da ogni modalità di guasto — se la boot ROM stessa non riesce a trovare uno SPL valido, non si arriva mai a U-Boot, e si deve fare affidamento sulla modalità di recovery supportata dalla boot ROM (che varia molto da produttore a produttore ed è un buon argomento per un altro articolo).

Per approfondire

Letture Correlate

Commenti