Пример включения в решение системной программы Klog

Исходный код программы

einit/src/klog_entity.c

#include <klog/system_audit.h>

#include <klog_storage/client.h>

#include <ping/KlogEntity.edl.h>

int main(int argc, char *argv[])

{

/* В результате вызова этой функции будет создан поток исполнения,

* который получает данные аудита от ядра, декодирует их и передает

* через IPC программе KlogStorage.

* (Константа ping_KlogEntity_klog_audit_iid определена в заголовочном

* файле KlogEntity.edl.h, который содержит автоматически сгенерированный

* транспортный код.) */

return klog_system_audit_run(KLOG_SERVER_CONNECTION_ID ":

" KLOG_STORAGE_SERVER_CONNECTION_ID,

ping_KlogEntity_klog_audit_iid);

}

Сборка программы

einit/CMakeLists.txt

...

# Импорт библиотек Klog из состава

# KasperskyOS SDK

find_package (klog REQUIRED)

include_directories (${klog_INCLUDE})

# Генерация транспортного кода на основе формальной спецификации

# программы Klog

nk_build_edl_files (klog_edl_files

NK_MODULE "ping"

# Файл KlogEntity.edl и другие файлы

# формальной спецификации программы Klog

# поставляются в составе KasperskyOS SDK.

EDL "${RESOURCES}/edl/KlogEntity.edl")

# Создание исполняемого файла программы Klog для аппаратной платформы

add_executable (KlogEntityHw "src/klog_entity.c")

target_link_libraries (KlogEntityHw ${klog_SYSTEM_AUDIT_LIB})

add_dependencies (KlogEntityHw klog_edl_files)

# Создание исполняемого файла программы Klog для QEMU.

# (Идентично созданию исполняемого файла программы Klog для

# аппаратной платформы, за исключением имени цели сборки.

# Требуется две цели сборки исполняемого файла программы

# Klog с разными именами, поскольку в параметре KLOG_ENTITY

# CMake-команд build_kos_hw_image() и build_kos_qemu_image()

# нужно указать разные цели сборки.)

add_executable (KlogEntityQemu "src/klog_entity.c")

target_link_libraries (KlogEntityQemu ${klog_SYSTEM_AUDIT_LIB})

add_dependencies (KlogEntityQemu klog_edl_files)

# Программу Klog не нужно указывать вместе с другими программами

# для включения в образ решения. Чтобы включить программу Klog

# в решение, нужно задать имя цели сборки исполняемого файла этой

# программы через параметр KLOG_ENTITY CMake-команд

# build_kos_hw_image() и build_kos_qemu_image().

set (ENTITIES Client Server KlogStorageEntity FileVfs)

...

# Переменная INIT_KlogEntity_PATH используется в файле init.yaml.in,

# чтобы задать имя исполняемого файла программы Klog. (Исполняемые

# файлы программы Klog для QEMU и для аппаратной платформы имеют

# разные имена, которые по умолчанию совпадают с именами целей сборки

# этих файлов.)

set (INIT_KlogEntity_PATH "KlogEntityHw")

# Нужно задать параметр KLOG_ENTITY

build_kos_hw_image (kos-image

EINIT_ENTITY EinitHw

...

KLOG_ENTITY KlogEntityHw

IMAGE_FILES ${ENTITIES})

# Переменная INIT_KlogEntity_PATH используется в файле init.yaml.in,

# чтобы задать имя исполняемого файла программы Klog. (Исполняемые

# файлы программы Klog для QEMU и для аппаратной платформы имеют

# разные имена, которые по умолчанию совпадают с именами целей сборки

# этих файлов.)

set (INIT_KlogEntity_PATH "KlogEntityQemu")

# Нужно задать параметр KLOG_ENTITY

build_kos_qemu_image (kos-qemu-image

EINIT_ENTITY EinitQemu

...

KLOG_ENTITY KlogEntityQemu

IMAGE_FILES ${ENTITIES})

Словарь процесса программы в шаблоне init-описания

einit/src/init.yaml.in

...

- name: ping.KlogEntity

# Переменная INIT_KlogEntity_PATH определена в файле einit/CMakeLists.txt.

path: @INIT_KlogEntity_PATH@

connections:

- target: ping.KlogStorageEntity

id: {var: KLOG_STORAGE_SERVER_CONNECTION_ID, include: klog_storage/client.h}

...

Описание политики для программы

einit/src/security.psl.in

...

use nk.base._

...

use EDL kl.core.Core

...

use EDL ping.KlogEntity

use EDL ping.KlogStorageEntity

...

use audit_profile._

use core._

...

/* Взаимодействие с программой KlogStorage */

request dst=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match src=ping.KlogEntity { grant () }

}

}

}

response src=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match dst=ping.KlogEntity { grant () }

}

}

}

error src=ping.KlogStorageEntity {

match endpoint=klogStorage.storage {

match method=write {

match dst=ping.KlogEntity { grant () }

}

}

}

...

einit/src/core.psl

...

/* Взаимодействие с ядром */

request dst=kl.core.Core {

match endpoint=sync.Sync {

match method=Wake {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Wait {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=task.Task {

match method=FreeSelfEnv {

...

match src=ping.KlogEntity { grant () }

...

}

match method=GetPath {

...

match src=ping.KlogEntity { grant () }

...

}

match method=GetName {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Exit {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=vmm.VMM {

match method=Allocate {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Commit {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Protect {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Free {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=thread.Thread {

match method=SetTls {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Create {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Resume {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Attach {

...

match src=ping.KlogEntity { grant () }

...

}

match method=Exit {

...

match src=ping.KlogEntity { grant () }

...

}

match method=GetSchedPolicy {

...

match src=ping.KlogEntity { grant () }

...

}

match method=SetSchedPolicy {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=hal.HAL {

match method=GetEntropy {

...

match src=ping.KlogEntity { grant () }

...

}

match method=DebugWrite {

...

match src=ping.KlogEntity { grant () }

...

}

match method=GetEnv {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=handle.Handle {

match method=Close {

...

match src=ping.KlogEntity { grant () }

...

}

}

match endpoint=audit.Audit {

match src=ping.KlogEntity { grant () }

}

}

response src=kl.core.Core {

...

match dst=ping.KlogEntity { grant () }

...

}

error src=kl.core.Core {

...

match dst=ping.KlogEntity { grant () }

...

}

...

В начало