Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Основные принципы системной разработки > Запуск системы, быстрая активация устройств > Построение встраиваемых систем > Статьи руководства > Введение в построение встраиваемых систем



Введение в построение встраиваемых систем

Общая информация о создании полнофункциональных встраиваемых систем

Введение в построение встраиваемых систем:

Введение
Роль начального загрузчика (IPL)
IPL для горячего и холодного запуска
Роль модуля startup
Функции модуля startup
Копирование и распаковка образа
Настройка оборудования
Определение конфигурации системы
Настройка callout-ов
Запуск операционной системы
Библиотека libstartup
Роль ЗОСРВ «Нейтрино»
Аппаратные компоненты встраиваемой системы
Поддержка процессорных архитектур
Источник инициализации и конфигурации
Выбор файловой системы
Система без дополнительных запоминающих устройств
Дополнительные запоминающие read-only устройства
Дополнительные непостоянные запоминающие read/write устройства
Дополнительные постоянные запоминающие read/write устройства
Накопители флеш-памяти и их файловые системы
Ротация накопителей и файловых систем
Сетевые накопители и их файловые системы
Устройства ввода/вывода
Символьные устройства ввода/вывода
Специализированные/нестандартные устройства
Начало работы
Разработка оборудования
Модификация программного обеспечения
Модификация исходного кода

Введение

В этой главе описывается общий процесс создания полнофункциональной встраиваемой системы под управлением ЗОСРВ «Нейтрино» c указанием ссылок на главы, которые посвящены его конкретным этапам.

Сначала мы рассмотрим процесс запуска ЗОСРВ «Нейтрино», затем — компоненты и принципы их работы, а в конце кратко познакомимся с процедурой их модификации.

С точки зрения программного обеспечения процесс запуска системы выглядит следующим образом:

  1. процессор начинает выполнение с вектора сброса. Начальный загрузчик (Initial Program Loader, IPL) обнаруживает образ операционной системы и передает управление модулю startup-*, которая находится в нем

  2. модуль startup-* настраивает систему и передает управление микроядру ЗОСРВ «Нейтрино» и менеджеру процессов

  3. модуль procnto загружает дополнительные драйверы и приложения

После того, как мы подробнее познакомимся с аспектами работы программного обеспечения, мы рассмотрим роль оборудования в процессе запуска системы.

Роль начального загрузчика (IPL)

Первой задачей программного обеспечения является загрузка образа операционной системы. Ее выполняет программа, которая называется начальным загрузчиком (Initial Program Loader, IPL).

IPL осуществляет необходимый минимум действий по настройке оборудования и создает среду, в которой выполняется сначала модуль startup-*, а затем микроядро ЗОСРВ «Нейтрино»:

  1. начинает выполняться с вектора сброса
  2. настраивает контроллер памяти, в том числе линии выбора микросхем и/или контроллер PCI
  3. настраивает часы
  4. настраивает стек, с помощью которого библиотека libipl верифицирует и конфигурирует ОС (скачивает, сканирует, настраивает образ и передает ему управление)

Начальный загрузчик IPL подробно описан в главе Руководство по разработке начального загрузчика (IPL).

img_samp.png
Рисунок 1. Образ ОС, с которым работает начальный загрузчик

IPL для горячего и холодного запуска

Существуют два типа IPL, один из которых предназначен для горячего запуска системы, а другой ― для холодного. IPL горячего запуска обычно вызывается ROM-монитором или BIOS после первичной настройки оборудования и процессора, а IPL холодного запуска — непосредственно после сброса, когда процессор и оборудование системы еще не настроены. Таким образом, IPL горячего запуска выполняет часть работы начального загрузчика холодного запуска.

Мы начнем рассматривать функции IPL с конца: сначала опишем состояние, в которое система должна перейти перед запуском первого компонента образа, а затем познакомимся с процессом его достижения.

Содержание этого процесса в значительной степени зависит от особенностей целевой системы. Если вы работаете со стандартной платформой с ROM-монитором или BIOS, в которой все нижеперечисленные этапы уже выполнены при горячей загрузке с диска или по сети, никакие дополнительные действия не требуются. В нестандартной встраиваемой системе, где отсутствует микропрограмма, а образ хранится на специальном устройстве, IPL выполняет значительный объем работы.

Конечное состояние системы (которое предшествует запуску первого компонента образа) должно соответствовать следующим условиям:

Передача образа в линейно адресуемую память осуществляется IPL, ROM-монитором или BIOS. Чтобы IPL или ROM-монитор мог определить, в какой области памяти разместить образ и по какому адресу передать управление по окончании его загрузки, необходимо собирать образ ОС в подходящем формате.

