Содержание
Инструменты для сборки решения
Этот раздел содержит описание скриптов, утилит, компиляторов и шаблонов сборки, поставляемых в 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 System на основе файла политики безопасности решения (security.psl
) и EDL-описаний программ, входящих в решение. - einit
Утилита
einit
позволяет автоматизировать создание кода инициализирующего программыEinit
. Это приложение первым запускается при загрузке KasperskyOS и запускает остальные программы, а также создает каналы (соединения) между ними. - makekss
Скрипт
makekss
создает модуль безопасности Kaspersky Security System для ядра KasperskyOS. - makeimg
Скрипт
makeimg
создает финальный загружаемый образ решения на базе KasperskyOS со всеми запускаемыми программами и модулем Kaspersky Security System.
nk-gen-c
Компилятор NK (nk-gen-c
) генерирует набор транспортных методов и типов на основе EDL-, CDL- и IDL-описаний классов процессов, компонентов и интерфейсов. Транспортные методы и типы нужны для формирования, отправки, приема и обработки IPC-сообщений.
Транспортные методы и типы генерируются с полностью квалифицированными именами. В именах в качестве префиксов используется полное имя класса процесса/компонента/интерфейса. (объявленное в соответствующем EDL-, CDL- или IDL-файле) с заменой точек на подчеркивания (_
).
Компилятор 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-arm-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 System на основе файла политики безопасности решения (security.psl) и EDL-описаний классов процессов, входящих в решение. Этот код используется скриптом 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-arm-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. Это приложение первым запускается при загрузке KasperskyOS и запускает остальные программы, а также создает каналы (соединения) между ними.
Утилита einit
принимает файл init-описания (по умолчанию init.yaml
) и создает .c файл, в котором содержится код инициализирующей программы Einit
. Программу Einit
затем необходимо собрать с помощью компилятора C, поставляемого в KasperskyOS Community Edition.
Синтаксис использования утилиты einit:
einit -I PATH -o PATH [--help] FILE
Параметры:
FILE
Путь к файлу описания классов процессов и соединений
init.yaml
.-I PATH
Путь к директории, содержащей вспомогательные файлы, необходимые для генерации инициализирующей программы. По умолчанию эти файлы располагаются в директории
/opt/KasperskyOS-Community-Edition-<version>/sysroot-arm-kos/include
.-o, --out-file PATH
Путь к создаваемому .c файлу с кодом инициализирующей программы.
-h, --help
Отображает текст справки.
makekss
Скрипт makekss
создает модуль безопасности Kaspersky Security System.
Скрипт вызывает компилятор nk-psl-gen-c для генерации исходного кода модуля безопасности и затем компилирует полученный код, вызывая компилятор C, поставляемый в KasperskyOS Community Edition.
Скрипт принимает файл с описанием политики безопасности решения (по умолчанию security.psl
) и создает файл модуля безопасности ksm.module
.
Синтаксис использования скрипта 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
Путь к файлу конфигурации безопасности (
.psl
).--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 System.
Скрипт принимает список файлов, включая исполняемые файлы всех программ, которые нужно добавить в 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-arm-kos/
.--with-toolchain=PATH
Путь к набору вспомогательных утилит, необходимых для сборки решения. По умолчанию эти утилиты расположены в
/opt/KasperskyOS-Community-Edition-<version>/toolchain/
.--ldscript=PATH
Путь к скрипту компоновщика, необходимому для сборки решения. По умолчанию этот скрипт расположен в
/opt/KasperskyOS-Community-Edition-<version>/libexec/arm-kos/
.--img-src=PATH
Путь к заранее скомпилированному ядру KasperskyOS, не содержащему romfs. По умолчанию ядро расположено в
/opt/KasperskyOS-Community-Edition-<version>/libexec/arm-kos/
.--img-dst=PATH
Путь к создаваемому файлу образа.
--with-init=PATH
Путь к исполняемому файлу инициализирующей программы
Einit
.--with-extra-asflags=FLAGS
Дополнительные флаги для ассемблера AS.
--with-extra-ldflags=FLAGS
Дополнительные флаги для компоновщика LD.
-h, --help
Отображает текст справки.
Кросс-компиляторы
Свойства кросс-компиляторов KasperskyOS
Кросс-компиляторы, входящие в состав KasperskyOS Community Edition, поддерживают процессоры с архитектурой arm
.
В toolchain в составе KasperskyOS Community Edition входят следующие инструменты для кросс-компиляции:
- GCC:
arm-kos-gcc
arm-kos-g++
- Binutils:
- Ассемблер AS:
arm-kos-as
- Компоновщик LD:
arm-kos-ld
- Ассемблер AS:
В GCC, кроме стандартных макросов, определен дополнительный макрос __KOS__=1
. Использование этого макроса упрощает портирование программного кода на KasperskyOS, а также разработку платформонезависимых приложений.
Чтобы просмотреть список стандартных макросов GCC, выполните следующую команду:
echo '' | arm-kos-gcc -dM -E -
Особенности работы компоновщика
При выполнении сборки исполняемого файла программы компоновщик по умолчанию связывает следующие библиотеки в указанном порядке:
- libc – стандартная библиотека языка C.
- libm – библиотека, реализующая математические функции стандартной библиотеки языка C.
- libvfs_stubs – библиотека, содержащая заглушки функций ввода/вывода (например,
open
,socket
,read
,write
). - libkos – библиотека, состоящая из двух частей. Первая часть предоставляет C-интерфейс для доступа к функциям ядра KasperskyOS. Она доступна через заголовочные файлы, находящиеся в директории
coresrv
, например:#include <coresrv/vmm/vmm_api.h>
. Вторая часть библиотеки libkos является оберткой над первой частью и содержит дополнительные функции синхронизации:mutex
,semaphore
,event
. Взаимодействие других библиотек (включая libc) с ядром происходит через библиотеку libkos. - libenv – клиентская библиотека подсистемы настройки окружения программ (переменных окружения, аргументов функции
main
и пользовательских конфигураций). - libsrvtransport-u – внутренняя библиотека с реализацией транспорта межпроцессного взаимодействия сервисов ядра KasperskyOS.
Подготовка загрузочного образа решения
Для автоматизации процесса подготовки загрузочного образа решения нужно настроить систему сборки. За основу можно взять системы сборки, реализованные в примерах.
Этот раздел описывает различные способы настройки системы сборки для подготовки загрузочного образа решения.
Использование шаблона Makefile из состава KasperskyOS Community Edition
Для упрощения процесса подготовки загрузочного образа решения с использованием системы сборки make
вы можете использовать шаблон build.mk
из состава KasperskyOS Community Edition. Файл шаблона располагается по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/common/build.mk
Чтобы подготовить систему сборки make
с использованием шаблона build.mk
, в скрипте сборки Makefile
:
- Задайте значение переменной
targets
. В значении переменной перечислите через пробел все программы, входящие в решение. Указывать программыEinit
,kl.core.Core
необязательно, так как они обрабатываются отдельно. - Для каждой программы, указанной в переменной
targets
, задайте значения следующим переменным:<имя-программы>-objects
– список объектных файлов программы. Необходимо перечислить все объектные файлы.Имена объектных файлов получаются из имен исходных файлов сущности по следующим правилам:
*.c → *.o
*.idl → *.idl.o
*.cdl → *.cdl.o
*.edl → *.edl.o
<имя-программы>-ldflags
– список флагов, передаваемых компоновщику. Если сущность использует виртуальную файловую систему, необходимо передать флаги, указанные в переменнойLIBVFS_REMOTE
.<имя-программы>-base
– адрес загрузки программы в шестнадцатеричной системе. Если переменная не указана, адрес присваивается автоматически. Используйте эту переменную для отладки программы.
Этот же адрес передается отладчику с помощью следующей команды, которая может быть добавлена в .gdbinit-файл:
add-symbol-file <имя-программы> <адрес-загрузки-программы>
- Если раздел ROMFS должен содержать дополнительные файлы, задайте значение переменной
ROMFS-FILES
. В значении переменной перечислите файлы через пробел. Если вы используете виртуальную файловую систему, необходимо передать файл, указанный в переменнойVFS_ENTITY
. - Добавьте инструкцию импорта шаблона build.mk с помощью следующей команды:
include /opt/KasperskyOS-Community-Edition-<version>/common/build.mk
В файле шаблона build.mk
реализованы следующие цели сборки:
- sim (цель по умолчанию) – запуск загрузочного образа решения с помощью эмулятора QEMU.
При запуске эмулятор QEMU может осуществлять захват мыши, о чем будет написано в заголовке окна эмулятора.
- kos-image – сборка загрузочного образа решения для запуска на целевой аппаратной платформе.
- gdbsim – запуск загрузочного образа решения с возможностью отладки. После старта эмуляции QEMU ожидает старта отладчика. Для этого в другой командной строке необходимо вызвать цель gdb.
Убедитесь, что порт протокола TCP/IP 1234 открыт, например с помощью команды
netstat -anput
.Порт 1234 прослушивается программой gdbserver, которая используется для удаленной отладки приложений и входит в состав эмулятора QEMU.
При использовании отладчика gdb необходимо использовать аппаратные точки останова (hbreak). Эмулятор QEMU, который используется в примерах, запускается с ключом
-enable-kvm
, из-за чего использование обычных точек останова (break) невозможно. - gdb – запуск отладчика. После запуска отладчика для программ, которые требуется отлаживать, выполните следующие команды:
add-symbol-file <имя-программы> <адрес-загрузки-программы>
target remote localhost:1234
Пример
В этом примере используется система сборки make. Помимо действий, выполняемых в шаблоне build.mk, в скрипте сборки необходимо указать программу Hello
и список объектных файлов этой программы. Адрес загрузки указывается для целей отладки решения.
Makefile
# Список программ для сборки.
targets = hello
# Список объектных файлов программы Hello
hello-objects = hello.o hello.edl.o
# Адрес загрузки сущности Hello (в hex)
hello-base = 800000
# Включить шаблон с общими правилами сборки.
include ../common/build.mk
Чтобы запустить систему сборки make, выполните команду make hello
.
Чтобы запустить пример hello, находясь в директории /opt/KasperskyOS-Community-Edition-<version>/examples/hello
, выполните команду make
.
Использование CMake из состава KasperskyOS Community Edition
Система автоматизации сборки CMake
поддерживает кросс-компиляцию приложений. Для выполнения кросс-компиляции с помощью CMake
требуется указать путь к файлу расширения системы сборки (toolchain.cmake
).
Чтобы выполнить кросс-компиляцию приложения для KasperskyOS, задайте значение переменной: DCMAKE_TOOLCHAIN_FILE=/opt/KasperskyOS-Community-Edition-<version>/toolchain/share/toolchain.cmake
В состав KasperskyOS Community Edition входит библиотека platform
, содержащая набор готовых скриптов для системы CMake
.
Чтобы подготовить приложение к отладке:
- В файле CMakeLists.txt задайте значение параметра
LINK_FLAGS
для приложения, которое вы хотите отлаживать, следующим образом:set_target_properties (<имя-приложения> PROPERTIES LINK_FLAGS "-Ttext <адрес-секции-text>")
Скрипт автоматически создает .gdbinit-файлы. В .gdbinit-файлах находится набор команд для отладчика GDB. Этот набор команд определяет, по какому адресу отладчик GDB загружает сущности для отладки.
- Выполните сборку приложения.
Использование собственной системы сборки
Вы можете использовать другие системы сборки или реализовать собственную систему сборки для подготовки загрузочного образа решения.
Для того чтобы подготовить загрузочный образ решения, система сборки должна включать следующие действия:
- Генерацию кода транспортных методов и типов, используемых для формирования, отправки, приема и обработки IPC-сообщений между сущностями, входящими в решение.
Для этого воспользуйтесь компилятором NK. В аргументах команды передайте путь к файлам EDL-, CDL- и IDL-описаний сущностей, компонентов и интерфейсов.
- Сборку всех сущностей, входящих в решение.
Для этого воспользуйтесь кросс-компиляторами, входящими в состав KasperskyOS Community Edition.
- Сборку инициализирующей сущности Einit.
Для генерации кода сущности Einit воспользуйтесь утилитой einit. В аргументах команды передайте путь к файлу файл init-описания (по умолчанию
init.yaml
).Сущность
Einit
затем необходимо собрать с помощью компилятора C, поставляемого в рамках KasperskyOS Community Edition. - Сборку модуля ядра с подсистемой Kaspersky Security System.
Для этого воспользуйтесь скриптом makekss. В аргументах команды передайте путь к файлу конфигурации безопасности (по умолчанию
security.psl
). - Создание образа решения.
Для этого воспользуйтесь скриптом makeimg. В аргументах команды передайте исполняемые ELF-файлы сущностей, модуль ядра с Kaspersky Security System, образ ядра KasperskyOS и любые дополнительные файлы.
Развертывание загрузочного образа решения на целевых устройствах
Чтобы развернуть загрузочный образ решения на целевом устройстве:
- Подключите носитель информации, с которого вы планируете запускать загрузочный образ решения на целевых устройствах.
- Найдите блочное устройство, соответствующее подключенному носителю, например с помощью команды:
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 с этого носителя.
В начало