Содержание
Сборка решения на базе KasperskyOS
Этот раздел содержит следующие сведения:
- описание процесса сборки решения на базе KasperskyOS;
- описания скриптов, библиотек и шаблонов сборки, поставляемых в KasperskyOS Community Edition.
Сборка образа решения
Решение на базе 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 включены утилиты для их сборки.
Общая пошаговая схема сборки описана в статье "Общая схема сборки". Сборку образа решения можно осуществлять:
- [Рекомендовано] при помощи скриптов системы сборки
CMake
, которые поставляются в составе KasperskyOS Community Edition. - без использования CMake: с помощью других систем автоматизированной сборки или вручную, используя скрипты и компиляторы, поставляемые в составе KasperskyOS Community Edition.
Общая схема сборки
Для того чтобы собрать образ решения, необходимо выполнить следующие действия:
- Подготовить EDL-, CDL- и IDL-описания прикладных программ, а также файл init-описания (по умолчанию
init.yaml
) и файлы с описанием политики безопасности решения (по умолчаниюsecurity.psl
).При сборке с
CMake
EDL-описание можно генерировать используя командуgenerate_edl_file()
. - Для всех программ, кроме системных программ, поставляемых в составе KasperskyOS Community Edition, сгенерировать файлы *.edl.h.
- При сборке с
CMake
для этого используются командуnk_build_edl_files()
. - При сборке без
CMake
для этого необходимо использовать компилятор NK.
- При сборке с
- Для программ, реализующих собственный IPC-интерфейс, сгенерировать код транспортных методов и типов, используемых для формирования, отправки, приема и обработки IPC-сообщений.
- При сборке с
CMake
для этого используются командыnk_build_idl_files()
,nk_build_cdl_files()
. - При сборке без
CMake
для этого необходимо использовать компилятор NK.
- При сборке с
- Собрать все программы, входящие в решение, при необходимости скомпоновав их с транспортными библиотеками системных или прикладных программ. Для сборки прикладных программ, реализующих собственный IPC-интерфейс, потребуются сгенерированный на шаге 3 код, содержащий транспортные методы и типы.
- При сборке с
CMake
для этого используются стандартные команды сборки. Необходимые настройки кросс-компиляции производятся автоматически. - При сборке без
CMake
для этого необходимо вручную использовать кросс-компиляторы, входящие в состав KasperskyOS Community Edition.
- При сборке с
- Собрать инициализирующую программу Einit.
- При сборке с
CMake
программаEinit
собирается в процессе сборки образа решения командамиbuild_kos_qemu_image()
иbuild_kos_hw_image()
. - При сборке без
CMake
для генерации кода программыEinit
необходимо использовать утилиту einit. ПрограммуEinit
затем необходимо собрать с помощью кросс-компилятора, поставляемого в KasperskyOS Community Edition.
- При сборке с
- Собрать модуль Kaspersky Security Module.
- При сборке с
CMake
модуль безопасности собирается в процессе сборки образа решения командамиbuild_kos_qemu_image()
иbuild_kos_hw_image()
. - При сборке без
CMake
для этого необходимо использовать скриптmakekss
.
- При сборке с
- Создать образ решения.
- При сборке с
CMake
для этого используются командыbuild_kos_qemu_image()
иbuild_kos_hw_image()
. - При сборке без
CMake
для этого необходимо использовать скриптmakeimg
.
- При сборке с
Пример 1
Для простейшего примера hello
, входящего в состав KasperskyOS Community Edition, в котором содержится одна прикладная программа, не предоставляющая служб, схема сборки выглядит следующим образом:
Пример 2
Пример echo
, входящий в состав KasperskyOS Community Edition, описывает простейший случай взаимодействия двух программ с помощью механизма IPC. Чтобы организовать такое взаимодействие, потребуется реализовать на сервере интерфейс с методом Ping
и "поместить" службу Ping
в новый компонент (например, Ping
), а экземпляр этого компонента – в EDL-описание программы Server
.
В случае наличия в решении программ, использующих механизм IPC, схема сборки выглядит следующим образом:
Использование 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
необходимо:
- Подготовить корневой файл CMakeLists.txt, содержащий общие инструкции сборки для всего решения.
- Подготовить файлы CMakeLists.txt для каждой собираемой прикладной программы.
- Подготовить файл CMakeLists.txt для программы Einit.
- Подготовить шаблоны
init.yaml.in
иsecurity.psl.in
.
Для выполнения кросс-компиляции с помощью системы автоматизации сборки CMake
необходимо:
- Создать поддиректорию для сборки.
BUILD=$PWD/.build
mkdir -p $BUILD && cd $BUILD
- Перед запуском генерации скриптов сборки (команда
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"
- При запуске генерации скриптов сборки (команда
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
- параметр
- При запуске сборки (команда
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
должен содержать следующие команды:
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)
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)
Файлы CMakeLists.txt для сборки прикладных программ
Файл CMakeLists.txt
для сборки прикладной программы должен содержать следующие команды:
include (platform/nk)
– подключение библиотекиCMake
для работы с компилятором NK.project_header_default ("STANDARD_GNU_11:YES" "STRICT_WARNINGS:NO"
) – установка флагов компилятора и компоновщика.- EDL-описание класса процессов для программы можно сгенерировать, используя команду
generate_edl_file()
. - Если программа предоставляет службы, используя механизм IPC, необходимо сгенерировать транспортный код:
- idl.h-файлы генерируются командой
nk_build_idl_files()
- cdl.h-файлы генерируются командой
nk_build_cdl_files()
- edl.h-файлы генерируются командой
nk_build_edl_files()
- idl.h-файлы генерируются командой
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
)
Файл 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
.
- build_kos_hw_image() – создает цель сборки, которую далее можно использовать для сборки образа для аппаратной платформы с помощью
Пример файла 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}
)
Шаблон 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
Шаблон 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 ()
}
Библиотеки CMake в составе KasperskyOS Community Edition
Этот раздел содержит описание библиотек, поставляемых в KasperskyOS Community Edition и предназначенных для автоматизации сборки решения на базе KasperskyOS.
Библиотека platform
Библиотека platform
содержит следующие команды:
initialize_platform()
– команда для инициализации библиотекиplatform
.project_header_default()
– команда для указания флагов компилятора и компоновщика для текущего проекта.
Эти команды используются в файлах CmakeLists.txt
для программы Einit и прикладных программ.
Библиотека nk
Этот раздел содержит описание команд и макросов библиотеки CMake
-библиотеки для работы с компилятором NK.
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 для сборки прикладных программ".
В начало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 для сборки прикладных программ".
В начало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 для сборки прикладных программ".
В начало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 для сборки прикладных программ".
В началоБиблиотека image
Этот раздел содержит описание команд и макросов CMake
-библиотеки image
, входящей в состав KasperskyOS Community Edition и содержащей скрипты сборки образа решения.
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".
В начало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".
В началоСборка без использования CMake
Этот раздел содержит описание скриптов, утилит, компиляторов и шаблонов сборки, поставляемых в KasperskyOS Community Edition.
Эти инструменты можно использовать:
- в других системах сборки;
- для выполнения отдельных шагов сборки;
- для изучения особенностей сборки и написания собственной системы сборки.
Общая схема сборки образа решения приведена в статье "Общая схема сборки".
В началоИнструменты для сборки решения
Этот раздел содержит описание скриптов, утилит, компиляторов и шаблонов сборки, поставляемых в KasperskyOS Community Edition.
Утилиты и скрипты сборки
В состав 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 (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
, а также типы и методы диспетчера этого компонента/класса процессов и типы и методы диспетчеров для всех служб, предоставляемых этим компонентом.
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
.
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
Отображает текст справки.
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
Отображает текст справки.
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
Отображает текст справки.
Кросс-компиляторы
Свойства кросс-компиляторов 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
- Ассемблер AS:
В GCC, кроме стандартных макросов, определен дополнительный макрос __KOS__=1
. Использование этого макроса упрощает портирование программного кода на KasperskyOS, а также разработку платформонезависимых приложений.
Чтобы просмотреть список стандартных макросов GCC, выполните следующую команду:
echo '' | aarch64-kos-gcc -dM -E -
Особенности работы компоновщика
При выполнении сборки исполняемого файла программы компоновщик по умолчанию связывает следующие библиотеки в указанном порядке:
- libc – стандартная библиотека языка C.
- libm – библиотека, реализующая математические функции стандартной библиотеки языка C.
- libvfs_stubs – библиотека, содержащая заглушки функций ввода/вывода (например,
open
,socket
,read
,write
). - libkos – библиотека для доступа к службам ядра KasperskyOS.
- libenv – библиотека подсистемы настройки окружения программ (переменных окружения, аргументов функции
main
и пользовательских конфигураций). - libsrvtransport-u – библиотека поддержки IPC между процессами и ядром.
Пример сборки без использования 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
Создание загрузочного носителя с образом решения
Чтобы создать загрузочный носитель с образом решения:
- Подключите носитель, с которого вы планируете запускать образ решения на целевых устройствах.
- Найдите блочное устройство, соответствующее подключенному носителю, например с помощью команды:
fdisk -l
- При необходимости создайте на носителе новый раздел, в котором будет развернут образ решения, например с помощью утилиты
fdisk
. - Если в разделе отсутствует файловая система, создайте ее, например с помощью утилиты
mkfs
.Вы можете использовать любую файловую систему, которую поддерживает загрузчик GRUB 2.
- Смонтируйте носитель.
mkdir /mnt/kos_device && mount /dev/sdXY /mnt/kos_device
Здесь
/mnt/kos_device
– точка монтирования;/dev/sdXY
– имя блочного устройства;X
– буква, соответствующая подключенному носителю;Y
– номер раздела. - Установите на носитель загрузчик операционной системы GRUB 2.
Чтобы установить GRUB 2, выполните следующую команду:
grub-install --force --removable \
--boot-directory=/mnt/kos_device/boot /dev/sdX
Здесь
/mnt/kos_device
– точка монтирования/dev/sdX
– имя блочного устройства;X
– буква, соответствующая подключенному носителю. - Скопируйте образ решения в корневую директорию смонтированного носителя.
- В файле
/mnt/kos_device/boot/grub/grub.cfg
добавьте секциюmenuentry
, указывающую на образ решения.menuentry "KasperskyOS" {
multiboot /my_kasperskyos.img
boot
}
- Размонтируйте носитель.
umount /mnt/kos_device
Здесь
/mnt/kos_device
– точка монтирования.
После выполнения этих действий вы можете запускать KasperskyOS с этого носителя.
В начало