Например, в IBM PC BIOS обычно загружает образ в необработанном двоичном виде и передает управление по его начальному адресу. Некоторые системы работают с образами в формате ELF и считывают место размещения и начальный адрес образа из его заголовка. Сведения о форматах образа, которые поддерживаются IPL, см. в сопроводительной документации целевой системы.

После того, как IPL обнаруживает образ и целиком размещает его в линейно адресуемой памяти, управление передается модулю startup-*. На этом IPL завершает работу и больше не используется.

Роль модуля startup

На втором этапе программное обеспечение настраивает процессор и аппаратные компоненты, обнаруживает имеющиеся ресурсы и запускает операционную систему. Эти задачи выполняются модулем startup-* (подробнее см. в главе Руководство по разработке модуля startup).

IPL осуществляет минимально необходимую настройку системы и подготавливает ее к выполнению модуля startup-*, который завершает процесс настройки. Если IPL осуществляет поиск системных ресурсов, он передает информацию о них модулю startup-*, чтобы он не выполнял их поиск повторно.

С помощью модуля startup-* можно гибко настраивать ЗОСРВ «Нейтрино»: программировать базовые таймеры, контроллеры прерываний, кеш-памяти и др. В модуль startup-* также можно включать callout-ы ядра — фрагменты кода, которые вызываются ядром для выполнения специфических аппаратных функций. Например, при генерации прерывания устройством один фрагмент кода должен обнаруживать источник прерывания, а другой — очищать его.

Следует иметь в виду, что модуль startup-* не настраивает скорость передачи последовательных портов и другие аналогичные параметры, а также не инициализирует стандартные периферийные устройства, такие как контроллеры Ethernet и EIDE; эти действия выполняют драйверы, которые запускаются позже.

По окончании инициализации системы и размещения информации о ней на системной странице (особой области памяти, с которой впоследствии работает ядро), код запуска передает управление ядру ЗОСРВ «Нейтрино» и менеджеру процессов, которые завершают этап загрузки.

Функции модуля startup

Рассмотрим функции и процесс выполнения кода запуска:

  1. копирование и при необходимости распаковка образа
  2. настройка оборудования
  3. определение конфигурации системы
  4. запуск ядра

Копирование и распаковка образа

Код запуска копирует образ в целевую область ОЗУ, если он не был помещен в нее ранее. Если образ сжат, код запуска автоматически распаковывает его. Сжимать файл образа не обязательно; если он не сжат, код запуска не пытается распаковывать его.

Настройка оборудования

Основная задача кода запуска на этом этапе — выполнить минимально необходимую настройку для определения конфигурации системы (а затем настраивать систему).

Конкретное содержание процедуры настройки зависит от особенностей оборудования.

Определение конфигурации системы

В зависимости от особенностей встраиваемой системы ее конфигурация может динамически определяться при запуске либо быть строго фиксированной.

В любом случае код запуска должен сохранять настройки системы в четко определенных структурах данных, которые считываются операционной системой после ее запуска. В совокупности они называются системной страницей и содержат следующую информацию:

Настройка callout-ов

Для обеспечения максимальной переносимости ядра ЗОСРВ «Нейтрино» между процессорами и их различными конфигурациями код запуска должен включать в себя ряд callout-ов ядра. Необходимость писать программный код всех callout-ов отсутствует, поскольку многие из них реализованы в библиотеке, которая входит в состав ЗОСРВ «Нейтрино».

callout-ы ядра ЗОСРВ «Нейтрино» делятся на следующие классы:

callout-ы подробно описаны в главе Руководство по разработке модуля startup.

Запуск операционной системы

Последнее действие, которое выполняет код запуска — передача управления операционной системе.

Библиотека libstartup

Написание кода запуска — трудоемкая задача, однако мы предоставляем исходный код типовых модулей startup-* и библиотеку libstartup, в которой реализованы многие из вышеупомянутых функций.

Если вы работаете с одной из многочисленных платформ, которые поддерживаются ЗОСРВ «Нейтрино», вам не нужно прилагать усилия к решению перечисленных задач — мы уже сделали для вас всю необходимую работу.

Чтобы узнать, какие процессоры и платы поддерживаются на текущий момент, обратитесь к следующим источникам:

Чтобы реализовать необходимые функции в нестандартной встраиваемой системе, можно найти исходный код для максимально схожей с ней системы и «клонировать» примеры, которые содержатся в нем.

Этот вопрос подробно рассматривается в главе Руководство по разработке модуля startup.

Роль ЗОСРВ «Нейтрино»

