Этапы загрузки и размещение в памяти ОСРВ MULTEX-ARM
Введение
Одной из ключевых особенностей реализации операционной системы реального времени Multex-ARM является её уникальная схема начальной загрузки. В отличие от традиционных решений для ARM-платформ, где для запуска ядра Linux используется связка SPL / U-Boot, в Multex-ARM применяется собственная двухуровневая система загрузки — Multex-SPL и Multex-Zero. Эти компоненты заменяют стандартные загрузчики и обеспечивают высокую скорость и надёжность старта системы.
В отличие от загрузчика U-Boot, который нужно пересобирать для каждого процессора отдельно, система загрузки Multex-ARM является универсальной для всех поддерживаемых процессоров. На данный момент она поддерживает процессоры компании Allwinner, такие как H3, A20, A40, V3s и другие представители линейки ARM Cortex-A7. Общая последовательность этапов загрузки выглядит следующим образом:
- BROM — аппаратно встроенный первичный загрузчик, прошитый непосредственно в процессор;
- Multex-SPL — вторичный загрузчик;
- Multex-Zero — основной загрузчик;
- Загружаемое ПО (монолитное ядро Multex-ARM скомпилированное с задачами пользователя).
Благодаря минимализму и оптимизации каждого уровня, общее время загрузки от момента подачи питания до завершения инициализации ядра занимает менее одной секунды, что делает систему крайне эффективной для применения в задачах реального времени.
Физически загрузчики Multex-SPL и Multex-Zero располагаются на внешнем носителе (micro-SD или eMMC) сразу после таблицы разделов FAT и до начала файловой системы. Такое расположение позволяет проверять и при необходимости восстанавливать файловую систему ещё на этапе загрузки, до запуска основной программы.
В данной статье подробно рассматривается порядок работы каждого этапа загрузки, размещение загрузчиков и ядра операционной системы в адресном пространстве процессора, а также принципы распределения памяти. Размещение загрузчиков и основного ПО на запоминающем устройстве и в адресном пространстве процессора показано в графическом виде на рисунке. Цифрами на нём отмечена очерёдность загрузки ПО в память процессора.

