Содержание
Сущность 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-описании
Ключ |
Обязательный |
Описание |
---|---|---|
|
Да |
Имя сущности |
|
Нет |
Идентификатор сущности, который по умолчанию совпадает с именем сущности. У каждой сущности должен быть уникальный идентификатор. Можно запустить несколько сущностей с одним именем, но разными идентификаторами. |
|
Нет |
Имя исполняемого файла в ROMFS (в образе решения), из которого будет запущена сущность. По умолчанию сущность будет запущена из файла в ROMFS с именем, совпадающим с кратким именем сущности. Например, сущности Можно запустить несколько сущностей с одним именем из разных исполняемых файлов. При этом идентификаторы этих сущностей должны быть разными. |
|
Нет |
Ключ словаря, содержащего список словарей IPC-каналов сущности. Этот список задает статически создаваемые IPC-каналы, клиентскими дескрипторами которых будет владеть сущность. По умолчанию список пуст. (Помимо статически создаваемых IPC-каналов, сущности могут использовать динамически создаваемые IPC-каналы.) |
Ключи словаря IPC-каналов сущности приведены в таблице ниже.
Ключи словаря IPC-каналов сущности в init-описании
Ключ |
Обязательный |
Описание |
---|---|---|
|
Да |
Идентификатор IPC-канала, который может быть задан как конкретным значением, так и ссылкой вида
У каждого IPC-канала должен быть уникальный идентификатор. (Идентификатор IPC-канала используется сущностями, чтобы получить IPC-дескриптор.) |
|
Да |
Идентификатор сущности, которая будет владеть серверным дескриптором 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