KasperskyOS Community Edition 1.1

Сборка решения на базе KasperskyOS

Этот раздел содержит следующие сведения:

  • описание процесса сборки решения на базе KasperskyOS;
  • описания скриптов, библиотек и шаблонов сборки, поставляемых в KasperskyOS Community Edition.

В этом разделе

Сборка образа решения

Общая схема сборки

Использование CMake из состава KasperskyOS Community Edition

Библиотеки CMake в составе KasperskyOS Community Edition

Сборка без использования CMake

Создание загрузочного носителя с образом решения

В начало
[Topic cmake_build_solution]

Сборка образа решения

Решение на базе KasperskyOS – системное ПО (включая ядро KasperskyOS и модуль безопасности Kaspersky Security Module) и прикладное ПО, интегрированные для работы в составе программно-аппаратного комплекса.

Подробнее см. "Структура и запуск образа решения".

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

Программы по назначению делятся на два типа:

  • Системные программы создают инфраструктуру для прикладных программ, например: обеспечивают работу с аппаратурой, поддерживают механизм IPC, реализуют файловые системы и сетевые протоколы. Системные программы поставляются в составе KasperskyOS Community Edition. При необходимости, вы можете разрабатывать собственные системные программы.
  • Прикладные программы предназначены для взаимодействия с пользователем решения и решения его задач. Прикладные программы отсутствуют в составе KasperskyOS Community Edition.

Сборка программ в процессе сборки решения

При сборке решения программы делятся на два типа:

  • Системные программы, поставляемые в составе KasperskyOS Community Edition в виде исполняемых файлов;
  • Системные или прикладные программы, требующие компоновки в исполняемый файл.

При этом программы, требующие компоновки, делятся на следующие типы:

  • Системные программы, реализующие IPC-интерфейс, для которого в составе KasperskyOS Community Edition поставляются готовые транспортные библиотеки.
  • Прикладные программы, реализующие собственный IPC-интерфейс. Для их сборки необходимо генерировать транспортные методы и типы с помощью компилятора NK.
  • Клиентские программы, не предоставляющие служб.

Сборка образа решения

В составе KasperskyOS Community Edition поставляются образ ядра KasperskyOS, а также исполняемые файлы некоторых системных программ и программ-драйверов, готовые к использованию в решении.

Специальная программа Einit, предназначенная для запуска всех остальных программ, а также модуль безопасности Kaspersky Security Module собираются под каждое конкретное решение и не поставляются в составе KasperskyOS Community Edition. Вместо этого в тулчейн KasperskyOS Community Edition включены утилиты для их сборки.

Общая пошаговая схема сборки описана в статье "Общая схема сборки". Сборку образа решения можно осуществлять:

В начало
[Topic cmake_solution_image]

Общая схема сборки

Для того чтобы собрать образ решения, необходимо выполнить следующие действия:

  1. Подготовить EDL-, CDL- и IDL-описания прикладных программ, а также файл init-описания (по умолчанию init.yaml) и файлы с описанием политики безопасности решения (по умолчанию security.psl).

    При сборке с CMake EDL-описание можно генерировать используя команду generate_edl_file().

  2. Для всех программ, кроме системных программ, поставляемых в составе KasperskyOS Community Edition, сгенерировать файлы *.edl.h.
  3. Для программ, реализующих собственный IPC-интерфейс, сгенерировать код транспортных методов и типов, используемых для формирования, отправки, приема и обработки IPC-сообщений.
  4. Собрать все программы, входящие в решение, при необходимости скомпоновав их с транспортными библиотеками системных или прикладных программ. Для сборки прикладных программ, реализующих собственный IPC-интерфейс, потребуются сгенерированный на шаге 3 код, содержащий транспортные методы и типы.
    • При сборке с CMake для этого используются стандартные команды сборки. Необходимые настройки кросс-компиляции производятся автоматически.
    • При сборке без CMake для этого необходимо вручную использовать кросс-компиляторы, входящие в состав KasperskyOS Community Edition.
  5. Собрать инициализирующую программу Einit.
    • При сборке с CMake программа Einit собирается в процессе сборки образа решения командами build_kos_qemu_image() и build_kos_hw_image().
    • При сборке без CMake для генерации кода программы Einit необходимо использовать утилиту einit. Программу Einit затем необходимо собрать с помощью кросс-компилятора, поставляемого в KasperskyOS Community Edition.
  6. Собрать модуль Kaspersky Security Module.
  7. Создать образ решения.

Пример 1

Для простейшего примера hello, входящего в состав KasperskyOS Community Edition, в котором содержится одна прикладная программа, не предоставляющая служб, схема сборки выглядит следующим образом:

Пример 2

Пример echo, входящий в состав KasperskyOS Community Edition, описывает простейший случай взаимодействия двух программ с помощью механизма IPC. Чтобы организовать такое взаимодействие, потребуется реализовать на сервере интерфейс с методом Ping и "поместить" службу Ping в новый компонент (например, Ping), а экземпляр этого компонента – в EDL-описание программы Server.

В случае наличия в решении программ, использующих механизм IPC, схема сборки выглядит следующим образом:

В начало
[Topic cmake_common_build_scheme]

Использование CMake из состава KasperskyOS Community Edition

Для автоматизации процесса подготовки образа решения нужно настроить систему сборки CMake. За основу можно взять параметры системы сборки, используемые в примерах из состава KasperskyOS Community Edition.

В файлах CMakeLists.txt используется стандартный синтаксис CMake, а также команды и макросы из библиотек, поставляемых в KasperskyOS Community Edition.

Рекомендованная структура директорий проекта

При создании решения на базе KasperskyOS для упрощения использования скриптов CMake рекомендуется использовать следующую структуру директорий в проекте:

  • В корне проекта создать корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
  • Исходный код каждой из разрабатываемых программ следует разместить в отдельной директории, в поддиректории src.
  • Создать файлы CMakeLists.txt для сборки каждой прикладной программы в соответствующих директориях.
  • Для генерации исходного кода программы Einit следует создать отдельную директорию einit, содержащую поддиректорию src, в которую следует поместить шаблоны init.yaml.in и security.psl.in.

    Также в эту директорию можно поместить любые другие файлы, которые необходимо включить в образ решения.

  • Создать файл CMakeLists.txt для сборки программы Einit в директории einit.
  • Файлы EDL-, CDL- и IDL-описаний следует разместить в директории resources в корне проекта.
  • [Опционально] Создать скрипт сборки cross-build.sh, содержащий команды для запуска генерации файлов сборки (команда cmake), сборки решения (команда make), а также запуска решения.

Пример структуры директорий проекта

example$ tree

.

├── CMakeLists.txt

├── cross-build.sh

├── hello

│ ├── CMakeLists.txt

│ ├── src

│ │ ├── hello.c

├── einit

│ ├── CMakeLists.txt

│ ├── src

│ │ ├── init.yaml.in

│ │ ├── security.psl.in

│ │ ├── fstab

├── resources

│ ├── Hello.idl

│ ├── Hello.cdl

│ ├── Hello.edl

Сборка проекта

Для подготовки к сборке с помощью системы сборки CMake необходимо:

  1. Подготовить корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
  2. Подготовить файлы CMakeLists.txt для каждой собираемой прикладной программы.
  3. Подготовить файл CMakeLists.txt для программы Einit.
  4. Подготовить шаблоны init.yaml.in и security.psl.in.

