5.1. Завантаження встановлювача на 32-bit soft-float ARM

5.1.1. Формати образів завантаження

На ARM-системах у більшості випадків використовується один з двох форматів завантажувальних образів: а) стандартний zImage-формат ядра Linux («vmlinuz») у поєднанні зі стандартними початковими образами Linux («initrd.gz») або b) ядро у форматі uImage («uImage») у поєднанні з відповідними початковими образами («uInitrd»).

uImage/uInitrd - формати образів, призначені для прошивки U-Boot, яка використовується на багатьох ARM-системах (переважно 32-розрядних). Старіші версії U-Boot можуть завантажувати лише файли у форматі uImage/uInitrd, тому їх часто використовують на старих системах armel. Новіші версії U-Boot можуть - окрім завантаження uImages/uInitrds - також завантажувати стандартні ядра Linux та образи ramdisk, але синтаксис команди для цього дещо відрізняється від синтаксису команди для завантаження uImages.

Для систем з багатоплатформним ядром, окрім ядра і початкового ramdisk, потрібен так званий файл дерева пристроїв (або blob дерева пристроїв, «dtb»). Він специфічний для кожної підтримуваної системи і містить опис конкретного обладнання. dtb має постачатися на пристрій разом з прошивкою, але на практиці часто потрібно завантажувати новішу версію.

5.1.2. Завантаження з TFTP

Завантаження з мережі вимагає підключення до мережі та сервера TFTP network boot (і, ймовірно, також DHCP, RARP або BOOTP для автоматичного налаштування мережі).

Налаштування на стороні сервера для підтримки завантаження з мережі описано в Розділ 4.3, «Preparing Files for TFTP Net Booting».

5.1.2.1. TFTP-booting в U-Boot

Мережеве завантаження на системах з прошивкою U-Boot складається з трьох кроків: а) налаштування мережі, б) завантаження образів (ядро/початковий ramdisk/dtb) у пам'ять і в) власне виконання попередньо завантаженого коду.

Спочатку вам потрібно налаштувати мережу або автоматично через DHCP, запустивши

setenv autoload no
dhcp

or manually by setting several environment variables

setenv ipaddr <ip address of the client>
setenv netmask <netmask>
setenv serverip <ip address of the tftp server>
setenv dnsip <ip address of the nameserver>
setenv gatewayip <ip address of the default gateway>

If you prefer, you can make these settings permanent by running

saveenv

Після цього Вам потрібно завантажити образи (kernel/initial ramdisk/dtb) у пам'ять. Це робиться за допомогою команди tftpboot, яка повинна бути надана з адресою, за якою образ буде збережений у пам'яті. На жаль, карта розподілу пам'яті може відрізнятися в різних системах, тому на цей випадок, на жаль, немає загального правила які адреси для цього можуть бути використані.

На деяких системах U-Boot predefines набір змінних середовища з відповідними адресами навантаження: kernel_addr_r, ramdisk_addr_r and fdt_addr_r. Ви можете перевірити, чи вони визначені за допомогою

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Якщо вони не визначені, вам необхідно перевірити документацію системи для відповідних значень і встановити їх вручну. Для систем на основі Allwinner SunXi SOCs (наприклад, 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, Автоматичне встановлення з готовими відповідями) - можна встановити командою на кшталт

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}.