5.1. Pornirea programului de instalare pe 32-bit soft-float ARM

5.1.1. Formate de imagine de pornire

Pe sistemele bazate pe ARM, în cele mai multe cazuri, se utilizează unul dintre cele două formate pentru imaginile de pornire: a) nuclee standard Linux în format zImage (vmlinuz) împreună cu Linux standard (initrd.gz ) sau b) nuclee în format uImage (uImage) împreună cu imaginile ramdisk inițiale corespunzătoare (uInitrd).

uImage/uInitrd sunt formate de imagine concepute pentru firmware-ul U-Boot care este utilizat pe multe sisteme bazate pe ARM (mai ales pe 32 de biți). Versiunile mai vechi U-Boot pot porni numai fișiere în format uImage/uInitrd, așa că acestea sunt adesea folosite pe sisteme armel mai vechi. Versiunile mai noi U-Boot pot - pe lângă pornirea uImages/uInitrd-uri - să pornească și nucleuri standard Linux și imagini ramdisk, dar sintaxa comenzii pentru a face acest lucru este ușor diferită de cea pentru pornirea uImages.

Pentru sistemele care utilizează un nucleu multiplatformă, pe lângă nucleu și imaginea ramdisk inițială, este necesar un așa-numit fișier de arbore de dispozitive (sau device-tree blob, dtb). Acesta este specific fiecărui sistem suportat și conține o descriere a componentelor și dispozitivelor specifice fiecărui sistem suportat. Dtb-ul ar trebui să fie furnizat de către firmware-ul sistemului, dar, în practică, de multe ori trebuie încărcat unul mai nou.

5.1.2. Pornire prin TFTP

Pornirea din rețea necesită să aveți o conexiune la rețea și un server de pornire în rețea TFTP (și probabil, de asemenea, un server DHCP, RARP sau BOOTP pentru configurarea automată a rețelei).

Configurarea serverului pentru a accepta pornirea din rețea este descrisă în Secțiune 4.3, „Pregătirea fișierelor pentru pornirea prin rețea utilizînd TFTP”.

5.1.2.1. Pornirea prin TFTP din U-Boot

Pornirea din rețea pe sistemele care utilizează firmware-ul U-Boot constă în trei pași: a) configurarea rețelei, b) încărcarea imaginilor (nucleu/imaginea ramdisk inițială/dtb) în memorie și c) executarea efectivă a codului încărcat anterior.

Mai întâi trebuie să configurați rețeaua, fie automat prin DHCP rulând

setenv autoload no
dhcp

fie manual setând mai multe variabile de mediu

setenv ipaddr <adresa IP a clientului>
setenv netmask <masca de rețea>
setenv serverip <adresa IP a serverului tftp>
setenv dnsip <adresa IP a serverului de nume>
setenv gatewayip <adresa IP a pasarelei implicite>

Dacă preferați, puteți face aceste configurări permanente rulând

saveenv

După aceea, trebuie să încărcați imaginile (nucleu/imaginea ramdisk inițială/dtb) în memorie. Acest lucru se face cu comanda «tftpboot», care trebuie furnizată cu adresa la care imaginea va fi stocată în memorie. Din păcate, adresa din memorie poate varia de la un sistem la altul, așa că nu există o regulă generală care să poată fi folosită pentru aceasta.

Pe unele sisteme, U-Boot predefinește un set de variabile de mediu cu adrese de încărcare adecvate: kernel_addr_r, ramdisk_addr_r și fdt_addr_r. Puteți verifica dacă sunt definite rulând:

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Dacă nu sunt definite, trebuie să verificați documentația sistemului dumneavoastră pentru valorile adecvate și să le stabiliți manual. Pentru sistemele bazate pe SOC-uri Allwinner SunXi (de exemplu Allwinner A10, numele arhitecturii sun4i sau Allwinner A20, numele arhitecturii sun7i), puteți, să utilizați de exemplu, următoarele valori:

setenv kernel_addr_r 0x46000000
setenv fdt_addr_r 0x47000000
setenv ramdisk_addr_r 0x48000000

Când adresele de încărcare sunt definite, puteți încărca imaginile în memorie de pe serverul tftp definit anterior cu

tftpboot ${kernel_addr_r} <numele de fișier al imaginii nucleului>
tftpboot ${fdt_addr_r} <numele de fișier al dtb>
tftpboot ${ramdisk_addr_r} <numele de fișier al imaginii ramdisk inițiale>

A treia parte este definirea liniei de comandă a nucleului și executarea efectivă a codului încărcat. U-Boot transmite conținutul variabilei de mediu bootargs ca linie de comandă către nucleu, astfel încât orice parametri pentru nucleu și pentru programul de instalare - cum ar fi dispozitivul de consolă (consultați Secțiune 5.3.1, „Consola de pornire”) sau opțiunile de preconfigurare (a se vedea Secțiune 5.3.2, „Parametrii programului de instalare Debian” și Anexa B, Automatizarea instalării folosind preconfigurarea) - pot fi stabilite cu o comandă ca

setenv bootargs console=ttyS0,115200 rootwait panic=10

Comanda exactă pentru a executa codul încărcat anterior depinde de formatul de imagine utilizat. Cu uImage/uInitrd, comanda este:

bootm ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}

iar cu imaginile native Linux este:

bootz ${kernel_addr_r} ${ramdisk_addr_r}:${filesize} ${fdt_addr_r}

Notă: Când porniți imagini standard Linux, este important să încărcați imaginea ramdisk inițială după nucleu și dtb, deoarece U-Boot stabilește variabila dimensiunii fișierului la dimensiunea ultimului fișier încărcat, iar comanda bootz necesită dimensiunea imaginii ramdisk-ului. ca să funcționeze corect. În cazul pornirii unui nucleu specific platformei, adică un nucleu fără arbore de dispozitive, pur și simplu omiteți parametrul ${fdt_addr_r}.