Для выполнения кросс-компиляции с помощью системы автоматизации сборки CMake необходимо:

  1. Создать поддиректорию для сборки.

    BUILD=$PWD/.build

    mkdir -p $BUILD && cd $BUILD

  2. Перед запуском генерации скриптов сборки (команда cmake) установить следующие значения переменных окружения:
    • export LANG=C
    • export PKG_CONFIG=""
    • export SDK_PREFIX="/opt/KasperskyOS-Community-Edition-<version>"
    • export PATH="$SDK_PREFIX/toolchain/bin:$PATH"
    • export INSTALL_PREFIX=$BUILD/../install
    • export TARGET="aarch64-kos"
  3. При запуске генерации скриптов сборки (команда cmake) указать:
    • параметр -G "Unix Makefiles"
    • путь к файлу расширения системы сборки (toolchain.cmake) в переменной CMAKE_TOOLCHAIN_FILE.

      Файл расширения системы сборки расположен в следующей директории: /opt/KasperskyOS-Community-Edition-<version>/toolchain/share/toolchain-aarch64-kos.cmake

    • значение переменной CMAKE_BUILD_TYPE:STRING=Debug
    • значение переменной CMAKE_INSTALL_PREFIX:STRING=$INSTALL_PREFIX
    • путь к корневому файлу CMakeLists.txt
  4. При запуске сборки (команда make) указать одну из целей сборки.

    Имя цели должно совпадать с именем цели сборки, переданным в команду сборки решения в файле CMakeLists.txt для программы Einit.

Пример скрипта сборки cross-build.sh

cross-build.sh

#!/bin/bash

# Создаем поддиректорию для сборки

BUILD=$PWD/.build

mkdir -p $BUILD && cd $BUILD

# Устанавливаем значения переменных окружения

export LANG=C

export PKG_CONFIG=""

export SDK_PREFIX="/opt/KasperskyOS-Community-Edition-<version>"

export PATH="$SDK_PREFIX/toolchain/bin:$PATH"

export INSTALL_PREFIX=$BUILD/../install

export TARGET="aarch64-kos"

# Запускаем генерацию файлов для сборки. Так как текущая директория это $BUILD,

# корневой файл CMakeLists.txt находится в родительской директории

cmake -G "Unix Makefiles" \

-D CMAKE_BUILD_TYPE:STRING=Debug \

-D CMAKE_INSTALL_PREFIX:STRING=$BUILD/../.install \

-D CMAKE_TOOLCHAIN_FILE=$SDK_PREFIX/toolchain/share/toolchain-$TARGET.cmake \

../

# Запускаем сборку. Включаем флаг VERBOSE для make и перенаправляем вывод в файл build.log

VERBOSE=1 make kos-qemu-image 2>&1 | tee build.log

# Запускаем собранный образ решения в QEMU.

# -kernel $BUILD/einit/kos-qemu-image путь к собранному образу ядра

$SDK_PREFIX/toolchain/bin/qemu-system-aarch64 \

-m 1024 \

-cpu core2duo \

-serial stdio \

-kernel $BUILD/einit/kos-qemu-image

В этом разделе

Корневой файл CMakeLists.txt

Файлы CMakeLists.txt для сборки прикладных программ

Файл CMakeLists.txt для сборки программы Einit

Шаблон init.yaml.in

Шаблон security.psl.in

В начало
[Topic cmake_using_sdk_cmake]

Корневой файл CMakeLists.txt

Корневой файл CMakeLists.txt содержит общие инструкции сборки для всего решения.

Корневой файл CMakeLists.txt должен содержать следующие команды:

  • cmake_minimum_required (VERSION 3.12) – указание минимальной поддерживаемой версии CMake.

    Для сборки решения на базе KasperskyOS требуется CMake версии не ниже 3.12.

    Требуемая версия CMake поставляется в составе KasperskyOS Community Edition и используется по умолчанию.

  • include (platform) – подключение CMake-библиотеки platform.
  • initialize_platform() – инициализация библиотеки platform.
  • project_header_default("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO") – установка флагов компилятора и компоновщика.
  • [Опционально] Подключение и настройка пакетов для поставляемых системных программ и драйверов, которые необходимо включить в решение:
    • Подключение пакета выполняется с помощью команды find_package().
    • После подключения пакета необходимо добавить директории, связанные с этим пакетом, в список директорий поиска с помощью команды include_directories().
    • Для некоторых пакетов также требуется установить значения свойств с помощью команды set_target_properties().

    CMake-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортируемых переменных и свойств находятся в соответствующих файлах /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<имя программы>/<имя программы>-config.cmake

  • Сборка инициализирующей программы Einit должна быть выполнена с помощью команды add_subdirectory(einit).
  • Все прикладные программы, сборку которых необходимо выполнить, должны быть добавлены с помощью команды add_subdirectory(<имя директории программы>).

Пример корневого файла CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

project (example)

# Инициализация библиотеки CMake для KasperskyOS SDK.

include (platform)

initialize_platform ()

project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")

# Подключение пакета, импортирующего компоненты для работы с виртуальной файловой системой.

# Компоненты импортируются из папки: /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/vfs/vfs-config.cmake

find_package (vfs REQUIRED COMPONENTS ENTITY CLIENT_LIB)

include_directories (${vfs_INCLUDE})

# Подключение пакета, импортирующего компоненты для сборки программы аудита и

# подключения к ней.

find_package (klog REQUIRED)

include_directories (${klog_INCLUDE})

# Сборка инициализирующей программы Einit

add_subdirectory (einit)

# Сборка прикладной программы hello

add_subdirectory (hello)

В начало
[Topic cmake_lists_root]

Файлы CMakeLists.txt для сборки прикладных программ