На третьем этапе запускаются все необходимые программы. Операционная система считывает и обрабатывает сценарий запуска (startup script) — последовательность команд, которая хранится в загрузочном образе. Формат startup script и файл построения загрузочного образа, в состав которого он входит, подробно описан в нескольких статьях настоящего руководства:

Операционная система обрабатывает startup script, который напоминает сценарий командного интерпретатора. В нем указывается список запускаемых программ с командно-строковыми параметрами и другая информация.

Аппаратные компоненты встраиваемой системы

С точки зрения оборудования система включает в себя следующие компоненты:

Поддержка процессорных архитектур

ЗОСРВ «Нейтрино» поддерживает многие семейства процессоров (см. Системные требования и лимиты :: Ограничения, связанные с платформой), включая:

В общем случае процесс запуска системы слабо зависит от выбранного процессора и его архитектуры.

Источник инициализации и конфигурации

После запуска или перезапуска системы процессор должен иметь возможность выполнять команды. Эти команды хранятся в постоянном запоминающем устройстве, на которое указывает вектор сброса процессора. В качестве поставщика IPL могут выступать:

Как правило, чем меньше объем работы, тем легче разработать встраиваемую систему. Стандартные поддерживаемые аппаратные платформы почти полностью готовы к запуску, и вы можете концентрировать усилия на разработке целевых программ.

Если вы используете BIOS или ROM-монитор сторонней компании, вам необходимо написать программу, которая запускает операционную систему. Фактически вы выполняете «горячий запуск» системы (см. далее в этой статье), поскольку ее компоненты уже настроены и инициализированы.

При написании собственного IPL вы выполняете «холодный запуск» системы (см. далее в этой статье) и все действия по инициализации и настройке ее аппаратуры.

Выбор файловой системы

После выбора способа загрузки встраиваемой системы необходимо определить конфигурацию ее запоминающих устройств:

fs_choose_flow.png
Рисунок 2. Система может использовать запоминающие устройства различных типов

Система без дополнительных запоминающих устройств

Если после запуска в системе не используются дополнительные запоминающие устройства для доступа к файлам, нет необходимости выбирать файловые системы.

Дополнительные запоминающие read-only устройства

Если системе требуется только считывать файлы, ЗОСРВ «Нейтрино» обеспечивает все необходимые функции. Чтобы считывать и запускать файлы, достаточно поместить их непосредственно в образ, поскольку операционная система имеет доступ к его содержимому (см. Создание загрузочного образа).

Дополнительные непостоянные запоминающие read/write устройства

ЗОСРВ «Нейтрино» позволяет записывать временные файлы, журналы и другую информацию, которую не требуется сохранять при перезагрузке системы, на диск в ОЗУ без написания дополнительного кода и использования драйверов. Диск в ОЗУ обслуживается менеджером процессов, и пользователю достаточно создать ссылку на него с помощью команды ln.

Например, чтобы смонтировать каталог /tmp в качестве диска в ОЗУ, следует ввести команду:

ln -Ps /dev/shmem /tmp

или поместить в файл построения загрузочного образа (который рассматривается в следующих статьях настоящего руководства) команду:

[type=link] /tmp=/dev/shmem

Эти команды указывают менеджеру процессов принимать запросы ко всем файлам, которые находятся в каталоге /tmp, и перенаправлять их подсистеме общей памяти. Например, путь /tmp/AAA4533.tmp соответствует файлу /dev/shmem/AAA4533.tmp.


Note: Для минимизации объема кода файловой системы в ОЗУ менеджер процессов не поддерживает функции «больших» файловых систем, такие как блокирование файлов и создание каталогов.

Если разработчику требуется файловая POSIX-система в ОЗУ с расширенным набором функций, можно воспользоваться драйвером devf-ram или встроенным виртуальным диском в io-blk.so.


Дополнительные постоянные запоминающие read/write устройства

Если требуется сохранять данные при сбоях питания и перезагрузках системы, следует использовать постоянное запоминающее устройство, которое управляется драйвером. ЗОСРВ «Нейтрино» включает в себя следующие виды файловых систем:

Все перечисленные файловые системы работают под управлением драйверов. Статья Примеры компоновки загрузочных образов содержит подробные примеры настройки драйверов файловых систем.

Накопители флеш-памяти и их файловые системы

Драйвер флеш-памяти обеспечивает доступ к устройствам различных типов (обычным и с загрузочным блоком) с любыми сочетаниями ширины шины (8, 16, 32 бита) и коэффициента чередования (1, 2 и 4).

