5.1. Запуск программы установки на 32-bit soft-float ARM

5.1.1. Форматы загрузочных образов

В системах на базе ARM в большинстве случаев используется один из двух форматов загрузочных образов: а) стандартные ядра Linux в формате zImage («vmlinuz») в вместе со стандартными начальными Linux ramdisk («initrd.gz») или б) ядра в формате uImage («uImage») вместе с соответствующими начальными ramdisk («uInitrd»).

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

Для систем, использующих мультиплатформенное ядро, помимо ядра и начального ramdisk требуется так называемый файл дерева устройств (device-tree blob, «dtb»). Он уникальный для каждой поддерживаемой системы и содержит описание аппаратуры устройства. Дерево dtb должно содержаться в микропрограмме устройства, но на практике часто требуется загрузить более новое.

5.1.2. Загрузка по TFTP

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

Настройка сервера для обеспечения загрузки из сети описана в Раздел 4.3, «Подготовка файлов для загрузки по TFTP».

5.1.2.1. Загрузка по TFTP из U-Boot

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

Во-первых, нужно настроить сеть, или автоматически по DHCP командой

setenv autoload no
dhcp

или вручную указав настройки в переменных окружения

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>

Если хотите, то можно сделать настройки постоянными с помощью команды

saveenv

После этого нужно загрузить образы (ядро/начальный ramdisk/dtb) в память. Это выполняется с помощью команды tftpboot, которой указывается адрес по которому требуется сохранить образ в память. К сожалению, в разных устройствах карты памяти сильно различаются, поэтому нет общего правила какие адреса следует использовать.

В некоторых системах в U-Boot уже настроены переменные окружения нужными адресами загрузки: kernel_addr_r, ramdisk_addr_r и fdt_addr_r. Вы можете проверить их наличие выполнив

printenv kernel_addr_r ramdisk_addr_r fdt_addr_r

Если они не определены, то обратитесь к документации на систему и введите их значения вручную. В системах на основе ЦПУ Allwinner SunXi (например, Allwinner A10, имя архитектуры name «sun4i» или Allwinner A20, имя архитектуры «sun7i»), вы можете, например, использовать следующие значения:

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

После определения адресов загрузки вы можете загрузить образы в память с ранее настроенного сервера tftp с помощью команд

tftpboot ${kernel_addr_r} <имя файла образа ядра>
tftpboot ${fdt_addr_r} <имя файла dtb>
tftpboot ${ramdisk_addr_r} <имя файла начального ramdisk>

Третьим шагом является настройка командной строки ядра и запуск загруженного кода. U-boot передаёт содержимое переменной окружения «bootargs» ядру как командную строку, поэтому все параметры ядра и программы установки — консольное устройство (смотрите Раздел 5.3.1, «Загрузочная консоль») или ответы на вопросы о настройке (смотрите Раздел 5.3.2, «Параметры программы установки Debian» and Приложение 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 устанавливает переменную filesize равной размеру последнего загруженного файла, а для правильной работы команды bootz требуется размер образа ramdisk. При загрузке специального ядра устройства, то есть ядра без дерева устройств, просто не указывайте параметр ${fdt_addr_r}.