Файл CMakeLists.txt для сборки прикладной программы должен содержать следующие команды:

  • include (platform/nk) – подключение библиотеки CMake для работы с компилятором NK.
  • project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO") – установка флагов компилятора и компоновщика.
  • EDL-описание класса процессов для программы можно сгенерировать, используя команду generate_edl_file().
  • Если программа предоставляет службы, используя механизм IPC, необходимо сгенерировать транспортный код:
    1. idl.h-файлы генерируются командой nk_build_idl_files()
    2. cdl.h-файлы генерируются командой nk_build_cdl_files()
    3. edl.h-файлы генерируются командой nk_build_edl_files()
  • add_executable (<имя программы> "<путь к файлу исходного кода программы>") – добавление цели для сборки программы.
  • add_dependencies (<имя программы> <имя цели сборки edl.h файла>) – добавление зависимости сборки программы от генерации edl.h-файла.
  • target_link_libraries (<имя программы> <список библиотек>) – определяет библиотеки, с которыми необходимо скомпоновать программу при сборке.

    Например, если программа использует файловый или сетевой ввод/вывод, то она должна быть скомпонована с транспортной библиотекой ${vfs_CLIENT_LIB}.

    CMake-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортированных переменных и свойств находятся в соответствующих файлах /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<имя программы>/<имя программы>-config.cmake

  • Для автоматического добавления описаний IPC-каналов в файл init.yaml при сборке решения необходимо определить свойство EXTRA_CONNECTIONS и присвоить ему значение с описаниями нужных IPC-каналов.

    Пример создания IPC-канала между процессами Client и Server:

    set_target_properties (Client PROPERTIES

    EXTRA_CONNECTIONS

    " - target: Server

    id: server_connection")

    В результате, при сборке решения, описание этого IPC-канала будет автоматически добавлено в файл init.yaml на этапе обработки макросов шаблона init.yaml.in.

  • Для автоматического добавления списка аргументов функции main() и словаря переменных окружения в файл init.yaml при сборке решения, необходимо определить свойства EXTRA_ARGS и EXTRA_ENV и присвоить им соответствующие значения.

    Пример передачи программе Client аргумента "-v" функции main() и переменной окружения VAR1 со значением VALUE1:

    set_target_properties (Client PROPERTIES

    EXTRA_ARGS

    " - \"-v\""

    EXTRA_ENV

    " VAR1: VALUE1")

    В результате, при сборке решения, описание аргумента функции main()и значение переменной окружения будут автоматически добавлены в файл init.yaml на этапе обработки макросов шаблона init.yaml.in.

Пример файла CMakeLists.txt для сборки простой прикладной программы

CMakeLists.txt

project (hello)

# Инструментарий для работы с компилятором NK.

include (platform/nk)

# Установка флагов компиляции.

project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")

# Задаем имя проекта, в который входит программа.

set (LOCAL_MODULE_NAME "example")

# Задаем имя программы.

set (ENTITY_NAME "Hello")

# Обратите внимание на содержание шаблонов init.yaml.in и security.psl.in

# В них имена программ задаются как ${LOCAL_MODULE_NAME}.${ENTITY_NAME}

# Задаем цели, которые будут использованы для создания генерируемых файлов программы.

set (ENTITY_IDL_TARGET ${ENTITY_NAME}_idl)

set (ENTITY_CDL_TARGET ${ENTITY_NAME}_cdl)

set (ENTITY_EDL_TARGET ${ENTITY_NAME}_edl)

# Задаем имя цели, которая будет использована для построения программы.

set (APP_TARGET ${ENTITY_NAME}_app)

# Добавляем цель сборки idl.h-файла.

nk_build_idl_files (${ENTITY_IDL_TARGET}

NK_MODULE ${LOCAL_MODULE_NAME}

IDL "resources/Hello.idl"

)

# Добавляем цель сборки cdl.h-файла.

nk_build_cdl_files (${ENTITY_CDL_TARGET}

IDL_TARGET ${ENTITY_IDL_TARGET}

NK_MODULE ${LOCAL_MODULE_NAME}

CDL "resources/Hello.cdl")

# Добавляем цель сборки EDL-файла. Переменная EDL_FILE экспортируется

# и содержит путь до сгенерированного EDL-файла.

generate_edl_file ( ${ENTITY_NAME}

PREFIX ${LOCAL_MODULE_NAME}

)

# Добавляем цель сборки edl.h-файла.

nk_build_edl_files (${ENTITY_EDL_TARGET}

NK_MODULE ${LOCAL_MODULE_NAME}

EDL ${EDL_FILE}

)

# Определяем цель для сборки программы.

add_executable (${APP_TARGET} "src/hello.c")

# Имя программы в init.yaml и security.psl и имя исполняемого файла должны совпадать

set_target_properties (${APP_TARGET} PROPERTIES OUTPUT_NAME ${ENTITY_NAME})

# Библиотеки, с которыми программа компонуется при сборке

target_link_libraries ( ${APP_TARGET}

PUBLIC ${vfs_CLIENT_LIB} # Программа использует файловый ввод/вывод

# и должна быть подключена как клиент к VFS

)

В начало
[Topic cmake_lists_applied]

Файл CMakeLists.txt для сборки программы Einit

Файл CMakeLists.txt для сборки инициализирующей программы Einit должен содержать следующие команды:

  • include (platform/image) – подключение библиотеки CMake, содержащей скрипты сборки образа решения.
  • project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO") – установка флагов компилятора и компоновщика.
  • Настройка пакетов системных программ и драйверов, которые необходимо включить в решение.
    • Подключение пакета выполняется с помощью команды find_package ().
    • Для некоторых пакетов также требуется установить значения свойств с помощью команды set_target_properties ().

    CMake-описания системных программ и драйверов, поставляемых в составе KasperskyOS Community Edition, а также их экспортированных переменных и свойств находятся в соответствующих файлах /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/<имя программы>/<имя программы>-config.cmake

  • Для автоматического добавления описаний IPC-каналов между процессами системных программ в файл init.yaml при сборке решения необходимо добавить эти каналы в свойство EXTRA_CONNECTIONS для соответствующих программ.

    Например, программа VFS по умолчанию не имеет канала для соединения с программой Env. Чтобы описание такого канала автоматически добавилось в файл init.yaml при сборке решения, необходимо добавить следующий вызов в файл CMakeLists.txt для сборки программы Einit:

    set_target_properties (${vfs_ENTITY} PROPERTIES

    EXTRA_CONNECTIONS

    " - target: env.Env

    id: {var: ENV_SERVICE_NAME, include: env/env.h}"

    В результате, при сборке решения, описание этого IPC-канала будет автоматически добавлено в файл init.yaml на этапе обработки макросов шаблона init.yaml.in.

  • Для автоматического добавления списка аргументов функции main() и словаря переменных окружения в файл init.yaml при сборке решения, необходимо определить свойства EXTRA_ARGS и EXTRA_ENV и присвоить им соответствующие значения.

Пример передачи программе VfsEntity аргумента "-f fstab" функции main() и переменной окружения ROOTFS со значением ramdisk0,0 / ext2 0:

set_target_properties (${vfs_ENTITY} PROPERTIES

EXTRA_ARGS

" - \"-f\"

- \"fstab\""

EXTRA_ENV

" ROOTFS: ramdisk0,0 / ext2 0")

В результате, при сборке решения, описание аргумента функции main() и значение переменной окружения будут автоматически добавлены в файл init.yaml на этапе обработки макросов шаблона init.yaml.in.

  • set(ENTITIES <полный список программ, входящих в решение>) – определение переменной ENTITIES со списком исполняемых файлов всех программ, входящих в решение.
  • Одна или обе команды для сборки образа решения:
    • build_kos_hw_image() – создает цель сборки, которую далее можно использовать для сборки образа для аппаратной платформы с помощью make.
    • build_kos_qemu_image() – создает цель сборки, которую далее можно использовать для сборки образа для запуска на QEMU с помощью make.

Пример файла CMakeLists.txt для сборки программы Einit

CMakeLitsts.txt

project (einit)

# Подключение библиотеки, содержащей скрипты сборки образа решения.

include (platform/image)

# Установка флагов компиляции.

project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO")

# Настройка программы VFS.

# По умолчанию программе VFS не сопоставляется программа, реализующая блочное устройство.

# Если необходимо использовать блочное устройство, например ata из компонента ata,

# необходимо задать это устройство в переменной ${blkdev_ENTITY}_REPLACEMENT

# Больше информации об экспортированных переменных и свойств программы VFS

# см. в /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/lib/cmake/vfs/vfs-config.cmake

# find_package(ata)

# set_target_properties (${vfs_ENTITY} PROPERTIES ${blkdev_ENTITY}_REPLACEMENT ${ata_ENTITY})

# В простейшем случае не нужно взаимодействовать с диском,

# поэтому мы устанавливаем значение переменной ${blkdev_ENTITY}_REPLACEMENT равным пустой строке

set_target_properties (${vfs_ENTITY} PROPERTIES ${blkdev_ENTITY}_REPLACEMENT "")

# Определение переменной ENTITIES со списком исполняемых файлов программ

# Важно включить все программы, входящие в проект, кроме программы Einit.

# Обратите внимание на то, что имя исполняемого файла программы должно

# совпадать с названием цели, указанной в add_executable() в CMakeLists.txt для сборки этой программы.

set(ENTITIES

${vfs_ENTITY}

Hello_app

)

# Образ решения для аппаратной платформы.

# Создает цель сборки с именем kos-image, которую далее можно

# использовать для сборки образа для аппаратной платформы с помощью make kos-image.

build_kos_hw_image (kos-image

EINIT_ENTITY EinitHw

CONNECTIONS_CFG "src/init.yaml.in" # шаблон файла init.yaml

SECURITY_PSL "src/security.psl.in" # шаблон файла security.psl

IMAGE_FILES ${ENTITIES}

)

# Образ решения для аппаратной платформы для QEMU.

# Создает цель сборки с именем kos-qemu-image, которую далее можно

# использовать для сборки образа QEMU с помощью make kos-qemu-image.

build_kos_qemu_image (kos-qemu-image

EINIT_ENTITY EinitQemu

CONNECTIONS_CFG "src/init.yaml.in"

SECURITY_PSL "src/security.psl.in"

IMAGE_FILES ${ENTITIES}

)

В начало
[Topic cmake_lists_einit]

Шаблон init.yaml.in

Шаблон init.yaml.in используется для автоматической генерации части файла init.yaml перед сборкой программы Einit средствами CMake.

Использование шаблона init.yaml.in позволяет не добавлять описания системных программ и IPC-каналов для соединения с ними в файл init.yaml вручную.

Шаблон init.yaml.in должен содержать следующие данные:

  • Корневой ключ entities.
  • Список всех прикладных программ, входящих в решение.
  • Для прикладных программ, использующих механизм IPC, необходимо указать список IPC-каналов, соединяющих эту программу с другими программами.

    IPC-каналы, соединяющие эту программу с другими прикладными программами указываются вручную или в файле CMakeLists.txt этой программы с помощью свойства EXTRA_CONNECTIONS.

    Для указания списка IPC-каналов, соединяющих эту программу с системными программами, входящими в состав KasperskyOS Community Edition, используются следующие макросы:

    • @INIT_<имя программы>_ENTITY_CONNECTIONS@ – при сборке заменяется на список IPC-каналов со всеми системными программами, с которыми скомпонована прикладная программа. Поля target и id заполняются в соответствии с файлами connect.yaml из состава KasperskyOS Community Edition, расположенными в /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include/<имя системной программы>).

      Этот макрос нужно использовать, если прикладная программа не имеет соединений с другими прикладными программами и соединяется только с системными программами. Этот макрос добавляет корневой ключ connections.

    • @INIT_<имя программы>_ENTITY_CONNECTIONS+@ – при сборке добавляет список IPC-каналов со всеми системными программами, с которыми скомпонована прикладная программа, к списку IPC-каналов, заданному вручную. Этот макрос не добавляет корневой ключ connections.

      Этот макрос нужно использовать, если прикладная программа имеет соединения с другими прикладными программами, которые были указаны в шаблоне init.yaml.in вручную.

  • Макросы @INIT_<имя программы>_ENTITY_CONNECTIONS@ и @INIT_<имя программы>_ENTITY_CONNECTIONS+@ также добавляют список соединений для каждой программы, заданный в свойстве EXTRA_CONNECTIONS при сборке этой программы.
  • Если необходимо передать программе аргументы функции main(), заданные в свойстве EXTRA_ARGS при сборке этой программы, то необходимо использовать следующие макросы:
    • @INIT_<имя программы>_ENTITY_ARGS@ – при сборке заменяется на список аргументов функции main(), заданный в свойстве EXTRA_ARGS. Этот макрос добавляет корневой ключ args.
    • @INIT_<имя программы>_ENTITY_ARGS+@ – при сборке добавляет список аргументов функции main(), заданный в свойстве EXTRA_ARGS, к списку аргументов заданному вручную. Этот макрос не добавляет корневой ключ args.
  • Если необходимо передать программе значения переменных окружения, заданные в свойстве EXTRA_ENV при сборке этой программы, то необходимо использовать следующие макросы:
    • @INIT_<имя программы>_ENTITY_ENV@ – при сборке заменяется на словарь переменных окружения и их значений, заданный в свойстве EXTRA_ENV. Этот макрос добавляет корневой ключ env.
    • @INIT_<имя программы>_ENTITY_ENV+@ – при сборке добавляет словарь переменных окружения и их значений, заданный в свойстве EXTRA_ENV, к переменным заданным вручную. Этот макрос не добавляет корневой ключ env.
  • Макрос @INIT_EXTERNAL_ENTITIES@, который при сборке заменяется на список системных программ, с которыми скомпонована прикладная программа, и их IPC-каналов, аргументов функции main() и значений переменных окружения.

Пример шаблона init.yaml.in

init.yaml.in

entities:

- name: ping.Client

connections:

# Программа "Client" может обращаться к "Server".

- target: ping.Server

id: server_connection

@INIT_Client_ENTITY_CONNECTIONS+@

@INIT_Client_ENTITY_ARGS@

@INIT_Client_ENTITY_ENV@

- name: ping.Server

@INIT_Server_ENTITY_CONNECTIONS@

@INIT_EXTERNAL_ENTITIES@

При сборке программы Einit из этого шаблона будет сгенерирован следующий файл init.yaml:

init.yaml

entities:

- name: ping.Client

connections:

# Программа "Client" может обращаться к "Server"

- target: ping.Server

id: server_connection

- target: kl.VfsEntity

id: {var: _VFS_CONNECTION_ID, include: vfs/defs.h}

args:

- "-v"

env:

VAR1: VALUE1

- name: ping.Server

connections:

- target: kl.VfsEntity

id: {var: _VFS_CONNECTION_ID, include: vfs/defs.h}

- name: kl.VfsEntity

path: VFS

args:

- "-f"

- "fstab"

env:

ROOTFS: ramdisk0,0 / ext2

В начало
[Topic cmake_yaml_templates]

Шаблон security.psl.in

Шаблон security.psl.in используется для автоматической генерации части файла security.psl перед сборкой программы Einit средствами CMake.

Файл security.psl содержит часть описания политики безопасности решения.

Использование шаблона security.psl.in позволяет не добавлять EDL-описания системных программ в файл security.psl вручную.

Шаблон security.psl.in должен содержать описание политики безопасности решения, созданное вручную, включая следующие декларации:

  • описание глобальных параметров политики безопасности решения;
  • включение PSL-файлов;
  • включение EDL-файлов прикладных программ;
  • создание объектов моделей безопасности;
  • привязка методов моделей безопасности к событиям безопасности;
  • описание профилей аудита безопасности.

Для автоматического включения системных программ, необходимо использовать макрос @INIT_EXTERNAL_ENTITIES@.

Пример шаблона security.psl.in

security.psl.in

execute: kl.core.Execute

use nk.base._

use EDL Einit

use EDL kl.core.Core

use EDL Client

use EDL Server

@INIT_EXTERNAL_ENTITIES@

/* Запуск программ разрешен */

execute {

grant ()

}

/* Отправка и получение запросов, ответов и ошибок разрешены. */

request {

grant ()

}

response {

grant ()

}

error {

grant ()

}

/* Обращения по интерфейсу безопасности игнорируются. */

security {

grant ()

}

В начало
[Topic cmake_psl_templates]

Библиотеки CMake в составе KasperskyOS Community Edition

Этот раздел содержит описание библиотек, поставляемых в KasperskyOS Community Edition и предназначенных для автоматизации сборки решения на базе KasperskyOS.

В этом разделе

Библиотека platform

Библиотека nk

Библиотека image

В начало
[Topic cmake_libs]

Библиотека platform

Библиотека platform содержит следующие команды:

  • initialize_platform() – команда для инициализации библиотеки platform.
  • project_header_default() – команда для указания флагов компилятора и компоновщика для текущего проекта.

Эти команды используются в файлах CmakeLists.txt для программы Einit и прикладных программ.

В начало
[Topic cmake_platform_lib]

Библиотека nk

Этот раздел содержит описание команд и макросов библиотеки CMake-библиотеки для работы с компилятором NK.

В начало
[Topic cmake_nk_lib]

generate_edl_file()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/nk2.cmake.

generate_edl_file(NAME ...)

Команда генерирует EDL-файл с описанием класса процессов.

Параметры:

  • NAME – название класса процессов. Обязательный параметр.
  • PREFIX – имя глобального модуля, к которому относится EDL-файл. В этом параметре необходимо указать название проекта.
  • EDL_COMPONENTS – имя компонента и его экземпляра, которые будут включены в EDL-файл. Например: EDL_COMPONENTS "env: kl.Env". Для включения нескольких компонентов нужно использовать несколько параметров EDL_COMPONENTS.
  • SECURITY – квалифицированное имя метода интерфейса безопасности, который будет включен в EDL-файл.
  • OUTPUT_DIR – директория, где будет создан EDL-файл. По умолчанию ${CMAKE_CURRENT_BINARY_DIR}.
  • OUTPUT_FILE – имя создаваемого EDL-файла. По умолчанию ${OUTPUT_DIR}/${NAME}.edl.

В результате работы команды переменная EDL_FILE экспортируется и содержит путь до сгенерированного EDL файла.

Пример вызова:

generate_edl_file(${ENTITY_NAME} EDL_COMPONENTS "env: kl.Env")

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки прикладных программ".

В начало
[Topic cmake_generate_edl]

nk_build_idl_files()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/nk2.cmake.

nk_build_idl_files(NAME ...)

Команда создает CMake-цель для генерации .idl.h-файлов для одного или нескольких заданных IDL-файлов при помощи компилятора NK.

Параметры:

  • NAME – имя CMake-цели для сборки .idl.h-файлов. Если цель еще не создана, то она будет создана с помощью add_library() с указанным именем. Обязательный параметр.
  • NOINSTALL – если указана эта опция, то файлы будут только сгенерированы в рабочей директории, но не будут установлены в глобальные директории: ${CMAKE_BINARY_DIR}/_headers_ ${CMAKE_BINARY_DIR}/_headers_/${PROJECT_NAME}.
  • NK_MODULE – глобальный модуль, к которому относится интерфейс. В этом параметре необходимо указать название проекта.
  • WORKING_DIRECTORY – рабочая директория для вызова компилятора NK, по умолчанию: ${CMAKE_CURRENT_BINARY_DIR}.
  • DEPENDS – дополнительные цели сборки, от которых зависит IDL-файл.

    Для добавления нескольких целей нужно использовать несколько параметров DEPENDS.

  • IDL – путь к IDL-файлу, для которого генерируется idl.h-файл. Обязательный параметр.

    Для добавления нескольких IDL-файлов нужно использовать несколько параметров IDL.

    Если один IDL-файл импортирует другой IDL-файл, то генерацию idl.h-файлов нужно производить в порядке, необходимом для соблюдения зависимостей (сначала самые вложенные).

  • NK_FLAGS – дополнительные флаги для NK компилятора.

Пример вызова:

nk_build_idl_files (echo_idl_files NK_MODULE "echo" IDL "resources/Ping.idl")

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки прикладных программ".

В начало
[Topic cmake_build_idl]

nk_build_cdl_files()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/nk2.cmake.

nk_build_cdl_files(NAME ...)

Команда создает CMake-цель для генерации .cdl.h-файлов для одного или нескольких заданных CDL-файлов при помощи компилятора NK.

Параметры:

  • NAME – имя CMake-цели для сборки .cdl.h-файлов. Если цель еще не создана, то она будет создана с помощью add_library() с указанным именем. Обязательный параметр.
  • NOINSTALL – если указана эта опция, то файлы будут только сгенерированы в рабочей директории, но не установлены в глобальные директории: ${CMAKE_BINARY_DIR}/_headers_ ${CMAKE_BINARY_DIR}/_headers_/${PROJECT_NAME}.
  • IDL_TARGET – цель сборки .idl.h-файлов для IDL-файлов, содержащих описания служб, предоставляемых компонентами, описанными в CDL-файлах.
  • NK_MODULE – глобальный модуль, к которому относится компонент. В этом параметре необходимо указать название проекта.
  • WORKING_DIRECTORY – рабочая директория для вызова компилятора NK, по умолчанию: ${CMAKE_CURRENT_BINARY_DIR}.
  • DEPENDS – дополнительные цели сборки, от которых зависит CDL-файл.

    Для добавления нескольких целей нужно использовать несколько параметров DEPENDS.

  • CDL – путь к CDL-файлу, для которого генерируется .cdl.h-файл. Обязательный параметр.

    Для добавления нескольких CDL-файлов нужно использовать несколько параметров CDL.

  • NK_FLAGS – дополнительные флаги для NK компилятора.

Пример вызова:

nk_build_cdl_files (echo_cdl_files IDL_TARGET echo_idl_files NK_MODULE "echo" CDL "resources/Ping.cdl")

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки прикладных программ".

В начало
[Topic cmake_build_cdl]

nk_build_edl_files()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/nk2.cmake.

nk_build_edl_files(NAME ...)

Команда создает CMake-цель для генерации .edl.h-файла для одного заданного EDL-файла при помощи компилятора NK.

Параметры:

  • NAME – имя CMake-цели сборки .edl.h-файла. Если цель еще не создана, то она будет создана с помощью add_library() с указанным именем. Обязательный параметр.
  • NOINSTALL – если указана эта опция, то файлы будут только сгенерированы в рабочей директории, но не установлены в глобальные директории: ${CMAKE_BINARY_DIR}/_headers_ ${CMAKE_BINARY_DIR}/_headers_/${PROJECT_NAME}.
  • CDL_TARGET – цель сборки .cdl.h-файлов для CDL-файлов, содержащих описания компонентов EDL-файла, для которого выполняется сборка.
  • IDL_TARGET – цель сборки .idl.h-файлов для IDL-файлов, содержащих описания интерфейсов EDL-файла, для которого выполняется сборка.
  • NK_MODULE – глобальный модуль, к которому относится EDL-файл. В этом параметре необходимо указать название проекта.
  • WORKING_DIRECTORY – рабочая директория для вызова компилятора NK, по умолчанию: ${CMAKE_CURRENT_BINARY_DIR}.
  • DEPENDS – дополнительные цели сборки, от которых зависит EDL-файл.

    Для добавления нескольких целей нужно использовать несколько параметров DEPENDS.

  • EDL – путь к EDL файлу, для которого генерируется edl.h-файл. Обязательный параметр.
  • NK_FLAGS – дополнительные флаги для NK компилятора.

Примеры вызова:

nk_build_edl_files (echo_server_edl_files CDL_TARGET echo_cdl_files NK_MODULE "echo" EDL "resources/Server.edl")

nk_build_edl_files (echo_client_edl_files NK_MODULE "echo" EDL "resources/Client.edl")

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки прикладных программ".

В начало
[Topic cmake_build_edl]

Библиотека image

Этот раздел содержит описание команд и макросов CMake-библиотеки image , входящей в состав KasperskyOS Community Edition и содержащей скрипты сборки образа решения.

В начало
[Topic cmake_image_lib]

build_kos_hw_image()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/image.cmake.

build_kos_hw_image(NAME ...)

Команда создает CMake-цель сборки образа решения, которую впоследствии можно использовать для сборки образа для аппаратной платформы с помощью make.

Параметры:

  • NAME – имя CMake-цели для сборки образа решения. Обязательный параметр.
  • PERFCNT_KERNEL – использовать ядро со счетчиками производительности, если оно доступно в составе KasperskyOS Community Edition.
  • EINIT_ENTITY – имя исполняемого файла, из которого будет запускаться программа Einit.
  • EXTRA_XDL_DIR – дополнительные директории для включения при сборке программы Einit.
  • CONNECTIONS_CFG – путь до файла init.yaml или шаблона init.yaml.in.
  • SECURITY_PSL – путь до файла security.psl или шаблона security.psl.in.
  • KLOG_ENTITY – цель сборки системной программы Klog, отвечающей за аудит безопасности. Если цель не указана – аудит не выполняется.
  • IMAGE_BINARY_DIR_BIN – директория для финального образа и других артефактов, по умолчанию CMAKE_CURRENT_BINARY_DIR.
  • IMAGE_FILES – исполняемые файлы прикладных и системных программ (кроме программы Einit) и любые другие файлы для добавления в образ ROMFS.

    Для добавления нескольких программ или файлов можно использовать несколько параметров IMAGE_FILES.

  • <пути до файлов> – свободные параметры, тоже что IMAGE_FILES.

Пример вызова:

build_kos_hw_image ( kos-image

EINIT_ENTITY EinitHw

CONNECTIONS_CFG "src/init.yaml.in"

SECURITY_CFG "src/security.cfg.in"

IMAGE_FILES ${ENTITIES})

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки программы Einit".

В начало
[Topic cmake_build_hw]

build_kos_qemu_image()

Команда объявлена в файле /opt/KasperskyOS-Community-Edition-<version>toolchain/share/cmake/Modules/platform/image.cmake.

build_kos_qemu_image(NAME ...)

Команда создает CMake-цель сборки образа решения, которую впоследствии можно использовать для сборки образа для QEMU с помощью make.

Параметры:

  • NAME – имя CMake-цели для сборки образа решения. Обязательный параметр.
  • PERFCNT_KERNEL – использовать ядро со счетчиками производительности, если оно доступно в составе KasperskyOS Community Edition.
  • EINIT_ENTITY – имя исполняемого файла, из которого будет запускаться программа Einit.
  • EXTRA_XDL_DIR – дополнительные директории для включения при сборке программы Einit.
  • CONNECTIONS_CFG – путь до файла init.yaml или шаблона init.yaml.in.
  • SECURITY_PSL – путь до файла security.psl или шаблона security.psl.in.
  • KLOG_ENTITY – цель сборки системной программы Klog, отвечающей за аудит безопасности. Если цель не указана – аудит не выполняется.
  • QEMU_FLAGS – дополнительные флаги для запуска QEMU.
  • IMAGE_BINARY_DIR_BIN – директория для финального образа и других артефактов, по умолчанию совпадает с CMAKE_CURRENT_BINARY_DIR.
  • IMAGE_FILES – исполняемые файлы прикладных и системных программ (кроме программы Einit) и любые другие файлы для добавления в образ ROMFS.

    Для добавления нескольких программ или файлов можно использовать несколько параметров IMAGE_FILES.

  • <пути до файлов> – свободные параметры, тоже что IMAGE_FILES.

Пример вызова:

build_kos_qemu_image ( kos-qemu-image

EINIT_ENTITY EinitQemu

CONNECTIONS_CFG "src/init.yaml.in"

SECURITY_CFG "src/security.cfg.in"

IMAGE_FILES ${ENTITIES})

Пример использования команды см. в статье "Файлы CMakeLists.txt для сборки программы Einit".

В начало
[Topic cmake_build_qemu]

Сборка без использования CMake

Этот раздел содержит описание скриптов, утилит, компиляторов и шаблонов сборки, поставляемых в KasperskyOS Community Edition.

Эти инструменты можно использовать:

  • в других системах сборки;
  • для выполнения отдельных шагов сборки;
  • для изучения особенностей сборки и написания собственной системы сборки.

Общая схема сборки образа решения приведена в статье "Общая схема сборки".

В начало
[Topic cmake_no_cmake_build]

Инструменты для сборки решения

Этот раздел содержит описание скриптов, утилит, компиляторов и шаблонов сборки, поставляемых в KasperskyOS Community Edition.

В этом разделе

Утилиты и скрипты сборки

Кросс-компиляторы

В начало
[Topic solution_build_tools]

Утилиты и скрипты сборки

В состав KasperskyOS Community Edition входят следующие утилиты и скрипты сборки:

  • nk-gen-c

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

  • nk-psl-gen-c

    Компилятор nk-psl-gen-c генерирует исходный код модуля безопасности Kaspersky Security Module на основе описания политики безопасности решения (security.psl) и EDL, CDL- и IDL-описаний , входящих в решение.

  • einit

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

  • makekss

    Скрипт makekss создает модуль безопасности Kaspersky Security Module.

  • makeimg

    Скрипт makeimg создает финальный загружаемый образ решения на базе KasperskyOS со всеми запускаемыми программами и модулем Kaspersky Security Module.

В этом разделе

nk-gen-c

nk-psl-gen-c

einit

makekss

makeimg

В начало
[Topic build_utilities_and_scripts]

nk-gen-c

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

Компилятор NK принимает EDL-, CDL- или IDL-файл и создает следующие файлы:

  • H-файл, содержащий объявление и реализацию транспортных методов и типов.
  • D-файл, в котором перечислены зависимости созданного C-файла. Этот файл может быть использован для автоматизации сборки с помощью утилиты make.

Синтаксис использования компилятора NK:

nk-gen-c [-I PATH][-o PATH][--types][--interface][--client][--server][--extended-errors][--enforce-alignment-check][--help][--version] FILE

Параметры:

  • FILE

    Путь к EDL-, CDL- или IDL-описанию, для которого необходимо сгенерировать транспортные методы и типы.

  • -I PATH

    Путь к директории, содержащей вспомогательные файлы, необходимые для генерации транспортных методов и типов. По умолчанию эти файлы располагаются в директории /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include.

    Также может использоваться для добавления других директорий для поиска файлов, необходимых для генерации.

    Чтобы указать более одной директории, можно использовать несколько параметров -I.

  • -o PATH

    Путь к существующей директории, в которой будут созданы файлы, содержащие транспортные методы и типы.

  • -h, --help

    Отображает текст справки.

  • --version

    Отображает версию nk-gen-c

  • --enforce-alignment-check

    Включает обязательную проверку выравнивания обращений к памяти, даже если такая проверка отключена для целевой платформы. Если проверка включена, то компилятор NK добавляет дополнительные проверки выравнивания в код валидаторов IPC-сообщений.

    По умолчанию параметры проверки выравнивания обращения к памяти задаются для каждой платформы в файле system.platform.

  • --extended-errors

    Включает расширенную обработку ошибок в коде транспортных методов.

Выборочная генерация

Чтобы уменьшить количество генерируемого компилятором NK кода, можно использовать флаги выборочной генерации. Например, для программ, реализующих службы, удобно использовать флаг --server, а для программ, являющихся клиентами служб, удобно использовать флаг --client.

Если ни один из флагов выборочной генерации не указан, компилятор NK создаст все возможные для указанного файла транспортные типы и методы.

Флаги выборочной генерации для IDL-файлов:

  • --types

    Компилятор создаст только константы и типы, включая переопределенные (typedef), из входного IDL-файла, а также типы из импортируемых IDL-файлов, которые используются в типах входного файла.

    При этом константы и переопределенные типы из импортируемых IDL-файлов не будут явно включены в генерируемые файлы. Если вам необходимо использовать типы из импортируемых файлов в коде, нужно отдельно сгенерировать H-файлы для каждого такого IDL-файла.

  • --interface

    Компилятор создаст файлы, создаваемые с флагом --types, а также структуры сообщений запросов и ответов для всех методов этой службы.

  • --client

    Компилятор создаст файлы, создаваемые с флагом --interface, а также клиентские прокси-объекты и функции их инициализации для всех методов этой службы.

  • --server

    Компилятор создаст файлы, создаваемые с флагом --interface, а также типы и методы диспетчера этой службы.

Флаги выборочной генерации для CDL-файлов и EDL-файлов:

  • --types

    Компилятор создаст файлы, создаваемые с флагом --types для всех служб, предоставляемых этим компонентом.

    При этом явно включены в генерируемые файлы будут только те типы, которые используются в параметрах интерфейсных методов.

  • --interface

    Компилятор создаст файлы, создаваемые с флагом --types для этого компонента/класса процессов, а также файлы, создаваемые с флагом --interface для всех предоставляемых этим компонентом.

  • --client

    Компилятор создаст файлы, создаваемые с флагом --interface, а также клиентские прокси-объекты и функции их инициализации для всех служб, предоставляемых этим компонентом.

  • --server

    Компилятор создаст файлы, создаваемые с флагом --interface, а также типы и методы диспетчера этого компонента/класса процессов и типы и методы диспетчеров для всех служб, предоставляемых этим компонентом.

В начало
[Topic nkgenc]

nk-psl-gen-c

Компилятор nk-psl-gen-c генерирует исходный код модуля безопасности Kaspersky Security Module на основе описания политики безопасности решения а также EDL-, CDL и IDL-описаний, входящих в решение. Этот код используется скриптом makekss.

Компилятор nk-psl-gen-c также позволяет генерировать и запускать код тестов для политики безопасности решения, написанных на языке PAL.

Синтаксис использования компилятора nk-psl-gen-c:

nk-psl-gen-c [-I PATH][-o PATH][--audit PATH][--tests ARG][--help][--version] FILE

Параметры:

  • FILE

    Путь к PSL-описанию политики безопасности решения (security.psl)

  • -I,--include-dir PATH

    Путь к директории, содержащей вспомогательные файлы, необходимые для генерации транспортных методов и типов. По умолчанию эти файлы располагаются в директории /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include.

    Компилятору nk-psl-gen-c потребуется доступ ко всем EDL- CDL- и IDL-описаниям. Для того, чтобы компилятор nk-psl-gen-c мог найти эти описания, нужно передать пути к расположению этих описаний в параметре -I.

    Чтобы указать более одной директории, можно использовать несколько параметров -I.

  • -o,--output PATH

    Путь к создаваемому файлу, содержащему код модуля безопасности.

  • -t, --tests ARG

    Флаг контроля генерации кода и запуска тестов для политики безопасности решения. Может принимать следующие значения:

    • skip – код тестов не генерируется. Это значение используется по умолчанию, если флаг --tests не указан.
    • generate – код тестов генерируется, но не компилируется и не запускается.
    • run – код тестов генерируется, компилируется с помощью компилятора gcc и запускается.
  • -a, --audit PATH

    Путь к создаваемому файлу, содержащему код декодера аудита.

  • -h, --help

    Отображает текст справки.

  • --version

    Отображает версию nk-psl-gen-c.

В начало
[Topic nkpslgenc]

einit

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

Утилита einit принимает описание инициализации решения (по умолчанию файл init.yaml), а также EDL-, CDL- и IDL-описания, и создает файл с исходным кодом инициализирующей программы Einit. Программу Einit затем необходимо собрать с помощью кросс-компилятора языка C, поставляемого в KasperskyOS Community Edition.

Синтаксис использования утилиты einit:

einit -I PATH -o PATH [--help] FILE

Параметры:

  • FILE

    Путь к файлу init.yaml.

  • -I PATH

    Путь к директории, содержащей вспомогательные файлы (включая EDL-, CDL- и IDL-описания), необходимые для генерации инициализирующей программы. По умолчанию эти файлы располагаются в директории /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include.

  • -o, --out-file PATH

    Путь к создаваемому .c файлу с кодом инициализирующей программы.

  • -h, --help

    Отображает текст справки.

В начало
[Topic einit_tool]

makekss

Скрипт makekss создает модуль безопасности Kaspersky Security Module.

Скрипт вызывает компилятор nk-psl-gen-c для генерации исходного кода модуля безопасности и затем компилирует полученный код, вызывая компилятор C, поставляемый в KasperskyOS Community Edition.

Скрипт создает модуль безопасности из описания политики безопасности решения.

Синтаксис использования скрипта makekss:

makekss --target=ARCH --module=PATH --with-nk="PATH" --with-nktype="TYPE" --with-nkflags="FLAGS" [--output="PATH"][--help][--with-cc="PATH"][--with-cflags="FLAGS"] FILE

Параметры:

  • FILE

    Путь к верхнеуровневому файлу описания политики безопасности решения.

  • --target=ARCH

    Архитектура процессора, для которой производится сборка.

  • --module=-lPATH

    Путь к библиотеке ksm_kss. Этот ключ передается компилятору C для компоновки с этой библиотекой.

  • --with-nk=PATH

    Путь к компилятору nk-psl-gen-c, который будет использоваться для генерации исходного кода модуля безопасности. По умолчанию компилятор расположен в /opt/KasperskyOS-Community-Edition-<version>/toolchain/bin/nk-psl-gen-c.

  • --with-nktype="TYPE"

    Указывает на тип компилятора NK, который будет использоваться. Для использования компилятора nk-psl-gen-c, необходимо указать тип psl.

  • --with-nkflags="FLAGS"

    Параметры, с которыми вызывается компилятор nk-psl-gen-c.

    Компилятору nk-psl-gen-c потребуется доступ ко всем EDL- CDL- и IDL-описаниям. Для того, чтобы компилятор nk-psl-gen-c мог найти эти описания, нужно передать пути к расположению этих описаний в параметре --with-nkflags, используя параметр -I компилятора nk-psl-gen-c.

  • --output=PATH

    Путь к создаваемому файлу модуля безопасности.

  • --with-cc=PATH

    Путь к компилятору C, который будет использоваться для сборки модуля безопасности. По умолчанию используется компилятор, поставляемый в KasperskyOS Community Edition.

  • --with-cflags=FLAGS

    Параметры, с которыми вызывается компилятор C.

  • -h, --help

    Отображает текст справки.

В начало
[Topic makekss]

makeimg

Скрипт makeimg создает финальный загружаемый образ решения на базе KasperskyOS со всеми исполняемыми файлами программ и модулем Kaspersky Security Module.

Скрипт принимает список файлов, включая исполняемые файлы всех программ, которые нужно добавить в ROMFS загружаемого образа, и создает следующие файлы:

  • образ решения;
  • образ решения без таблиц символов (.stripped);
  • образ решения с отладочными таблицами символов (.dbg.syms).

Синтаксис использования скрипта makeimg:

makeimg --target=ARCH --sys-root=PATH --with-toolchain=PATH --ldscript=PATH --img-src=PATH --img-dst=PATH --with-init=PATH [--with-extra-asflags=FLAGS][--with-extra-ldflags=FLAGS][--help] FILES

Параметры:

  • FILES

    Список путей к файлам, включая исполняемые файлы всех программ, которые нужно добавить в ROMFS.

    Модуль безопасности (ksm.module) нужно указывать явно, иначе он не будет включен в образ решения. Программу Einit указывать не нужно, так как она будет включена в образ решения автоматически.

  • --target=ARCH

    Архитектура, для которой производится сборка.

  • --sys-root=PATH

    Путь к корневой директории sysroot. По умолчанию эта директория расположена в /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/.

  • --with-toolchain=PATH

    Путь к набору вспомогательных утилит, необходимых для сборки решения. По умолчанию эти утилиты расположены в /opt/KasperskyOS-Community-Edition-<version>/toolchain/.

  • --ldscript=PATH

    Путь к скрипту компоновщика, необходимому для сборки решения. По умолчанию этот скрипт расположен в /opt/KasperskyOS-Community-Edition-<version>/libexec/aarch64-kos/.

  • --img-src=PATH

    Путь к заранее скомпилированному ядру KasperskyOS. По умолчанию ядро расположено в /opt/KasperskyOS-Community-Edition-<version>/libexec/aarch64-kos/.

  • --img-dst=PATH

    Путь к создаваемому файлу образа.

  • --with-init=PATH

    Путь к исполняемому файлу инициализирующей программы Einit.

  • --with-extra-asflags=FLAGS

    Дополнительные флаги для ассемблера AS.

  • --with-extra-ldflags=FLAGS

    Дополнительные флаги для компоновщика LD.

  • -h, --help

    Отображает текст справки.

В начало
[Topic makeimg]

Кросс-компиляторы

Свойства кросс-компиляторов KasperskyOS

Кросс-компиляторы, входящие в состав KasperskyOS Community Edition, поддерживают процессоры с архитектурой aarch64.

В toolchain в составе KasperskyOS Community Edition входят следующие инструменты для кросс-компиляции:

  • GCC:
    • aarch64-kos-gcc
    • aarch64-kos-g++
  • Binutils:
    • Ассемблер AS: aarch64-kos-as
    • Компоновщик LD: aarch64-kos-ld

В GCC, кроме стандартных макросов, определен дополнительный макрос __KOS__=1. Использование этого макроса упрощает портирование программного кода на KasperskyOS, а также разработку платформонезависимых приложений.

Чтобы просмотреть список стандартных макросов GCC, выполните следующую команду:

echo '' | aarch64-kos-gcc -dM -E -

Особенности работы компоновщика

При выполнении сборки исполняемого файла программы компоновщик по умолчанию связывает следующие библиотеки в указанном порядке:

  1. libc – стандартная библиотека языка C.
  2. libm – библиотека, реализующая математические функции стандартной библиотеки языка C.
  3. libvfs_stubs – библиотека, содержащая заглушки функций ввода/вывода (например, open, socket, read, write).
  4. libkos – библиотека для доступа к службам ядра KasperskyOS.
  5. libenv – библиотека подсистемы настройки окружения программ (переменных окружения, аргументов функции main и пользовательских конфигураций).
  6. libsrvtransport-u – библиотека поддержки IPC между процессами и ядром.
В начало
[Topic crosscompliers]

Пример сборки без использования CMake

Ниже приведен пример скрипта для сборки простейшего примера. Этот пример содержит единственную прикладную программу Hello, которая не предоставляет службы.

Приведенный скрипт предназначен только для демонстрации используемых команд сборки.

build.sh

#!/bin/sh

# В переменной SDK нужно указать путь к директории установки KasperskyOS Community Edition.

SDK=/opt/KasperskyOS-Community-Edition-<version>

TOOLCHAIN=$SDK/toolchain

SYSROOT=$SDK/sysroot-aarch64-kos

PATH=$TOOLCHAIN/bin:$PATH

# Создание файла Hello.edl.h из Hello.edl

# (Программа Hello не реализует служб, поэтому cdl- и idl-файлы отсутствуют.)

nk-gen-c -I $SYSROOT/include Hello.edl

# Компиляция и сборка программы Hello

aarch64-kos-gcc -o hello hello.c

# Создание модуля безопасности Kaspersky Security Module (ksm.module)

makekss --target=aarch64-kos \

--module=-lksm_kss \

--with-nkflags="-I $SDK/examples/common -I $SYSROOT/include" \

security.psl

# Создание кода инициализирующей программы Einit

einit -I $SYSROOT/include -I . init.yaml -o einit.c

# Компиляция и сборка программы Einit

aarch64-kos-gcc -I . -o einit einit.c

# Создание загружаемого образа решения (kos-qemu-image)

makeimg --target=aarch64-kos \

--sys-root=$SYSROOT \

--with-toolchain=$TOOLCHAIN \

--ldscript=$SDK/libexec/aarch64-kos/kos-qemu.ld \

--img-src=$SDK/libexec/aarch64-kos/kos-qemu \

--img-dst=kos-qemu-image \

Hello ksm.module

# Запуск решения под QEMU

qemu-system-aarch64 -m 1024 -serial stdio -kernel kos-qemu-image

В начало
[Topic cmake_no_cmake_build_example]

Создание загрузочного носителя с образом решения

Чтобы создать загрузочный носитель с образом решения:

  1. Подключите носитель, с которого вы планируете запускать образ решения на целевых устройствах.
  2. Найдите блочное устройство, соответствующее подключенному носителю, например с помощью команды:

    fdisk -l

  3. При необходимости создайте на носителе новый раздел, в котором будет развернут образ решения, например с помощью утилиты fdisk.
  4. Если в разделе отсутствует файловая система, создайте ее, например с помощью утилиты mkfs.

    Вы можете использовать любую файловую систему, которую поддерживает загрузчик GRUB 2.

  5. Смонтируйте носитель.

    mkdir /mnt/kos_device && mount /dev/sdXY /mnt/kos_device

    Здесь /mnt/kos_device – точка монтирования; /dev/sdXY – имя блочного устройства; X – буква, соответствующая подключенному носителю; Y – номер раздела.

  6. Установите на носитель загрузчик операционной системы GRUB 2.

    Чтобы установить GRUB 2, выполните следующую команду:

    grub-install --force --removable \
    --boot-directory=/mnt/kos_device/boot /dev/sdX

    Здесь /mnt/kos_device – точка монтирования /dev/sdX – имя блочного устройства; X – буква, соответствующая подключенному носителю.

  7. Скопируйте образ решения в корневую директорию смонтированного носителя.
  8. В файле /mnt/kos_device/boot/grub/grub.cfg добавьте секцию menuentry, указывающую на образ решения.

    menuentry "KasperskyOS" {

    multiboot /my_kasperskyos.img

    boot

    }

  9. Размонтируйте носитель.

    umount /mnt/kos_device

    Здесь /mnt/kos_device – точка монтирования.

После выполнения этих действий вы можете запускать KasperskyOS с этого носителя.

В начало
[Topic deploying_solution_image]