В системах на базе 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 должно содержаться в микропрограмме устройства, но на практике часто требуется загрузить более новое.
Загрузка по сети требует наличия сетевого подключения и сетевого загрузочного сервера TFTP (и, вероятно, также серверов DHCP, RARP или BOOTP для автоматической настройки по сети).
Настройка сервера для обеспечения загрузки из сети описана в Раздел 4.3, «Подготовка файлов для загрузки по TFTP».
Загрузка по сети в системах, использующих микропрограмму 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}.