5.1. Ξεκινώντας τον εγκαταστάτη στην αρχιτεκτονική 32-bit soft-float ARM

5.1.1. Μορφοποιήσεις της Εικόνας Εκκίνησης

Σε συστήματα βασισμένα στην αρχιτεκτονική ARM, στις περισσότερες περιπτώσεις χρησιμοποιείται μία από τις παρακάτω δύο μορφοποιήσεις των εικόνων εκκίνησης: α) συνήθεις πυρήνες μορφής Linux zImage-format («vmlinuz») σε συνδυασμό με συνήθεις "αρχικούς" δίσκους μνήμης («initrd.gz») ή β) πυρήνες μορφής uImage-format («uImage») σε συνδυασμό με αντίστοιχες αρχικές εικόνες μνήμης («uInitrd»).

uImage/uInitrd είναι μορφοποιήσεις εικόνων σχεδιασμένες για το υλισμικό U-Boot που χρησιμοποιείται σε πολλά συστήματα βασισμένα στην αρχιτεκτονική ARM (κυρίως 32-bit). Παλιότερες εκδόσεις του U-Boot μπορούν να εκκινήσουν μόνο αρχεία στ μορφοποίηση uImage/uInitrd, οπότε αυτές χρησιμοποιούνται σε παλιότερα συστήματα armel. Νεότερες εκδόσεις U-Boot μπορούν - εκτός από την εκκίνηση εικόνων uImages/uInitrds - να εκκινήσουν επίσης συνηθισμένους πυρήνες Linux και εικόνες ramdisk, αλλά η σύνταξη των εντολών για να γίνει αυτό διαφέρει ελαφρά από αυτήν για την εκκίνηση εικόνων uImages.

Για συστήματα που χρησιμοποιούν έναν πυρήνα πολλαπλών πλατφορμών, εκτός από τον πυρήνα και την αρχική ramdisk εκκίνησης χρειάζεται και το λεγόμενο αρχείο device-tree (ή device-tree blob, «dtb»). Είναι συγκεκριμένο για κάθε υποστηριζόμενο σύστημα και περιέχει μια περιγραφή του συγκεκριμένου υλικού. Το αρχείο dtb θα πρέπει να παρέχεται στην συσκευή από το υλισμικό, αλλά στην πράξη ένα πιο πρόσφατο χρειάζεται συνήθως να φορτωθεί.

5.1.2. Εκκίνηση με TFTP

H εκκίνηση από το δίκτυο προαπαιτεί ότι διαθέτετε μια δικτυακή σύνδεση και έναν δικτυακό TFTP server εκκίνησης (και πιθανόν επίσης έναν εξυπηρετητή DHCP, RARP, ή BOOTP για αυτόματη ρύθμιση του δικτύου).

Η ρύθμιση από την πλευρά του εξυπηρετητή για την υποστήριξη της δικτυακής εκκίνησης περιγράφεται στο Τμήμα 4.3, «Προετοιμασία Αρχείων για δικτυακή εκκίνηση με TFTP».

5.1.2.1. Εκκίνηση με TFTP σε U-Boot

Η εκκίνηση από το δίκτυο σε συστήματα που χρησιμοποιούν το υλισμικό U-Boot συνίσταται σε τρία βήματα: α) ρύθμιση του δικτύου, β) φόρτωση των εικόνων (kernel/initial ramdisk/dtb) στη μνήμη και γ) πραγματική εκτέλεση του κώδικα που έχει φορτωθεί προηγουμένως.

Πρώτα πρέπει να ρυθμίσετε το δίκτυο, είτε αυτόματα μέσω DHCP εκτελώντας την εντολή

setenv autoload no
dhcp

ή με το χέρι ορίζοντας αρκετές μεταβλητές περιβάλλοντος

setenv ipaddr <ip διεύθυνση του πελάτη>
setenv netmask <netmask>
setenv serverip <ip διεύθυνση του εξυπηρετητή tftp>
setenv dnsip <ip διεύθυνση του εξυπηρετητή ονοματοδοσίας>
setenv gatewayip <ip διεύθυνση της προεπιλεγμένης πύλης>

