5.1. Starta upp installationsprogrammet på 32-bit soft-float ARM

5.1.1. Uppstartsavbildningsformat

På ARM-baserade system i de flesta fall används ett av två format för uppstartsavbildningar: a) standardkärnor i Linux zImage-format (vmlinuz) tillsammans med standard initiala ramdiskar för Linux (initrd.gz) eller b) kärnor i uImage-format (uImage) i kombination med motsvarande initiala ramdiskar (uInitrd).

uImage/uInitrd är bildformat som har designats för den inre mjukvaran U-Boot vilket används i många ARM-baserade system (mestadels 32-bitars). Äldre versioner av U-Boot kan endast starta upp filer i formatet uImage/uInitrd-formatet så dessa används oftast i äldre armel-system. Nyare versioner av U-Boot kan - förutom att starta uImages/uInitrd - också starta standard-kärnor för Linux och ramdisk-avbilder, men kommando-syntaxen för att göra det är något annorlunda från att boota uImages.

För system som använder en multiplattformskärna behövs förutom kärnan och initial ramdisk en så kallad device-tree-fil (eller device-tree blob, dtb). Den är specifik för varje system som stöds och innehåller en beskrivning av den specifika hårdvaran. dtb:n ska levereras med enhetens fasta programvara, men i praktiken behöver en nyare ofta laddas.

5.1.2. Uppstart från TFTP

Uppstart från nätverket kräver att du har en nätverksanslutning och en TFTP-server konfigurerad för uppstarter (och antagligen även en DHCP-, RARP- eller BOOTP-server för automatisk närverkskonfiguration).

Inställning på serversidan för att stödja nätverksuppstart beskrivs i Avsnitt 4.3, ”Förbered filerna för nätverksuppstart via TFTP”.

5.1.2.1. TFTP-uppstart i U-Boot

Nätverksuppstart på system som använder U-Boot fastprogramvara består av tre steg: a) konfigurera nätverket, b) ladda in avbilderna (kärna/initial ramdisk/dtb) till minnet och c) faktiskt exekvera den tidigare laddade koden.

Först så måste du konfigurera nätverket, antingen automatiskt via DHCP genom att köra

setenv autoload no
dhcp

eller manuellt genom att ställa in flera miljövariabler

setenv ipaddr <ip address för klienten>
setenv netmask <nätmask>
setenv serverip <ip-adress för tftp servern>
setenv dnsip <ip-adress för namnservrarna>
setenv gatewayip <ip-address på standard gateway>

Om du föredrar det kan du göra dessa inställningar permanenta genom att köra

saveenv

Efteråt måste du ladda avbilderna (kärna/initial ramdisk/dtb) till minnet. Detta görs med kommandot tftpboot, som måste förses med adressen där avbilden ska lagras i minnet. Tyvärr kan minneskartan variera från system till system, så det finns ingen generell regel vilka adresser som kan användas för detta.

På vissa system, så fördefinierar U-Boot en uppsättning miljövariabler med lämpliga laddningsadresser: kernel_addr_r, ramdisk_addr_r och fdt_addr_r. Du kan kontrollera om de är definierade genom att köra

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Om det inte är definerade, så måste du kontrollera ditt systems dokumentation för lämpliga värden och ställa in dem manuellt. För system baserade på Allwinner SunXi SOC (t.ex. Allwinner A10, arkitekturnamnsun4i eller Allwinner A20, arkitekturnamn sun7i), så du kan du tex använda följande värden:

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

När lastadresserna är definierade kan du ladda avbilderna till minnet från den tidigare definierade tftp-servern med

tftpboot ${kernel_addr_r} <filnamnet på kärnavbild>
tftpboot ${fdt_addr_r} <filnamnet på dtb filen>
tftpboot ${ramdisk_addr_r} <filnamnet på den ursprungliga ramdiskavbildningen>

Den tredje delen är att ställa in kärnans kommandorad och faktiskt exekvera den laddade koden. U-Boot skickar innehållet i miljövariabeln bootargs som kommandorad till kärnan, så alla parametrar för kärnan och installationsprogrammet - såsom konsolenheten (se Avsnitt 5.3.1, ”Boot serial console”) eller förinställningsalternativ (se Avsnitt 5.3.2, ”Parametrar för Debian Installer” och Appendix B, Automatiserad installation med förinställningar) - kan ställas in med ett kommando som

setenv bootargs console=ttyS0,115200 rootwait panic=10

Det exakta kommandot för att köra den tidigare laddade koden beror på vilket avbildsformat som används. Med uImage/uInitrd är kommandot

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

och med inbyggda Linux-avbilder är det

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

Obs: När du startar upp standardlinux-avbildningar är det viktigt att ladda den initiala ramdiskavbildningen efter kärnan och dtb:n eftersom U-Boot ställer in filstorleksvariabeln till storleken på den senast laddade filen och kommandot bootz kräver storleken på ramdiskavbildningen för att fungera korrekt. Om du startar en plattformsspecifik kärna, det vill säga en kärna utan enhetsträd, utelämna helt enkelt parametern ${fdt_addr_r}.