Обзор: Einit и init.yaml

Инициализирующая программа Einit

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

Процесс инициализирующей программы имеет класс Einit.

В составе KasperskyOS SDK поставляется утилита einit, которая позволяет генерировать исходный код инициализирующей программы на языке C. Эта утилита используется системой сборки CMake, которая также обеспечивает компиляцию файла einit.c в исполняемый файл Einit и включение этого исполняемого файла в образ решения.

Для инициализирующей программы не требуется самостоятельно создавать файлы формальной спецификации. Эти файлы автоматически создаются и применяются при сборке решения. Однако класс процесса Einit должен быть указан в описании политики безопасности решения.

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

Init-описание (init.yaml)

Init-описание содержит данные в формате YAML, которые идентифицируют:

Эти данные представляют собой словарь с ключом entities, содержащий список словарей процессов (см. "Примеры init-описаний"). Ключи словаря процесса приведены в таблице ниже.

Можно создать init-описание вручную или автоматизированно. Во втором случае нужно подготовить шаблон init.yaml.in, из которого система сборки создаст init-описание.

Ключи словаря процесса в init-описании

Ключ

Обязательный

Значение

name

Да

Имя класса процесса (из EDL-описания).

task

Нет

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

Можно запустить несколько процессов одного класса, но с разными именами.

path

Нет

Имя исполняемого файла в ROMFS (в образе решения). Если его не указать, то будет взято имя класса процесса без префиксов и точек. Например, процессы классов Client и net.Client, для которых не указано имя исполняемого файла, будут запущены из файла Client.

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

connections

Нет

Список словарей IPC-каналов процесса. Этот список задает статически создаваемые IPC-каналы, клиентскими IPC-дескрипторами которых будет владеть процесс. По умолчанию этот список пуст. (Помимо статически создаваемых IPC-каналов процессы могут использовать динамически создаваемые IPC-каналы.)

args

Нет

Список параметров запуска программы (параметры функции main()). Максимальный размер одного элемента списка составляет 1024 байта.

env

Нет

Словарь переменных окружения программы. Ключами в этом словаре являются имена переменных окружения. Максимальный размер значения переменной окружения составляет 65524 байта.

before

Нет

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

after

Нет

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

wait_for

Нет

Признак, по которому определяется, что процесс успешно запущен.

Варианты синтаксиса:

wait_for: <event_name>

или

wait_for:

event: <event_name>

timeout: <timeout_value><timeout_suffix>

или

wait_for: { event: <event_name>, timeout: <timeout_value><timeout_suffix> }

Параметр <event_name> может принимать следующие значения:

  • start – дождаться старта функции main().
  • ready – дождаться сигнала em_notify_ready() из запущенного процесса. Функция объявлена в заголовочном файле sysroot-*-kos/include/em_transport/em_transport.h.
  • exit_success – дождаться успешного завершения процесса.

Параметр <timeout_value> – целое число, время ожидания признака успешного запуска процесса. Значение по умолчанию: 3 минуты.

Параметр <timeout_suffix> указывается без пробела после параметра <timeout_value> и может принимать следующие значения:

  • ms, msec – миллисекунды;
  • s, sec – секунды;
  • m, min – минуты.

Примеры использования:

wait_for: ready

wait_for: { event: ready, timeout: 100ms }

wait_for:

event: ready

timeout: 100ms

Подробнее см. "Примеры init-описаний".

Ключи словаря IPC-канала процесса приведены в таблице ниже.

Ключи словаря IPC-канала в init-описании

Ключ

Обязательный

Значение

id

Да

Имя IPC-канала, которое может быть задано как фиксированными значением, так и ссылкой вида

{var: <имя константы>, include: <путь к заголовочному файлу>}.

target

Да

Имя процесса, который будет владеть серверным дескриптором IPC-канала.

Init-описание может также содержать ключ mount_romfs, который определяет имя точки монтирования дополнительной файловой системы romfs.1 перед запуском процессов. Это позволяет запускать процессы из бинарных файлов, расположенных на файловой системе romfs.1. Файловая система romfs.1 будет отмонтирована после завершения процесса Einit. Пример использования:

mount_romfs:

"romfs.1": "romfs/1"

В начало