Das U-Boot (с подзаголовком «Универсальный загрузчик» и часто сокращается до U-Boot ; дополнительную информацию об имени см. в «Истории ») — это загрузчик с открытым исходным кодом , используемый во встроенных устройствах для выполнения различных низкоуровневых задач инициализации оборудования и загрузки. ядро операционной системы устройства. Он доступен для ряда компьютерных архитектур , включая 68k , ARM , Blackfin , MicroBlaze , MIPS , Nios , SuperH , PPC , RISC-V и x86 .
U-Boot — это загрузчик как первого, так и второго этапа. Он загружается ПЗУ системы (например, встроенным ПЗУ процессора ARM) с поддерживаемого загрузочного устройства, такого как SD-карта, диск SATA, флэш-память NOR (например, с использованием SPI или I²C ) или флэш-память NAND. Если есть ограничения по размеру, U-Boot можно разделить на два этапа: платформа загружает небольшой SPL (вторичный загрузчик программ), который представляет собой урезанную версию U-Boot, а SPL выполняет некоторую начальную конфигурацию оборудования. (например, инициализация DRAM с использованием кэша ЦП в качестве ОЗУ) и загрузите более крупную полнофункциональную версию U-Boot. [3] [4] [5] Независимо от того, используется ли SPL, U-Boot выполняет как первый этап (например, настройку контроллеров памяти и SDRAM), так и второй этап загрузки (выполнение нескольких шагов для загрузки современной операционной системы из различные устройства, которые необходимо настроить, предоставляющие пользователям меню для взаимодействия и управления процессом загрузки и т. д.).
U-Boot реализует подмножество спецификации UEFI , как определено в спецификации встроенных базовых требований к загрузке (EBBR). [6] Двоичные файлы UEFI, такие как GRUB или ядро Linux , можно загружать через диспетчер загрузки или из интерфейса командной строки.
U-Boot запускает интерфейс командной строки на консоли или последовательном порту. Используя CLI, пользователи могут загружать и загружать ядро, возможно, изменяя параметры по умолчанию. Также имеются команды для чтения информации об устройстве, чтения и записи флэш-памяти, загрузки файлов (ядер, загрузочных образов и т. д.) из последовательного порта или сети, управления деревьями устройств и работы с переменными среды (которые можно записать в постоянное хранилище). и используются для управления поведением U-Boot, таким как команда загрузки по умолчанию и время ожидания перед автоматической загрузкой, а также данные оборудования, такие как MAC-адрес Ethernet).
В отличие от загрузчиков ПК, которые скрывают или автоматически выбирают области памяти ядра и других загрузочных данных, U-Boot требует, чтобы в командах загрузки явно указывались адреса физической памяти в качестве мест назначения для копирования данных (ядро, виртуальный диск, дерево устройств и т. д.) и для перехода к ядру и в качестве аргументов ядра. Поскольку команды U-Boot довольно низкоуровневые, для загрузки ядра требуется несколько шагов, но это также делает U-Boot более гибким, чем другие загрузчики, поскольку одни и те же команды можно использовать для более общих задач. Можно даже обновить U-Boot с помощью U-Boot, просто прочитав новый загрузчик откуда-то (локальное хранилище, последовательный порт или сеть) в память и записав эти данные в постоянное хранилище, к которому принадлежит загрузчик.
U-Boot поддерживает USB, поэтому он может использовать USB-клавиатуру для управления консолью (в дополнение к вводу через последовательный порт), а также получать доступ и загружаться с USB-устройств массовой памяти, таких как устройства чтения SD-карт.
U-Boot загружает операционную систему, считывая ядро и любые другие необходимые данные (например, дерево устройств или образ виртуального диска) в память, а затем запуская ядро с соответствующими аргументами.
Команды U-Boot на самом деле являются обобщенными командами, которые можно использовать для чтения или записи любых произвольных данных. С помощью этих команд данные можно считывать или записывать в любую систему хранения, поддерживаемую U-Boot, включая:
(Примечание. Это источники загрузки, из которых U-Boot может загружать данные (например, ядро или образ виртуального диска) в память. Сам U-Boot должен загружаться платформой, и это должно быть сделано с устройства, которое поддерживает платформа. ROM способен загружаться, что естественно зависит от платформы.)
В некоторых реализациях встроенных устройств ЦП (SoC) находит и загружает загрузчик (например, Das U-Boot) напрямую из загрузочного раздела (например, файловых систем ext4 или FAT ).
U-Boot не обязательно должен иметь возможность читать файловую систему, чтобы ядро могло использовать ее в качестве корневой файловой системы или начального виртуального диска; U-Boot просто предоставляет ядру соответствующий параметр и/или копирует данные в память, не понимая их содержимого.
Однако U-Boot также может читать (а в некоторых случаях и записывать) файловые системы. Таким образом, вместо того, чтобы требовать, чтобы данные, которые U-Boot загружал, хранились в фиксированном месте на устройстве хранения, U-Boot может читать файловую систему для поиска и загрузки ядра, дерева устройств и т. д. по имени пути.
U-Boot включает поддержку следующих файловых систем:
Дерево устройств — это структура данных для описания компоновки оборудования. Используя дерево устройств, поставщик может использовать менее модифицированную основную версию U-Boot на оборудовании специального назначения. Дерево устройств, также принятое в ядре Linux, предназначено для улучшения ситуации в индустрии встраиваемых систем , где существует огромное количество ответвлений для конкретных продуктов (U-Boot и Linux). Возможность запуска основного программного обеспечения практически гарантирует клиентам отсутствие обновлений от поставщиков.
Источником проекта является загрузчик 8xx PowerPC под названием 8xxROM , написанный Магнусом Даммом. [7] В октябре 1999 года Вольфганг Денк переместил проект на SourceForge.net и переименовал его в PPCBoot , поскольку SF.net не допускал, чтобы имена проектов начинались с цифр. [7] Версия 0.4.1 PPCBoot была впервые публично выпущена 19 июля 2000 года.
В 2002 году предыдущая версия исходного кода была ненадолго преобразована в продукт под названием ARMBoot , но вскоре после этого снова была объединена с проектом PPCBoot. 31 октября 2002 г. был выпущен PPCBoot-2.0.0 . Это был последний выпуск под названием PPCBoot, поскольку он был переименован, чтобы отразить его способность работать на других архитектурах, помимо PPC ISA. [8] [9]
PPCBoot-2.0.0 стал U-Boot-0.1.0 в ноябре 2002 года и расширен для работы с процессорной архитектурой x86 . Дополнительные возможности архитектуры были добавлены в следующие месяцы: MIPS32 в марте 2003 г., MIPS64 в апреле, Nios II в октябре, ColdFire в декабре и MicroBlaze в апреле 2004 г. Выпуск U-Boot-1.1.2 в мае 2004 г. работал над этими продуктами. 216 производителей плат различных архитектур. [9]
В нынешнее название Das U-Boot добавлен определенный артикль на немецком языке, чтобы создать двуязычный каламбур классического немецкого фильма о подводных лодках 1981 года Das Boot , действие которого происходит на немецкой подводной лодке времен Второй мировой войны . Это бесплатное программное обеспечение , выпущенное на условиях Стандартной общественной лицензии GNU . Его можно собрать на ПК x86 для любой из предполагаемых архитектур с использованием цепочки инструментов GNU для перекрестной разработки , например Crosstool, Embedded Linux Development Kit (ELDK) или OSELAS.Toolchain.
Важность U-Boot во встроенных системах Linux довольно кратко изложена в книге Карима Ягмура «Building Embedded Linux Systems» , чей текст о U-Boot начинается словами: «Хотя существует немало других загрузчиков, «Das U-Boot» , универсальный загрузчик, возможно, самый богатый, самый гибкий и наиболее активно разрабатываемый из доступных загрузчиков с открытым исходным кодом». [10]