Взаимодействие сущностей (IPC)
В KasperskyOS есть только один способ взаимодействия сущностей – с помощью синхронного обмена IPC-сообщениями: запросом и ответом. В каждом взаимодействии выделяются две роли: клиент (сущность, инициирующая взаимодействие) и сервер (сущность, обрабатывающая обращение). При этом сущность, являющаяся клиентом в одном взаимодействии, может выступать как сервер в другом.
Клиент и сервер используют три системных вызова: Call()
, Recv()
и Reply()
:
- Клиент направляет серверу сообщение-запрос. Для этого один из потоков исполнения клиента выполняет вызов
Call()
и блокируется до получения ответа от сервера или ядра (например, в случае ошибки). - Серверный поток, выполнивший вызов
Recv()
, находится в ожидании сообщений. При получении запроса этот поток разблокируется, обрабатывает запрос и отправляет сообщение-ответ с помощью вызоваReply()
. - При получении сообщения-ответа (или ошибки) клиентский поток разблокируется и продолжает исполнение.
Таким образом, ядро KasperskyOS является ядром разделения в терминах модели MILS, поскольку все взаимодействия сущностей проходят через него.
Обмен сообщениями как вызов метода
Отправка IPC-запроса сущности-серверу представляет собой обращение к одному из интерфейсов, реализуемых сервером. IPC-запрос содержит входные аргументы вызываемого метода, а также идентификатор реализации интерфейса (RIID
) и идентификатор вызываемого метода (MID
). Получив запрос, сущность-сервер использует эти идентификаторы, чтобы найти реализацию метода. Сервер вызывает реализацию метода, передав в нее входные аргументы из IPC-запроса. Обработав запрос, сущность-сервер отправляет клиенту ответ, содержащий выходные аргументы метода.
Модуль безопасности Kaspersky Security Module может анализировать все компоненты IPC-сообщения, чтобы вынести решение, соответствует ли это сообщение политике безопасности системы.
IPC‑каналы
Чтобы две сущности могли обмениваться сообщениями, между ними должен быть установлен IPC-канал (далее также канал или соединение). Канал задает роли сущностей, т.е. имеет "клиентскую" и "серверную" стороны. При этом одна сущность может иметь несколько каналов, в которых она является клиентом, и несколько каналов, где она – сервер.
В KasperskyOS предусмотрено два способа создания IPC-каналов:
- Статический способ предполагает создание канала в момент запуска сущностей (при старте решения). Статическое создание каналов выполняется инициализирующей сущностью Einit.
- Динамический способ позволяет уже запущенным сущностям установить канал между собой.