Основы embedded Linux

Тема дорожной карты · Embedded / Системный программист

Когда устройству нужны сеть, файловая система, USB-хост или графика, голый микроконтроллер уступает место процессору с Linux: NXP i.MX, Rockchip, Allwinner, Raspberry Pi. Embedded Linux — тот же ядро и пользовательское пространство, что на сервере, но собранные под конкретную плату, урезанные до нескольких десятков мегабайт и запускающиеся с eMMC или SD-карты. Ключевые понятия здесь — цепочка загрузки, кросс-компиляция и минимальная корневая файловая система.

Как это работает

Загрузка идёт цепочкой. Встроенный ROM-код процессора читает первичный загрузчик из фиксированного места на носителе, тот инициализирует DRAM и передаёт управление U-Boot. U-Boot умеет читать файловые системы и сеть, загружает образ ядра zImage или Image, дерево устройств .dtb и при необходимости initramfs, затем передаёт ядру командную строку с указанием корневой файловой системы, например root=/dev/mmcblk0p2 rootwait. Ядро монтирует rootfs и запускает первый процесс — init.

Роль init играет либо systemd, либо компактный BusyBox init со скриптами в /etc/init.d. BusyBox вообще заменяет собой сотню утилит одним бинарником и лежит в основе большинства встраиваемых rootfs. Корневая файловая система может быть на ext4 для eMMC, на SquashFS только для чтения с отдельным разделом данных, или на UBIFS для сырого NAND. Разделение системы на неизменяемую часть и раздел настроек — основа надёжного обновления.

Всё это собирается на хост-машине кросс-компилятором вроде aarch64-linux-gnu-gcc, потому что собирать ядро на самой плате долго. Набор загрузчика, ядра, дерева устройств и драйверов под конкретную плату называют BSP — Board Support Package; его обычно поставляет производитель модуля, а сборочные системы Yocto и Buildroot превращают его в воспроизводимый образ. Отладка ведётся через последовательную консоль UART: именно там видны сообщения U-Boot и паника ядра, когда сеть и дисплей ещё не работают.

Когда применять

Linux выбирают, когда нужны сложные стеки — TCP/IP с TLS, Wi-Fi, Bluetooth, USB, файловые системы, графика, контейнеры — и когда задержки в единицы миллисекунд допустимы. Если требуется жёсткое реальное время, применяют либо ядро с патчем PREEMPT_RT, либо гибрид: Linux для интерфейсов и отдельный микроконтроллер для управления моторами. Для устройств с батарейным питанием и бюджетом в милливатты Linux обычно избыточен.

Типичные ошибки

Самая частая — не прочитать вывод серийной консоли: разработчик часами ищет «неработающий Ethernet», а ядро в первых строках сообщает, что не нашло dtb. Вторая — собрать rootfs с glibc для одной архитектуры и ядро для другой ABI, получив Illegal instruction на первом же процессе. Третья — писать данные на SD-карту без учёта её износа и внезапных отключений питания; без журналируемой файловой системы и правильного монтирования устройство рано или поздно не загрузится. Четвёртая — хранить в образе пароль root по умолчанию и открытый SSH. И, наконец, полагаться на образ, собранный вручную «на коленке», вместо воспроизводимой сборки: через год его никто не сможет повторить.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →