Formati delle immagini d'avvio 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. 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. Avvio con TFTP &boot-installer-intro-net.xml; Avvio da TFTP con u-boot 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 Dopodiche è 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 ) oppure le opzioni di preconfigurazione (vedere e ), 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}.