Linux Embedded 2/5 – Il bootloader U-Boot

[Voti: 22    Media Voto: 4.5/5]

Questo articolo fa parte della serie:

U-Boot è un bootloader, il suo compito all’avvio è quello di attivare l’hardware, caricare il kernel Linux dalla memoria Flash alla RAM (o dalla rete alla RAM) ed eseguirlo.

Tipicamente nei sistemi embedded viene utilizzato il bootloader U-Boot rispetto ad altri come LILO o GRUB tipici delle distribuzioni dekstop, perché supporta più piattaforme (ARM, AVR32, Blackfin, x86, Motorola 68K, Xilix Microblaze, MIPS, Alterra NIOS, NIOS2, PowerPC, Super-H, ecc.) ed è capace di effettuare il boot del kernel da rete con il protocollo TFTP, da un disco IDE o SCSI, dall’USB e dalle memorie Flash tipicamente presenti sui sistemi embedded.

Scrivere l’immagine U-Boot sulla scheda embedded

L’immagine U-Boot può già essere presente sulla scheda embedded oppure per esigenze particolari si può decidere di compilare una nuova versione di U-Boot e scriverla sul firmware della scheda embedded. In questo secondo caso una volta in possesso dell’immagine U-Boot, si può procedere alla sua scrittura seguendo le istruzioni fornite dal produttore della scheda. Tipicamente il procedimento è il seguente:

  • si avvia GtkTerm e ci si connette alla seriale della scheda target;
  • si tiene premuto un tasto indicato dal produttore (es. la ‘s’) e si accende la scheda target;
  • la scheda target si avvia, rileva la presenza del tasto premuto sulla seriale e si mette in modalità di programmazione;
  • attraverso dei comandi e l’invio dell’immagine di U-boot sulla seriale si scrive la stessa nella memoria della scheda embedded;
Configurazione di U-Boot

Per variare le opzioni di boot del bootloader per prima cosa bisogna entrare nel prompt dei comandi di U-Boot. Il procedimento è il seguente:

  • si avvia GtkTerm e ci si connette alla seriale della scheda target;
  • si accende la scheda target e in GtkTerm si visualizza l’output del processo di Boot.
  • come U-Boot mostra il messaggio Hit any key to stop autoboot: 3 basta premere un tasto qualsiasi in GtkTerm per entrare nel prompt dei comandi di U-Boot.

Dal prompt di U-boot si possono lanciare alcuni comandi come ad esempio printenv che mostra tutte le variabili d’ambiente della configurazione di U-Boot.
Per modificare una variabile d’ambiente basta utilizzare il comando setenv (es. setenv ethaddr 00:11:22:xx:yy:zz). Nel caso si voglia rendere persistente il suo valore anche per il prossimo riavvio basta salvare le variabili d’ambiente in memoria con il comando saveenv.

Di seguito alcuni esempi di boot. Nel caso in cui l’immagine del kernel o del filesystem del sistema target non sia stata fornita dal produttore della scheda, prima di proseguire è necessario compilare il kernel e creare l’immagine del filesystem da soli. Nei prossimi articoli vedremo come fare.

I comandi riportati di seguito forniscono solo una traccia e quindi non hanno pretese di correttezza alcuna: potrebbero variare a seconda della scheda e delle memorie flash.

Scaricare e salvare il kernel linux nella Flash della scheda

Scaricare il kernel dall’host nella RAM del target


setenv ipaddr <IP della scheda>
setenv serverip <IP del server>
tftp <nome dell'immagine del kernel presente sul sistema host nella directory `/tftpboot`>

Eventualmente scrivere il kernel caricato in RAM sulla memoria Flash. La variabile d’ambiente $loadaddr deve essere valorizzata con l’apposito comando setenv nel caso non sia già valorizzata. Le locazioni di memoria vengono comunicate dal produttore della scheda.


nand erase.part Kernel
nand write $loadaddr Kernel $filesize

Scaricare e salvare l’immagine del filesystem nella Flash della scheda

Scaricare il root filesystem nella RAM del target e quindi scriverlo sulla Flash


setenv ipaddr <IP della scheda>
setenv serverip <IP del server>
tftp <nome dell'immagine del root filesystem presente sul sistema host nella directory `/tftpboot`>

nand erase.part TargetFS
ubi part TargetFS
ubi create rootfs
ubi write $loadaddr rootfs $filesize

Effettuare il boot del kernel presente sulla Flash indicandogli che il rootfs si trova anche lui sulla memoria Flash

Prima di lanciare il comando seguente bisogna valorizzare opportunamente le variabili d’ambiente richiamate con il dollaro.


setenv bootargs console=$sercon,115200 fec_mac=$ethaddr $mtdparts rootfstype=ubifs ubi.mtd=TargetFS root=ubi0:rootfs ro init=linuxrc
saveenv
nand read $loadaddr Kernel
bootm $loadaddr

Effettuare il boot del kernel presente sulla Flash indicandogli che il rootfs è un filesystem di rete condiviso con il protocollo NFS

setenv ipaddr <IP della scheda>
setenv serverip <IP dell'host>
setenv gatewayip <IP del gateway, tipicamente coincide con quello dell'host se collegati direttamente>
setenv netmask <NETMASK di rete>


setenv bootargs console=$sercon,115200 $mtdparts ip=$ipaddr:$serverip:$gatewayip:$netmask::eth0 fec_mac=$ethaddr root=/dev/nfs nfsroot=/rootfs ro init=linuxrc
saveenv
nand read $loadaddr Kernel
bootm $loadaddr

Se si vuole effettuare il boot dal kernel prendendolo dal server TFTP basta utilizzare i comandi seguenti al posto di nand read $loadaddr Kernel


setenv ipaddr <IP della scheda>
setenv serverip <IP del server>
tftp <nome dell'immagine del kernel presente sul sistema host nella directory `/tftpboot`>

Per ulteriori informazioni e dettagli sull’uso e sulla configurazione di U-Boot si rimanda alla guida ufficiale presente al sito del progetto Das U-Boot.

A questo punto dovreste essere riusciti ad effettuare il boot del kernel di Linux e quindi il terminale di GtkTerm dovrebbe presentare il prompt dei comandi di Linux.

Garda Informatica

Garda Informatica

Garda Informatica sviluppa software su misura nella forma di Web Application, App Ibride per iOS/Android/Windows Phone, Crawler Web, Gestionali Web o semplici Connettori per l'integrazione tra software di terze parti.
Garda Informatica

Un commento su “Linux Embedded 2/5 – Il bootloader U-Boot”

I commenti sono chiusi.