KasperskyOS Community Edition 1.0

Инструменты IPC-транспорта

Чтобы организовать взаимодействие сущностей, не требуется "с нуля" реализовывать корректную упаковку и распаковку сообщений. Кроме того, не обязательно писать отдельный код для создания IPC-каналов.

Для решения этих и других проблем организации IPC-транспорта в KasperskyOS есть специальный набор инструментов:

  • Транспорт NkKosTransport
  • EDL-, CDL- и IDL-описания
  • Компилятор NK
  • Init-описание и утилита einit
  • Локатор сервисов (Service Locator)

Совместное использование этих инструментов показано в примере echo.

Транспорт NkKosTransport

Транспорт NkKosTransport является удобной надстройкой над системными вызовами Call, Recv и Reply. Он позволяет работать отдельно с фиксированной частью и ареной сообщений.

Для вызова транспорта используются функции nk_transport_call(), nk_transport_recv() и nk_transport_reply().

Пример:

/* Функция nk_transport_recv () выполняет системный вызов Recv.

* Полученный от клиента запрос помещается в req (фиксированная часть ответа) и

* req_arena (арена ответа). */

nk_transport_recv(&transport.base, (struct nk_message *)&req, &req_arena);

Структура NkKosTransport и методы работы с ней объявлены в файле transport-kos.h:

#include <coresrv/nk/transport-kos.h>

Подробнее о фиксированной части и арене см. "Структура IPC-сообщения".

Подробнее об использовании NkKosTransport см. "Транспорт NkKosTransport".

EDL-, CDL- и IDL-описания

Для описания интерфейсов, которые реализуют серверные сущности, используются языки EDL, CDL и IDL.

Подробнее см. "Описание сущностей, компонентов и интерфейсов (EDL, CDL, IDL)".

Файлы описаний (*.edl, *.cdl и *.idl) при сборке обрабатываются компилятором NK. В результате создаются файлы *.edl.h, *.cdl.h, и *.idl.h, содержащие транспортные методы и типы, используемые как на клиенте, так и на сервере.

Компилятор NK

На основе EDL-, CDL- и IDL-описаний компилятор NK (nk-gen-c) генерирует набор транспортных методов и типов. Транспортные методы и типы нужны для формирования, отправки, приема и обработки IPC-сообщений

Важнейшие транспортные методы:

  • Интерфейсные методы. При вызове на клиенте интерфейсного метода серверу отправляется IPC-запрос для вызова соответствующего метода.
  • Dispatch-методы (диспетчеры). При получении запроса сервер вызывает диспетчер, который в свою очередь вызывает реализацию соответствующего метода.

Важнейшие транспортные типы:

  • Типы, определяющие структуру фиксированной части сообщения. Передаются в интерфейсные методы, диспетчеры и функции транспорта (nk_transport_recv(), nk_transport_reply()).
  • Типы прокси-объектов. Прокси-объект используется как аргумент интерфейсного метода.

Подробнее см. "Сгенерированные методы и типы".

Init-описание и утилита einit

Утилита einit позволяет автоматизировать создание кода инициализирующей сущности Einit. Эта сущность первой запускается при загрузке KasperskyOS и запускает остальные сущности, а также создает каналы (соединения) между ними.

Чтобы сущность Einit при запуске создала соединение между сущностями A и B, в файле init.yaml нужно указать:

init.yaml

# Запустить B

- name: B

# Запустить A

- name: A

  connections:

  # Создать соединение с серверной сущностью B.

  - target: B

  # Имя нового соединения: some_connection_to_B

    id: some_connection_to_B

Подробнее см. "Запуск сущностей".

Локатор сервисов (Service Locator)

Локатор сервисов – библиотека, содержащая следующие функции:

  • ServiceLocatorConnect() – позволяет узнать клиентский IPC-дескриптор канала с указанным именем.
  • ServiceLocatorRegister() – позволяет узнать серверный IPC-дескриптор канала с указанным именем.
  • ServiceLocatorGetRiid() – позволяет узнать RIID (порядковый номер реализации интерфейса) по имени реализации интерфейса.

Значения IPC-дескриптора и RIID используются при инициализации транспорта NkKosTransport.

Чтобы использовать локатор сервисов, нужно в коде сущности подключить файл sl_api.h:

#include <coresrv/sl/sl_api.h>

Подробнее см. "Локатор сервисов (Service Locator)".