Аппаратный загрузчик BROM
При подаче питания процессор начинает выполнение кода зашитого в постоянной памяти (Boot ROM или BROM). Эта область является неизменяемой частью системы на кристалле (SoC) и содержит начальный загрузочный код, обеспечивающий первичную инициализацию системы. С точки зрения адресации, BROM располагается по адресу 0xffff0000, откуда процессор начинает выполнение инструкций сразу после сброса.
Одной из ключевых функций BROM является автоматическое сканирование доступных интерфейсов запоминающих устройств с целью поиска допустимого образа вторичного загрузчика (SPL). Порядок проверки устройств обычно следующий:
1. SDC (MMC0) — карта памяти SD/MMC;
2. eMMC (MMC2) — встроенная флэш-память стандарта eMMC;
3. SPI0 — карта памяти SPI-NOR подключенная через последовательный периферийный интерфейс;
4. USB — при наличии поддержки USB-загрузки. При определённых условиях возможен быстрый переход к USB без проверки предыдущих интерфейсов.
Этот порядок может отличаться в зависимости от конкретной реализации SoC. Каждое устройство проверяется последовательно, до первого успешного обнаружения корректного загрузочного образа.
- В ходе проверки BROM обращается к заранее определённому адресу на каждом устройстве (для устройств SD/MMC это адрес 0x2000, для SPI-NOR — 0x0000), чтобы считать область памяти, предположительно содержащую начальный загрузочный код. Эта область должна содержать специальную сигнатуру — строку “eGON.BT0“, которая служит маркером допустимого формата образа. Помимо наличия сигнатуры, BROM проверяет целостность данных подписи путём вычисления контрольной суммы. Если сигнатура и контрольная сумма корректны, BROM считает образ допустимым для дальнейшей загрузки. Если ни одно из проверяемых устройств не содержит корректного образа загрузчика, выполнение программы BROM завершается без перехода к следующему этапу. В таком случае система остаётся в состоянии ожидания внешнего воздействия — например, входа в режим FEL для принудительной загрузки через USB.
Вторичный загрузчик Multex-SPL
После успешной проверки подписанного образа BROM загружает найденный образ вторичного загрузчика Multex-SPL (Secondary Program Loader) с подписью во внутреннюю статическую память SRAM, начиная с адреса 0x0000 (цифра 1 на рисунке). На этот же адрес передаётся управление после окончания загрузки. Содержимое скопированной области состоит из двух частей:
- Специальная сигнатура, содержащая инструкцию перехода на точку входа загрузчика;
- Образ вторичного загрузчика Multex-SPL, начинающийся с адреса 0x0060.
Таким образом, при передаче управления в адрес 0x0000 первым выполняется короткий участок кода, который немедленно перенаправляет выполнение программы на начало самого загрузчика. При получении управления загрузчик выделяет в SRAM дополнительные области памяти под стек и временные переменные. Эти области размещаются сразу после тела загрузчика в SRAM, что позволяет организовать минимальную среду исполнения без необходимости использования внешней памяти на ранних стадиях загрузки.
Объём доступной SRAM ограничен (обычно составляет 24–32 Кбайт), поэтому размер допустимого загрузочного образа также ограничен. Именно с этим ограничением связан минималистичный функционал Multex-SPL. Это компактная программа, занимающая не более 24 Кбайт. Несмотря на свои размеры, он содержит необходимый набор драйверов и функциональных модулей для подготовки системы к дальнейшей загрузке.
Основные функции Multex-SPL:
- Поддержка линейки процессоров ARM Cortex-A7 от Allwinner. Multex-SPL предназначен для работы с различными SoC семейства Allwinner, таких как H3, A20, A40, V3s. Он обеспечивает аппаратно-зависимую инициализацию этих чипов, адаптируясь к особенностям конкретного процессора;
- Первичная конфигурация параметров процессора. Загрузчик устанавливает базовые параметры работы CPU, настраивает множители PLL (Phase-Locked Loop) для задания оптимальной тактовой частоты ядра, конфигурирует скорости работы внутренних шин (AHB, APB и других), обеспечивающих эффективное взаимодействие между блоками SoC;
- Инициализация контроллеров памяти DDR и SD/eMMC. Контроллер DDR — обеспечивает доступ к оперативной памяти, что позволяет загружать и выполнять более крупные программы. Контроллер SD/eMMC карты памяти позволяет получить доступ к загрузочному носителю;
- Копирование основного загрузчика в ОЗУ. После завершения инициализации DDR-памяти Multex-SPL обнаруживает на запоминающем устройстве основной загрузчик Multex-Zero, расположенный в начальных секторах носителя. Образ загрузчика копируется в оперативную память по фиксированному адресу 0x40010000, который является стандартной точкой входа для следующего этапа загрузки;
- Отладочные сообщения и диагностика. В целях отладки и мониторинга состояния системы, Multex-SPL выводит информацию о ходе выполнения через UART-интерфейс в виде простых текстовых сообщений. Это позволяет видеть, какие этапы прошли успешно, а где произошла ошибка;
- Передача управления основному загрузчику. После завершения всех предыдущих шагов и успешного копирования Multex-Zero в ОЗУ, управление передаётся на его точку входа по адресу 0x40010000. С этого момента выполнение продолжает уже полнофункциональный загрузчик, способный работать с файловой системой, сетью и другими расширенными возможностями.
После передачи управления память SRAM более не используется и может быть задействована под нужды основного программного обеспечения устройства.
Основной загрузчик Multex-Zero
После завершения работы вторичного загрузчика Multex-SPL, процессор переходит к следующему этапу начальной загрузки — запуску основного загрузчика Multex-Zero. Этот компонент является полнофункциональным загрузчиком, написанным на базе операционной системы реального времени Multex-ARM, и обладает расширенными возможностями по сравнению с предыдущими этапами загрузки.
Физически образ Multex-Zero располагается на внешнем запоминающем устройстве (например, micro-SD или eMMC) сразу после образа Multex-SPL, то есть в первом мегабайте адресного пространства устройства, до начала файловой системы FAT. Это позволяет легко находить его при помощи фиксированных смещений, не требуя наличия драйверов файловой системы на ранних этапах загрузки. Загрузчик копируется в оперативную память DDR процессором под управлением Multex-SPL и размещается по адресу 0x40010000 (цифра 2 на рисунке). После завершения копирования управление передаётся на точку входа этого образа.
Как только управление переходит к Multex-Zero, он выделяет дополнительные области памяти под стеки, переменные и пул динамической памяти. Структура распределения памяти почти полностью соответствует той, что используется в самой Multex-ARM (как описано в статье «Распределение оперативной памяти») с некоторыми отличиями:
- Объём выделенного адресного пространства значительно меньше;
- Начальный адрес памяти задан фиксированно и находится ниже адреса основной программы.
В отличие от Multex-SPL, который работает в условиях жёстких ограничений по объёму кода и доступной памяти, Multex-Zero может использовать большой пул оперативной памяти и обладает большими возможностями. Вот основные функции, которые он реализует:
1. Поддержка линейки процессоров ARM Cortex-A7 от Allwinner. Multex-Zero совместим с различными SoC семейства Allwinner, а именно H3, A20, A40, V3s и другие. Он содержит аппаратно-зависимые модули, адаптированные под особенности каждого конкретного чипа;
2. Дополнительная аппаратная инициализация. На этом этапе загрузки производится более глубокая настройка процессора, инициализируются контроллеры USB и Ethernet, подключаются внешние устройства хранения данных, включаются и конфигурируются прочие модули, необходимые для работы основного ПО;
3. Проверка и восстановление разделов дисков. Расположение основного загрузчика вне файловой системы позволяет ему проверять и, при необходимости, восстанавливать её целостность на всех доступных разделах дисков;
4. Монтирование файловой системы. Multex-Zero поддерживает работу с файловой системой и умеет подключать разделы карт памяти micro-SD, eMMC, USB. Это позволяет ему искать нужные файлы, такие как образ ядра или скрипты обновления, в структурированном виде;
5. Поиск основного программного обеспечения. Загрузчик ищет на подключённых носителях заданный исполняемый файл (по умолчанию multex.bin), представляющий собой монолитное ядро операционной системы Multex-ARM скомпилированное с программным обеспечением пользователя;
6. Выполнение сценариев обновления прошивки. Multex-Zero предоставляет возможность выполнения пользовательских сценариев обновления ПО с внешних носителей. Это позволяет автоматизировать процесс обновления системы без необходимости использования специализированного оборудования;
7. Проверка целостности образа. Перед загрузкой основного ПО загрузчик проверяет его целостность, используя механизм контрольной суммы. Это гарантирует, что система запускается с корректной и безопасной версией программного обеспечения. При нахождении ошибок может быть запущен механизм восстановления или обновления программного обеспечения предусмотренный сценарием;
8. Копирование основного ПО в оперативную память. После успешной проверки целостности исполняемый бинарный файл копируется в заранее определённый участок оперативной памяти (цифра 3 на рисунке). Как правило, это область начинается с адреса 0x48000000, но конкретный адрес может быть задан параметром конфигурации. Например, для процессора V3s с оперативной памятью 64 Мб стартовый адрес основной программы 0x41000000;
9. Вывод отладочных сообщений. Во время выполнения всех операций Multex-Zero выводит диагностические сообщения через отладочный последовательный порт UART0. Это может помочь разработчику основного ПО понять текущее состояние системы и выявить возможные ошибки;
10. Передача управления основному ПО. После завершения всех подготовительных действий и успешной загрузки образа основной программы, управление передаётся на точку входа основного ПО. С этого момента начинается выполнение программы под управлением ОСРВ Multex-ARM.
После передачи управления основной программе все ресурсы памяти, ранее занятые Multex-Zero, больше не используются. Они могут быть освобождены и выделены под нужды операционной системы. Таким образом, Multex-Zero играет роль временной среды, необходимой только на этапе подготовки к запуску основной программы.
Запуск ядра ОСРВ Multex-ARM
После завершения всех этапов начальной загрузки — от интегрированного BROM до основного загрузчика Multex-Zero — управление передаётся на точку входа ядра операционной системы реального времени Multex-ARM, которое начинает свою инициализацию. С этого момента процесс запуска системы переходит в фазу, уже не зависящую от загрузчиков, и целиком определяется архитектурой самой операционной системы.
На первых шагах работы ядра выделяются дополнительные области оперативной памяти, необходимые для его полноценного функционирования. В их число входят:
- Стеки прерываний (IRQ, FIQ, SVS), обеспечивающие корректную обработку аппаратных и программных событий;
- Глобальные переменные ядра, используемые для хранения состояния системных модулей и параметров конфигурации;
- Пул динамической памяти, предназначенный для выделения ресурсов под задачи, данные и структуры данных во время выполнения программы.
Особенности распределения этих областей строго регламентированы и подробно описаны в статье «Распределение оперативной памяти». Там же можно найти информацию о ключевых адресах (DRAM_START, MEM_POOL_END, MX_TEXT), используемых при компоновке образа, а также о том, как распределены сегменты .text, .rodata, .data, .bss.
Ядро Multex-ARM начинает работу с инициализации внутренних подсистем: планировщика задач, таймеров, системных вызовов, драйверов и менеджера памяти. После завершения всех процедур система готова к запуску первой пользовательской задачи.
Таким образом, на данном этапе начальная загрузка системы считается завершённой. Ядро полностью подготовлено к исполнению задач пользователя, обеспечивает базовые механизмы многозадачности, управления памятью и взаимодействия с периферией. Дальнейшая работа системы зависит от конкретной реализации прикладного ПО и может включать запуск нескольких задач, использование сетевых или файловых интерфейсов, работу с графическим выводом и обработку сигналов в режиме реального времени.
Заключение
Рассмотренная в статье схема начальной загрузки и размещения компонентов операционной системы реального времени Multex-ARM демонстрирует высокую степень оптимизации и надёжности. Использование собственной двухуровневой системы загрузчиков — Multex-SPL и Multex-Zero — вместо традиционных решений вроде SPL/U-Boot позволяет значительно ускорить процесс старта системы и минимизировать время до начала выполнения пользовательского кода.
Общее время загрузки от момента подачи питания до запуска первой задачи составляет менее одной секунды, что делает Multex-ARM идеально подходящей для применения в системах жёсткого реального времени, где критична скорость реакции и предсказуемость поведения. Такая эффективность достигается благодаря строгой модульности архитектуры, минимализму каждого уровня загрузки и глубокой аппаратной оптимизации под конкретные чипы компании Allwinner (H3, A20, A40, V3s и другие из линейки ARM Cortex-A7).
Особое внимание уделено распределению памяти: каждый этап загрузки использует строго определённые области как внутренней SRAM, так и внешней DDR-памяти, обеспечивая чёткое разделение между кодом, данными и стеками. Это не только упрощает отладку и диагностику, но и гарантирует безопасное и стабильное исполнение программного обеспечения.
Кроме того, физическое расположение загрузчиков на внешнем носителе (micro-SD или eMMC) до файловой системы FAT предоставляет дополнительную гибкость и возможность восстановления системы даже на ранних этапах загрузки, что особенно важно в промышленных и embedded-приложениях.
Таким образом, реализация загрузки и размещения Multex-ARM представляет собой хорошо продуманную и эффективно работающую схему, сочетающую в себе надёжность, быстродействие и простоту сопровождения. Она служит отличным примером того, как можно построить отказоустойчивую и высокопроизводительную систему реального времени с учётом специфики современных ARM-платформ.