Αν το προτιμάτε, μπορείτε να κάνετε αυτές τις ρυθμίσεις μόνιμες εκτελώντας

saveenv

Στη συνέχεια θα πρέπει να φορτώσετε τις εικόνες (kernel/initial ramdisk/dtb) στη μνήμη. Αυτό γίνεται με την εντολή tftpboot, η οποία θα πρέπει να εκτελεστεί με τη διεύθυνση στην οποία θα αποθηκευτεί η εικόνα στη μνήμη. Δυστυχώς ο "χάρτης της μνήμης" (memory map) μπορεί να διαφέρει από σύστημα σε σύστημα, οπότε δεν υπάρχει γενικός κανόνας για το ποιες διευθύνσεις μπορούν να χρησιμοποιηθούν γι' αυτό.

Σε μερικά συστήματα, το U-Boot προκαθορίζει ένα σύνολο μεταβλητών περιβάλλοντος με κατάλληλες διευθύνσεις φόρτωσης: kernel_addr_r, ramdisk_addr_r και fdt_addr_r. Μπορείτε να ελέγξετε αν είναι ορισμένες εκτελώντας την εντολή

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Αν δεν είναι ορισμένες, πρέπει να ελέγξετε την τεκμηρίωση του συστήματός σας για κατάλληλες τιμές και να τις θέσετε με το χέρι. Για συστήματα βασισμένα στις SoC Allwinner SunXi (πχ. τα Allwinner A10, όνομα αρχιτεκτονικής «sun4i» ή τα Allwinner A20, όνομα αρχιτεκτονικής «sun7i»), μπορείτε πχ. να χρησιμοποιήσετε τις ακόλουθες τιμές:

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

Όταν έχουν οριστεί οι διευθύνσεις φόρτωσης, μπορείτε να φορτώσετε τις εικόνες στη μνήμη από τον εκ των προτέρων καθορισμένο εξυπηρετητή tftp με

tftpboot ${kernel_addr_r} <filename of the kernel image>
tftpboot ${fdt_addr_r} <filename of the dtb>
tftpboot ${ramdisk_addr_r} <filename of the initial ramdisk image>

Το τρίτο μέρος είναι η ρύθμιση της γραμμές εντολών τιου πυρήνα και η εκτέλεση όντως του κώδικα που έχει φορτωθεί. Το U-Boot περνά το περιεχόμενα της μεταβλητής περιβάλλοντος «bootargs» ως γραμμή εντολής στον πυρήνα, οπότε οποιεσδήποτε παράμετροι για τον πυρήνα και τον εγκαταστάτη - όπως η συσκευή της κονσόλας (δείτε Τμήμα 5.3.1, «Κονσόλα Εκκίνησης») ή επιλογές προρύθμισης (δείτε Τμήμα 5.3.2, «Παράμετροι του Εγκαταστάτη του Debian» και Παράρτημα B, Αυτοματοποίηση της εγκατάστασης με χρήση προρυθμίσεων (preseeding)) - μπορούν να τεθούν με μια εντολή όπως η

setenv bootargs console=ttyS0,115200 rootwait panic=10

Η ακριβής εντολή για την εκτέλεση του κώδικα που έχει φορτωθεί από πριν εξαρτάται από την διαμόρφωση της εικόνας που χρησιμοποιείται. Με τις εικόνες uImage/uInitrd, η εντολή είναι

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

και με αυθεντικές εικόνες Linux είναι

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

Σημείωση: όταν εκκινείτε συνηθισμένες εικόνες linux, είναι σημαντικό να φορτώνετε την αρχική εικόνα ramdisk μετά τον πυρήνα και το αρχείο dtb καθώς το U-Boot θέτει ως τιμή της μεταβλητή του μεγέθους αρχείου το μέγεθος του τελευταίου αρχείου που φορτώθηκε και η εντολή bootz απαιτεί το μέγεθος της εικόνας της ramdisk να δουλεύει σωστά. Σε περίπτωση εκκίνησης ενός πυρήνα μιας συγκεκριμένης πλατφόρμας, δηλαδή ενός πυρήνα χωρίς δέντρο-συσκευών, απλά παραλείψτε την παράμετρο ${fdt_addr_r}.