Инструменты 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
:
Подробнее о фиксированной части и арене см. "Структура 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
:
Подробнее см. "Локатор сервисов (Service Locator)".