KasperskyOS Community Edition 1.1

Сборка без использования 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]