Чтобы узнать, какие устройства флеш-памяти поддерживаются на текущий момент, обратитесь к следующим источникам:

С помощью исходного кода можно при необходимости адаптировать наши файловые системы (например, devf-generic) к конкретной встраиваемой системе.

Ротация накопителей и файловых систем

На текущий момент ЗОСРВ «Нейтрино» поддерживает ряд файловых систем, в том числе DOS, Linux, HFS и HFS+, Windows NT, QNX4, Power-Safe, Universal Disk Format (UDF) и др. Подробности см. в описаниях драйверов файловых систем fs-*.

Имеются драйверы для широкого спектра блочных устройств. Актуальную информацию см. в описаниях драйверов блочных устройств devb-*.

Сетевые накопители и их файловые системы

В процессе разработки и в распределенных системах сбора данных желательно иметь доступ к файлам, которые находятся на удаленных компьютерах. Такую возможность предоставляет сетевая файловая система.

ЗОСРВ «Нейтрино» не только включает в себя технологию прозрачной распределенной обработки Qnet, но и поддерживает сетевые файловые системы CIFS (SMB), NFSv2 и NFSv3.


Caution: По возможности следует использовать драйвер fs-nfs3 вместо fs-nfs2.

Имеются драйверы для различных контроллеров Ethernet. Актуальную информацию см. в описаниях сетевых драйверов devn-* и devnp-*.

Устройства ввода/вывода

Встраиваемая система на основе ЗОСРВ «Нейтрино» взаимодействует с внешней средой с помощью следующих интерфейсов:

Символьные устройства ввода/вывода

ЗОСРВ «Нейтрино» поддерживает различные стандартные последовательные порты (семейство 8250, Signetics и др.) Подробнее см. в описаниях драйверов символьных устройств devc-*.

Специализированные/нестандартные устройства

Если не удается найти готовые драйверы для оборудования встраиваемой системы, необходимо разрабатывать их самостоятельно. Решение этой задачи описано в руководстве Разработка менеджеров ресурсов.

Начало работы

Трудоемкость разработки целевой системы в значительной степени зависит от ее специфики. Мы рекомендуем всегда начинать разработку на поддерживаемой отладочной плате, чтобы минимизировать объем начальной низкоуровневой работы и концентрироваться на системных задачах, а не на нюансах реализации.

Следует использовать отладочную плату, которая максимально схожа с целевой платформой; существует широкий спектр отладочных платформ, совместимых с ЗОСРВ «Нейтрино», от различных производителей.

После освоения комплекта разработчика и создания прототипа встраиваемой системы можно приступать к созданию нестандартных устройств, написанию IPL, кода запуска, драйверов и других компонентов.

С помощью прототипа необходимо получить ответы на следующие вопросы:

Полученная информация используется для планирования дальнейшей разработки.

Разработка оборудования

Существуют различные подходы к разработке оборудования. Мы исследовали множество плат, которые применяются в полевых условиях, и опубликовали полученные результаты в статье Рекомендации по проектированию. Мы рекомендуем ознакомиться с этим приложением перед началом разработки для сокращения трудовых и финансовых затрат.

Модификация программного обеспечения

В идеале целевая система не отличается от отладочной, но в действительности разработчику обычно требуется вносить изменения в некоторые компоненты целевой системы.

Для этого мы предоставляем исходный код многих компонентов ЗОСРВ «Нейтрино». Структура каталогов с исходным кодом показана на следующей схеме.

Три основных ветви исходного кода ЗОСРВ «Нейтрино»:

BSP/ `--> src/ `--> hardware/ |--> ipl/ |--> startup/ `--> flash/

Исходный код разделён на три ветви: ipl, startup и flash. Каждая ветвь включает в себя подкаталоги. Полная структура каталогов ЗОСРВ «Нейтрино»:

BSP/ `--> src/ `--> hardware/ |--> ipl/ | |--> boards/ | | |--> xzynq/ | | `--> ... | | | `--> lib/ | |--> startup/ | |--> boards/ | | |--> xzynq/ | | `--> ... | | | `--> lib/ | `--> flash/ |--> boards/ | |--> qspi-xzynq/ | `--> ... | `--> mtd-flash/

Модификация исходного кода

В следующей таблице показано соответствие ветвей исходного кода и глав этой книги:

Ветвь исходного кода Статья
ipl Руководство по разработке начального загрузчика (IPL)
startup Руководство по разработке модуля startup

Подробное описание формата файла Makefile, который присутствует в этих каталогах, см. в разделе Рекурсивная сборочная подсистема ЗОСРВ "Нейтрино".




Предыдущий раздел: перейти