Sulla maggior parte dei sistemi ARM è utilizzato uno tra questi due formati per le immagini di avvio: a) kernel Linux standard («vmlinuz») insieme ai tradizionali ramdisk iniziali di Linux («initrd.gz») oppure b) kernel in formato uImage insieme al suo ramdisk iniziale («uInitrd»).
uImage/uInitrd sono formati pensati per il firmware U-Boot, presente su molti sistemi ARM (principalmente quelli a 32-bit). Le versioni di U-Boot più vecchie possono avviare solo file nel formato uImage/uInitrd, quindi spesso sono usate sui sistemi armel più vecchi. Le versioni di U-Boot più recenti sono in grado di avviare ovviamente le immagini uImages/uInitrds ma riescono ad avviare anche i kernel e i ramdisk in formato Linux, la sintassi del comando per avviare le immagini in formato Linux è leggermente diversa da quella del comando per avviare le immagini uImage.
Per i sistemi che usano un kernel multipiattaforma, oltre al kernel e al ramdisk, è necessario anche un cosiddetto file con l'albero dei dispositivi (device-tree oppure device-tree blob, «dtb»). Tale file è specifico per ciscun sistema e contiene la descrizione dell'hardware. Normalmente il dtb è fornito dal firmware del dispositivo ma, in pratica, è necessario caricarne uno più recente.
L'avvio da rete richiede una connessione di rete e un boot server TFTP (e probabilmente anche un server DHCP, RARP o BOOTP per la configurazione automatica della rete).
La configurazione lato server per effettuare l'avvio dalla rete è descritto in Sezione 4.3, «Preparazione dei file per l'avvio TFTP da rete».
L'avvio da rete per i sistemi che usano il firmware U-Boot consiste di tre passi: a) configurazione della rete b) caricamento delle immagini (kernel, ramdisk e dtb) in memoria c) l'esecuzione del codice appena caricato.
Il primo passo è configurare la rete, automaticamente tramite DHCP con
setenv autoload no dhcp
oppure manualmente impostando alcune variabili d'ambiente
setenv ipaddr <indirizzo ip del client> setenv netmask <maschera di rete> setenv serverip <indirizzo ip del server tftp> setenv dnsip <indirizzo ip del nameserver> setenv gatewayip <indirizzo ip del gateway predefinito>
È possibile salvare in modo permanente queste impostazioni eseguendo
saveenv
Dopodiché è necessario caricare le immagini (kernel, ramdisk iniziale e dtb) in memoria. Per questa operazione occorre usare il comando tftpboot passando l'indirizzo di memoria al quale deve deve caricata l'immagine. Sfortunatamente la mappa di memoria varia da sistema a sistema e non esiste una regola generale su quale indirizzo utilizzare.
Su alcuni sistemi, U-Boot predefinisce una serie di varibili d'ambiente con gli indirizzi da usare: kernel_addr_r, ramdisk_addr_r e fdt_addr_r. È possibile verificare se tali variabili sono state definite con
printenv kernel_addr_r ramdisk_addr_r fdt_addr_r
Se non sono state definite, è necessario trovare nella documentazione i valori adatti al proprio sistema e impostarli manualmente. Per i sistemi basati sui SOC Allwinner SunXi (per esempio per Allwinner A10 nome dell'architettura «sun4i», o Allwinner A20, nome dell'architettura «sun7i») è possibile usare i seguenti valori:
setenv kernel_addr_r 0x46000000 setenv fdt_addr_r 0x47000000 setenv ramdisk_addr_r 0x48000000
Dopo aver impostato gli indirizzi, è possibile caricare le immagini in memoria dal server tftp definito in precedenza con
tftpboot ${kernel_addr_r} <nome file dell'immagine del kernel> tftpboot ${fdt_addr_r} <nome file del dtb> tftpboot ${ramdisk_addr_r} <nome file del ramdisk iniziale>
Il terzo passo è impostare la riga di comando per il kernel e avviare l'esecuzione del codice appena caricato. U-boot passa il contenuto della variabile d'ambiente «bootargs» come riga di comando al kernel, quindi tutti parametri per il kernel e per l'installatore, come il device della console (vedere Sezione 5.3.1, «Avvio da console seriale») oppure le opzioni di preconfigurazione (vedere Sezione 5.3.2, «Parametri dell'Installatore Debian» e Appendice B, Installazione automatica tramite preconfigurazione), possono essere impostati con un comando simile a
setenv bootargs console=ttyS0,115200 rootwait panic=10
Il comando per eseguire il codice caricato in precedenza dipende dal formato delle immagini usato. Con uImage/uInitrd, usare il comando
bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
e con le immagini native Linux usare
bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}
Nota: quando si avviano immagini linux è importante caricare l'immagine del ramdisk iniziale dopo il kernel e il dtb poiché U-Boot imposta il valore della variabile filesize pari alla dimensione dell'ultimo file caricato e il comando bootz ha bisogno di conoscere la dimensione dell'immagine del ramdisk per funzionare correttamente. Per avviare un kernel specifico per una piattaforma, vale a dire un kernel senza il device-tree, è sufficiente omettere il parametro ${fdt_addr_r}.