KasperskyOS Community Edition 1.0

Запуск сущностей

В этом разделе справки

Сущность Einit

Файл init.yaml

В начало

Сущность Einit

Одной из важнейших сущностей в KasperskyOS является сущность c именем Einit, которая первой запускается ядром операционной системы при загрузке образа. В большинстве решений на базе KasperskyOS сущность Einit запускает все остальные сущности, входящие в решение, то есть служит инициализирующей сущностью.

В составе пакета инструментов KasperskyOS Community Edition поставляется утилита einit, которая позволяет сгенерировать код сущности Einit на языке C на основе файла init.yaml (так называемого init-описания). Сущность Einit, созданная с помощью скрипта einit, выполняет следующие инициализирующие функции:

  • создает все сущности, входящие в решение;
  • создает необходимые соединения (IPC-каналы) между сущностями;
  • копирует в окружение каждой сущности информацию о ее соединениях;
  • запускает сущности.

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

Для сущности Einit не требуется создавать файлы статических описаний. Эти файлы поставляются в составе пакета инструментов KasperskyOS Community Edition и автоматически подключаются при сборке решения. При этом сущность Einit должна быть описана в файле security.psl.

В начало

Файл init.yaml

Файл init.yaml (init-описание) используется утилитой einit для генерации исходного кода инициализирующей сущности Einit. Этот файл содержит данные в формате YAML, которые идентифицируют:

  • сущности, запускаемые при загрузке KasperskyOS;
  • IPC-каналы, используемые сущностями для взаимодействия между собой.

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

Ключи словаря сущности в init-описании

Ключ

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

Описание

name

Да

Имя сущности

task

Нет

Идентификатор сущности, который по умолчанию совпадает с именем сущности. У каждой сущности должен быть уникальный идентификатор.

Можно запустить несколько сущностей с одним именем, но разными идентификаторами.

path

Нет

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

Можно запустить несколько сущностей с одним именем из разных исполняемых файлов. При этом идентификаторы этих сущностей должны быть разными.

connections

Нет

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

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

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

Ключ

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

Описание

id

Да

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

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

У каждого IPC-канала должен быть уникальный идентификатор.

(Идентификатор IPC-канала используется сущностями, чтобы получить IPC-дескриптор.)

target

Да

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

Примеры init-описаний

В приведенных примерах файл с init-описанием называется init.yaml, хотя может иметь любое имя.

init.yaml

# init-описание решения, содержащего сущность-клиент и сущность-сервер

entities:

# Сущность Client будет отправлять запросы сущности Server.

- name: Client

connections:

# Идентификатор сущности-сервера, которой сущность Client будет

# отправлять запросы

- target: Server

# Идентификатор IPC-канала для обмена IPC-сообщениями

# между сущностями

id: server_connection

# Сущность Server будет выступать в роли сервера

# (будет отвечать на запросы сущности Client).

- name: Server

init.yaml

# init-описание, где идентификатор IPC-канала задан ссылкой

entities:

- name: Client

connections:

- target: Server

# Идентификатор IPC-канала содержится в константе SERVER_CONN

# в файле src/example.h

id: {var: SERVER_CONN, include: src/example.h}

- name: Server

init.yaml

# init-описание, где заданы имена исполняемых файлов, из

# которых будут запущены сущности Client, ClientServer и

# MainServer

entities:

- name: Client

path: cl

connections:

- target: ClientServer

id: server_connection_cs

- name: ClientServer

path: csr

connections:

- target: MainServer

id: server_connection_ms

- name: MainServer

path: msr

init.yaml

# init-описание, при котором сущности MainServer и BkServer

# будут запущены из одного исполняемого файла

entities:

- name: Client

connections:

- id: server_connection_ms

target: MainServer

- id: server_connection_bs

target: BkServer

- name: MainServer

path: srv

- name: BkServer

path: srv

init.yaml

# init-описание, при котором будут запущены две сущности

# Server с разными идентификаторами из одного исполняемого

# файла

entities:

- name: Client

connections:

- id: server_connection_us

# Идентификатор сущности-сервера

target: UserServer

- id: server_connection_ps

# Идентификатор сущности-сервера

target: PrivilegedServer

- task: UserServer

name: Server

- task: PrivilegedServer

name: Server

В начало