KasperskyOS Community Edition 1.3

Примеры в KasperskyOS Community Edition

В дополнение к руководству разработчика в составе KasperskyOS Community Edition SDK поставляются примеры решений на базе KasperskyOS. Примеры находятся в директории /opt/KasperskyOS-Community-Edition-<version>/examples. Каждый пример помещен в отдельную директорию, в которой содержатся:

  • Директории с исходным кодом программ.
  • Директория resources, которая содержит формальную спецификацию компонента решения. Опционально эта директория может содержать файлы, необходимые для работы примера. Например, файлы конфигурации сети: hosts, dhcpcd.conf и ntp.conf.
  • Сценарии сборки решения в виде файлов CMakeLists.txt.
  • Файлы README.md. Эти файлы имеют однотипное содержание и ссылаются на это руководство.
  • [Опционально] Директория vendor, которая содержит библиотеки и их метаданные, необходимые для управления зависимостями в проектах на языке Rust.

Перед запуском примеров на Radxa ROCK 3A необходимо также выполнить сборку драйверов, которые поставляются в составе SDK в виде исходного кода. Инструкцию по сборке драйверов можно найти в описаниях примеров (файлы README.md).

В таблице ниже приведено описание примеров по разработке простейших решений.

Простейшие решения

Директория примера в SDK

Краткое описание примера

Запуск на QEMU

Запуск на Raspberry Pi 4 B

Запуск на Radxa ROCK 3A

hello

Демонстрирует самое простое решение. Программа Hello отправляет сообщение в стандартный вывод ошибок. Подробнее см. "Пример hello".

Да

Да

Да

echo

Демонстрирует взаимодействие программ через IPC. Программа Client отправляет программе Server данные, получает измененные данные обратно и выводит их в стандартный вывод ошибок. Подробнее см. "Пример echo".

Да

Да

Да

ping

Демонстрирует использование политики безопасности решения для управления IPC-взаимодействием между программами. Программа Client вызывает в различной последовательности два интерфейсных метода Ping и Pong, предоставляемых программой Server. Но политика безопасности решения разрешает только чередование вызовов Ping и Pong. Подробнее см. "Пример ping".

Да

Да

Да

hello_from_rust

Демонстрирует, как включить в решение простую программу, разработанную на языке Rust и собранную с использованием системы сборки и менеджера пакетов Cargo. Программа Hello отправляет сообщение в стандартный вывод ошибок. Подробнее см. "Пример hello_from_rust".

Да

Да

Да

hello_corrosion

Демонстрирует, как включить в решение простую программу, разработанную на языке Rust, с использованием Corrosion – набора библиотек для интеграции Rust в CMake-проекты. Программа Hello отправляет сообщение в стандартный вывод ошибок. Подробнее см. "Пример hello_corrosion".

Да

Да

Да

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

Использование файловых систем и сетевого стека в решениях

Директория примера в SDK

Краткое описание примера

Запуск на QEMU

Запуск на Raspberry Pi 4 B

Запуск на Radxa ROCK 3A

embedded_vfs

Демонстрирует, как включить в решение системную программу, реализующую файловые системы и сетевой стек. Программа Client выполняет операции: создание директории, создание и удаление файла, чтение из файла и запись в файл. Подробнее см. "Пример embedded_vfs".

Да

Да

Да

net_with_separate_vfs

Демонстрирует установку соединения между запущенными в KasperskyOS программами через TCP-сокеты с использованием loopback-интерфейса. Программа Client создает TCP-сокет, подключается к серверу через loopback-интерфейс, отправляет серверу данные и закрывает соединение. Программа Server принимает запрос на создание соединения через TCP-сокет, получает данные от клиента, после чего закрывает соединение. Подробнее см. "Пример net_with_separate_vfs".

Да

Да

Да

net2_with_separate_vfs

Демонстрирует установку соединения через TCP-сокеты между программой-клиентом, запущенной в KasperskyOS, и программой-сервером, запущенной в хостовой операционной системе. Программа Client создает TCP-сокет, подключается к серверу, отправляет серверу данные и закрывает соединение. Программа Server принимает запрос на создание соединения через TCP-сокет, получает данные от клиента, после чего закрывает соединение. Подробнее см. "Пример net2_with_separate_vfs".

Да

Да

Да

vfs_extfs

Демонстрирует, как монтировать файловые системы (ext2, ext3, ext4) блочного устройства. Программа FileVfs реализует серверную часть виртуальной файловой системы, предоставляя интерфейс для взаимодействия с файловыми системами и блочными устройствами. Программа Client отправляет запросы через IPC программе FileVfs, чтобы смонтировать файловые системы в указанные директории, и выполнить базовые операции с файлами (создание, запись, чтение и удаление) для проверки корректности монтирования файловых систем. Подробнее см. "Пример vfs_extfs".

Да

Да

Да

multi_vfs_ntpd

Демонстрирует поддержку сетевого протокола NTP (Network Time Protocol). Программа Ntpd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию NTP-клиента, который синхронизирует системное время с NTP-серверами. Программа Client изменяет текущее системное время на время, указанное в макросе. После синхронизации времени программой Ntpd ожидается, что год в полученном системном времени будет отличаться от года, установленного ранее макросом. Подробнее см. "Пример multi_vfs_ntpd".

Да

Да

Да

multi_vfs_dns_client

Демонстрирует использование системы разрешения доменных имен DNS (Domain Name System) в KasperskyOS. Программа Client после проверки сетевого соединения получает информацию о DNS-сервере, используя его полное доменное имя и порт. Далее, выполняет разрешение доменного имени в IP-адрес и проверяет соответствие IP-адреса заранее заданным значениям. Подробнее см. "Пример multi_vfs_dns_client".

Да

Да

Да

multi_vfs_dhcpcd

Демонстрирует поддержку сетевого протокола DHCP (Dynamic Host Configuration Protocol) в KasperskyOS. Программа Dhcpcd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию DHCP-клиента, который выполняет настройку сетевых интерфейсов. Программа Client получает сведения о настроенных сетевых интерфейсах и выводит их в стандартный вывод ошибок. Подробнее см. "Пример multi_vfs_dhcpcd".

Да

Да

Да

mqtt_publisher

Демонстрирует поддержку протокола обмена сообщениями MQTT (Message Queue Telemetry Transport) в KasperskyOS. Программа Publisher представляет собой реализацию MQTT-издателя, запущенного в KasperskyOS, который в цикле публикует текущее время. MQTT-подписчик, запущенный в хостовой операционной системе, выводит сообщения, полученные от MQTT-издателя, в стандартный вывод. Подробнее см. "Пример mqtt_publisher".

Да

Да

Да

mqtt_subscriber

Демонстрирует поддержку протокола обмена сообщениями MQTT (Message Queue Telemetry Transport) в KasperskyOS. Программа Subscriber представляет собой реализацию MQTT-подписчика, запущенного в KasperskyOS, который выводит сообщения, полученные от MQTT-издателя, в стандартный вывод. MQTT-издатель запускается в хостовой операционной системе. Подробнее см. "Пример mqtt_subscriber".

Да

Да

Да

В таблице ниже приведено описание примеров использования драйверов, поставляемых в составе KasperskyOS Community Edition, для работы с аппаратными интерфейсами GPIO, I2C, UART, SPI и USB.

Использование драйверов в решениях на базе KasperskyOS

Директория примера в SDK

Краткое описание примера

Запуск на QEMU

Запуск на Raspberry Pi 4 B

Запуск на Radxa ROCK 3A

gpio_input

Демонстрирует использование драйвера GPIO (General-Purpose Input/Output) для ввода через GPIO-пины. Программа Client настраивает GPIO-пины в режим ввода и считывает их значения. Подробнее см. "Пример gpio_input".

Нет

Да

Да

gpio_output

Демонстрирует использование драйвера GPIO для вывода через GPIO-пины. Программа Client настраивает GPIO-пины в режим вывода и переводит их в состояние логической единицы (появление на пине напряжения), а затем в состояние логического нуля (напряжение на пине отсутствует). Подробнее см. "Пример gpio_output".

Нет

Да

Да

gpio_interrupt

Демонстрирует использование драйвера GPIO для проверки работы прерываний для GPIO-пинов. Программа Client настраивает GPIO-пины в режим ввода и регистрирует функции обработки прерываний для всех GPIO-пинов, кроме указанных в списке исключений. В случае срабатывания прерывания на GPIO-пине, программа Client снимает функцию-обработчик для этого GPIO-пина. Программа завершится, когда прерывание произойдет на каждом GPIO-пине. Подробнее см. "Пример gpio_interrupt".

Нет

Да

Да

gpio_echo

Демонстрирует использование драйвера GPIO для проверки функциональности ввода/вывода GPIO-пинов, а также работу прерываний для GPIO пинов. Программа Client настраивает два связанных между собой пина: один пин в режим ввода, второй в режим вывода. Далее регистрирует обработчик прерываний для пина ввода и несколько раз изменяет состояние пина вывода, ожидая срабатывания обработчика прерываний. Подробнее см. "Пример gpio_echo".

Нет

Да

Да

i2c_ds1307_rtc

Демонстрирует использование драйвера I2C (Inter-Integrated Circuit) на аппаратной платформе Raspberry PI 4 B. Программа I2cClient проверяет работу модуля часов реального времени на микросхеме DS1307Z через интерфейс драйвера I2C, устанавливая и проверяя дату на устройстве. Подробнее см. "Пример i2c_ds1307_rtc".

Нет

Да

Нет

i2c_bm8563_rtc

 

Демонстрирует использование драйвера I2C (Inter-Integrated Circuit) на аппаратной платформе Radxa ROCK 3A. Программа Bm8653 проверяет работу часов реального времени на микросхеме BM8563 через интерфейс драйвера I2C, устанавливая и проверяя дату на устройстве. Подробнее см. "Пример i2c_bm8563_rtc".

Нет

Нет

Да

uart

Демонстрирует использование драйвера UART (Universal Asynchronous Receiver-Transmitter). Программа Client выполняет операции с UART: инициализацию, открытие порта, отправку данных и закрытие порта. Подробнее см. "Пример uart".

Да

Да

Да

spi_check_regs

Демонстрирует использование драйвера SPI (Serial Peripheral Interface). Программа Client открывает SPI-канал, выводит его параметры в стандартный вывод и устанавливает требуемый режим работы. Далее программа посылает по SPI-каналу последовательность данных и ожидает получения идентификатора контроллера ATTiny, установленного на плате Sense HAT. Подробнее см. "Пример spi_check_regs".

Нет

Да

Да

barcode_scanner

Демонстрирует использование драйвера USB (Universal Serial Bus) с помощью библиотеки libevdev. Программа BarcodeScanner использует библиотеку libevdev для взаимодействия со сканером штрихкодов, подключенным к USB-порту Raspberry Pi 4 B. Подробнее см. "Пример barcode_scanner".

Нет

Да

Да

watchdog_system_reset

Демонстрирует использование драйвера Watchdog для мониторинга состояния KasperskyOS и автоматического перезапуска Raspberry Pi 4 B. Программа Client взаимодействует со сторожевым таймером: изменяет значение таймера по умолчанию на новое и запускает таймер, несколько раз сбрасывает таймер, ожидает перезагрузки операционной системы при срабатывании таймера. Подробнее см. "Пример watchdog_system_reset".

Нет

Да

Нет

mass_storage

Демонстрирует использование драйвера UsbMassStorage для работы с внешними USB-накопителем, подключенным к USB-порту Raspberry Pi 4 B. Программа FileVfs реализует серверную часть виртуальной файловой системы, предоставляя интерфейс для взаимодействия с файловыми системами и блочными устройствами. Программа Client отправляет запросы через IPC программе FileVfs, чтобы смонтировать файловые системы в указанные директории, и выполнить базовые операции с файлами (создание, запись, чтение и удаление) для проверки корректности монтирования файловых систем на внешнем USB-накопителе. Подробнее см. "Пример mass_storage".

Нет

Да

Да

can_loopback

Демонстрирует использование драйвера CAN на аппаратной платформе Radxa ROCK 3A, когда нет необходимости подключать дополнительную периферию в виде CAN-трансиверов. В примере производится настройка CAN-порта, после чего происходит отправка CAN-пакета. Полученный CAN-пакет проверяется на соответствие отправленному CAN-пакету. Подробнее см. "Пример can_loopback".

Нет

Нет

Да

can2can

Демонстрирует использование драйвера CAN на аппаратной платформе Radxa ROCK 3A для пересылки сообщения между двумя CAN-интерфейсами. В отличие от примера can_loopback, где используется только один CAN-интерфейс и нет необходимости в дополнительном оборудовании, этот пример требует наличия двух CAN-трансиверов подключенных к линиям CAN_H и CAN_L. Подробнее см. "Пример can2can".

Нет

Нет

Да

adc_hello

Демонстрирует использование драйвера Sensors для проверки функциональности АЦП на аппаратной платформе Radxa ROCK 3A. Программа AdcHello считывает поданное на канал АЦП напряжение, нормализует его и выводит в стандартный вывод. Подробнее см. "Пример adc_hello".

Нет

Нет

Да

В таблице ниже представлены примеры использования поставляемых в составе KasperskyOS Community Edition библиотек для выполнения различных функций, таких как журналирование, применение регулярных выражений, обмен сообщениями через IPC и тестирование производительности.

Использование библиотек в решениях

Директория примера в SDK

Краткое описание примера

Запуск на QEMU

Запуск на Raspberry Pi 4 B

Запуск на Radxa ROCK 3A

shared_libs

Демонстрирует использование динамических и статических библиотек в KasperskyOS. Программа Client вызывает функции из: статической библиотеки; динамической библиотеки, скомпонованной вместе с программой; динамической библиотеки, загружаемой в память при вызове функции dlopen() интерфейса POSIX. Подробнее см. "Пример shared_libs".

Да

Да

Да

koslogger

Демонстрирует использование библиотеки журналирования spdlog в KasperskyOS с помощью библиотеки-обертки KOSLogger. Программа Client записывает сообщения в журнал, который сохраняется на SD-карте при запуске примера на Raspberry Pi 4 B или в файле образа sdcard0.img при запуске примера на QEMU. Сообщения записываются с использованием разных уровней журналирования. Подробнее см. "Пример koslogger".

Да

Да

Да

pcre

Демонстрирует использование библиотеки pcre для работы с регулярными выражениями в KasperskyOS. Программа Client ищет все вхождения требуемого слова в заданном текстовом фрагменте и подсчитывает количество этих вхождений. Подробнее см. "Пример pcre".

Да

Да

Да

iperf_separate_vfs

Демонстрирует использование библиотеки iperf для тестирования производительности сети. Программа Server настраивает сетевой интерфейс, создает и запускает тест производительности сети с использованием библиотеки iperf. Подробнее см. "Пример iperf_separate_vfs".

Да

Да

Да

messagebus

Демонстрирует использование компонента MessageBus в KasperskyOS. В этом примере программа-издатель Publisher, программы-подписчики SubscriberA и SubscriberB используют компонент MessageBus для обмена сообщениями через IPC. Подробнее см. "Пример messagebus".

Да

Да

Да

pal_tests

Демонстрирует использование PAL (Policy Assertion Language) при написании тестов политики безопасности решения на базе KasperskyOS. Тесты проверяют политику безопасности решения до начала разработки программного кода, основываясь на формальных спецификациях компонентов решения. Подробнее см. "Пример pal_tests".

Да

Да

Да

В таблице ниже представлены примеры использования паттернов безопасности в KasperskyOS.

Использование паттернов безопасности в решениях

Директория примера в SDK

Краткое описание примера

Запуск на QEMU

Запуск на Raspberry Pi 4 B

Запуск на Radxa ROCK 3A

secure_logger

Демонстрирует использование паттерна Distrustful Decomposition для решения задачи разделения чтения и записи в журнал событий. Программа Application формирует сообщение и передает его через IPC программе Logger. Программа Logger принимает сообщение и записывает его в журнал событий, расположенный на диске. Программа Reader читает сообщение из журнала событий и передает его через IPC программе LogViewer. Программа LogViewer выводит сообщение в стандартный вывод. Подробнее см. "Пример secure_logger".

Да

Да

Да

separate_storage

Демонстрирует использование паттерна Distrustful Decomposition для решения задачи раздельного хранения данных для доверенных и недоверенных программ. Пример содержит две программы: UserManager и CertificateManager. Каждая из этих программ использует собственный экземпляр программы VFS для доступа к отдельной файловой системе. При этом каждый экземпляр программы VFS включает в себя драйвер блочного устройства, связанный с отдельным логическим разделом диска. Программа UserManager не имеет доступа к файловой системе программы CertificateManager и наоборот. Подробнее см. "Пример separate_storage".

Да

Да

Да

defer_to_kernel

Демонстрирует использование паттернов Defer to Kernel и Policy Decision Point: гарантия изоляции запущенных программ (процессов) ядром KasperskyOS. В этом примере программы ValidPictureClient и NonValidPictureClient обращаются к программе PictureManager для получения информации. Но только программе ValidPictureClient разрешено взаимодействие с программой PictureManager. Подробнее см. "Пример defer_to_kernel".

Да

Да

Да

device_access

Демонстрирует использование паттерна Privilege Separation, при котором авторизация и доступ к данным обеспечиваются разными программами. Программа Device обращается к программе Storage для получения информации и к программе LoginManager для авторизации. Программа Device может обращаться к программе Storage только после успешной авторизации в программе LoginManager. Подробнее см. "Пример device_access".

Да

Да

Да

secure_login

Демонстрирует использование паттерна Information Obscurity: возможность передачи критической для системы информации через недоверенную среду. Веб-сервер Civetweb взаимодействует с браузером, обслуживая запросы на аутентификацию, при этом передача данных между браузером и сервером осуществляется через TLS-терминатор для шифрования трафика. Программа AuthService генерирует криптографические ключи для шифрования паролей по алгоритму Диффи-Хеллмана. Подробнее см. "Пример secure_login".

Да

Да

Да

В начало
[Topic additional_examples]

Пример hello

Код hello.c выглядит привычным и простым для разработчика на языке C – он полностью совместим с POSIX:

hello.c

#include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { fprintf(stderr,"Hello world!\n"); return EXIT_SUCCESS; }

Скомпилируйте этот код с использованием aarch64-kos-clang (входит в состав средств разработки KasperskyOS Community Edition):

aarch64-kos-clang -o Hello hello.c

Имя программы (а значит и имя исполняемого файла) должно начинаться с заглавной буквы.

EDL-описание класса процессов Hello

Статическое описание программы Hello состоит из единственного файла Hello.edl, в котором необходимо прописать имя класса процессов:

Hello.edl

/* После ключевого слова "entity" указано имя класса процессов. */ entity Hello

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

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

При загрузке KasperskyOS ядро запускает программу с именем Einit. Программа Einit запускает все остальные программы, входящие в решение, то есть служит инициализирующей программой.

В составе пакета инструментов KasperskyOS Community Edition поставляется утилита einit, которая позволяет сгенерировать код инициализирующей программы (einit.c) на основе init-описания. В приведенном ниже примере файл с init-описанием называется init.yaml, хотя может иметь любое имя.

Подробнее см. "Запуск процессов".

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

init.yaml

entities: # Запустить программу "Hello". - name: Hello

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

Пример hello содержит простейшую политику безопасности решения (security.psl), разрешающую любые взаимодействия.

Модуль безопасности (ksm.module) собирается на основе security.psl.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/hello

Сборка и запуск примера

См. "Сборка и запуск примеров".

Общая схема сборки примера hello выглядит следующим образом:

В начало
[Topic appendix_hello_example]

Пример echo

Пример echo демонстрирует использование IPC-транспорта.

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

Пример echo описывает простейший случай взаимодействия двух программ:

  1. Программа Client передает программе Server число (value).
  2. Программа Server изменяет это число и передает новое число (result) программе Client.
  3. Программа Client выводит число result на экран.

Чтобы организовать такое взаимодействие программ, потребуется:

  1. Соединить программы Client и Server, используя init-описание.
  2. Реализовать на сервере интерфейс с единственным методом Ping, который имеет один входной аргумент – исходное число (value) и один выходной аргумент – измененное число (result).

    Описание метода Ping на языке IDL:

    Ping(in UInt32 value, out UInt32 result);

  3. Создать файлы статических описаний на языках EDL, CDL и IDL. С помощью компилятора NK сгенерировать файлы, содержащие транспортные методы и типы (прокси-объект, диспетчеры и т.д.).
  4. В коде программы Client инициализировать все необходимые объекты (транспорт, прокси-объект, структуру запроса и др.) и вызвать интерфейсный метод.
  5. В коде программы Server подготовить все необходимые объекты (транспорт, диспетчер компонента и диспетчер программы и др.), принять запрос от клиента, обработать его и отправить ответ.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/echo

Пример echo состоит из следующих исходных файлов:

  • client/src/client.c – реализация программы Client;
  • server/src/server.c – реализация программы Server;
  • resources/Server.edl, resources/Client.edl, resources/Responder.cdl, resources/Pingable.idl – статические описания;
  • init.yaml – init-описание.

Сборка и запуск примера

См. "Сборка и запуск примеров".

Схема сборки примера echo выглядит следующим образом:

В начало
[Topic appendix_echo_example]

Пример ping

Пример ping демонстрирует использование политики безопасности решения для управления взаимодействиями между программами.

Пример ping включает в себя четыре программы: Client, Server, KlogEntity и KlogStorageEntity.

Программа Server предоставляет два идентичных метода Ping и Pong, которые получают число и возвращают измененное число:

Ping(in UInt32 value, out UInt32 result); Pong(in UInt32 value, out UInt32 result);

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

Системные программы KlogEntity, KlogStorageEntity выполняют аудит безопасности.

Транспортная часть примера ping практически аналогична таковой для примера echo. Единственное отличие состоит в том, что в примере ping используется два метода (Ping и Pong), а не один.

Политика безопасности решения в примере ping

Политика безопасности решения в этом примере разрешает запуск ядра KasperskyOS и программы Einit, которой разрешено запускать все программы в решении. Обращениями к программе Server управляют методы модели безопасности Flow.

Конечный автомат, описанный в конфигурации объекта request_state модели безопасности Flow, имеет два состояния: not_sent и sent. Исходное состояние – not_sent. Разрешены только переходы из not_sent в sent и обратно.

При вызове методов Ping и Pong проверяется текущее состояние объекта request_state. В состоянии not_sent разрешен только вызов Ping, при этом состояние изменится на sent. Аналогично, в состоянии sent разрешен только вызов Pong, при этом состояние изменится на not_sent.

Таким образом, методы Ping и Pong разрешено вызывать только по очереди.

Фрагмент файла security.psl

/* Политика безопасности решения для демонстрации использования модели * безопасности Flow в примере ping */ /* Включение PSL-файлов с формальными представлениями моделей безопасности * Base и Flow */ use nk.base._ use nk.flow._ /* Включение EDL-файлов */ use EDL Einit use EDL ping.Client use EDL ping.Server /* Создание объекта модели безопасности Flow */ policy object request_state : Flow { type States = "not_sent" | "sent" config = { states : [ "not_sent", "sent" ], initial : "not_sent", transitions : { "not_sent" : [ "sent" ], "sent" : [ "not_sent" ] } } } /* При запуске программой Einit программы Server * устанавливается начальное состояние конечного автомата */ execute src=Einit dst=ping.Server method=main { request_state.init { sid: dst_sid } } /* При вызове клиентом класса ping.Client метода Ping службы controlimpl.connectionimpl * сервера класса ping.Server проверяется, что объект request_state находится * в состоянии "not_sent". Если это так, то получение запроса разрешается и * объект request_state устанавливается в состояние "sent". */ request src=ping.Client dst=ping.Server endpoint=controlimpl.connectionimpl method=Ping { request_state.allow { sid: dst_sid, states: [ "not_sent" ] } request_state.enter { sid: dst_sid, state: "sent" } } /* При вызове клиентом класса ping.Client метода Pong службы controlimpl.connectionimpl * сервера класса ping.Server проверяется, что объект request_state находится * в состоянии "sent". Если это так, то получение запроса разрешается и * объект request_state устанавливается в состояние "not_sent". */ request src=ping.Client dst=ping.Server endpoint=controlimpl.connectionimpl method=Pong { request_state.allow { sid: dst_sid, states: [ "sent" ] } request_state.enter { sid: dst_sid, state: "not_sent" } } /* Серверу класса ping.Server разрешено отвечать на обращения клиента класса ping.Client, * который вызывает методы Ping и Pong службы controlimpl.connectionimpl. */ response src=ping.Server dst=ping.Client endpoint=controlimpl.connectionimpl { match method=Ping { grant () } match method=Pong { grant () } }

Описание политики безопасности в примере ping также содержит секцию тестов политики безопасности решения.

Пример такой политики см. в секции "Пример 2" раздела "Примеры тестов политик безопасности решений на базе KasperskyOS".

Полное описание политики безопасности примера ping находится в файлах security.psl.in и core.psl по следующему пути: /opt/KasperskyOS-Community-Edition-<version>/examples/ping/einit/src.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/ping

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic appendix_ping_example]

Пример net_with_separate_vfs

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

Пример состоит из программ Client и Server, связанных TCP-сокетом с использованием loopback-интерфейса. В коде программ используются стандартные POSIX-функции.

Чтобы соединить программы сокетом через loopback, они должны использовать один экземпляр сетевого стека, то есть взаимодействовать с "общей" программой VFS (в этом примере программа называется VfsNet).

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/net_with_separate_vfs

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic net_with_sep_vfs_example]

Пример net2_with_separate_vfs

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

Пример net2_with_separate_vfs является видоизмененным примером net_with_separate_vfs. В отличие от примера net_with_separate_vfs, в этом примере программа взаимодействует по сети не с другой программой, запущенной в KasperskyOS, а с внешним сервером.

Пример состоит из программы Client, запущенной в KasperskyOS под QEMU или на Raspberry Pi, и программы Server, запущенной в хостовой операционной системе Linux. Программа Client и программа Server связаны TCP-сокетом. В коде программы Client используются стандартные функции POSIX.

Чтобы соединить программы Client и Server сокетом, программа Client должна взаимодействовать с программой VfsNet. Программа VfsNet при сборке компонуется с сетевым драйвером, который обеспечит взаимодействие с программой Server, запущенной в Linux.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/net2_with_separate_vfs

IP-адрес программы Server задан в файле ./CMakeList.txt переменной SERVER_IP и имеет значение по умолчанию 10.0.2.2. Значения по умолчанию для программы Client (имя интерфейса, адрес, сетевая маска и адрес шлюза) взяты из файла /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include/kos_net.h. Вы можете изменить эти значения в соответствии с конфигурацией вашей сети в файле client/src/client.c, расположенном в директории примера.

Сборка и запуск примера

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition. См. "Сборка и запуск примеров".

Для корректной работы примера необходимо запустить программу Server в хостовой операционной системе Linux или на компьютере, подключенном к Raspberry Pi.

Если пример запускается в QEMU, то программа Server будет собрана и запущена в хостовой операционной системе Linux автоматически скриптом cross-build.sh. После выполнения сборки, исполняемый файл server программы Server находится в следующей директории:

/opt/KasperskyOS-Community-Edition-<version>/examples/net2_with_separate_vfs/build/host/server/

Если пример запускается на Raspberry Pi, то необходимо собрать исполняемый файл программы Server самостоятельно, выполнив следующие команды:

$ cd net2_with_separate_vfs/server/src/ $ gcc -o server server.c
В начало
[Topic net2_with_sep_vfs_example]

Пример embedded_vfs

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

В этом примере программа Client полностью инкапсулирует реализацию VFS из KasperskyOS Community Edition. Это позволяет избавиться от использования IPC для всех стандартных функций ввода-вывода (stdio.h, socket.h и так далее), например, для отладки или повышения производительности.

Программа Client тестирует следующие операции:

  • создание директории;
  • создание и удаление файла;
  • чтение из файла и запись в файл.

Поставляемые ресурсы

Для QEMU в пример входит образ жесткого диска с файловой системой FAT32 – hdd.img.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/embedded_vfs

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic embedded_vfs_example]

Пример vfs_extfs

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

Программа FileVfs реализует серверную часть виртуальной файловой системы, предоставляя интерфейс для взаимодействия с файловыми системами и блочными устройствами. Программа Client отправляет запросы через IPC программе FileVfs, чтобы смонтировать файловые системы (ext2, ext3, ext4) в указанные директории, и выполнить базовые операции с файлами (создание, запись, чтение и удаление) для проверки корректности монтирования файловых систем.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/vfs_extfs

Сборка и запуск примера

См. "Сборка и запуск примеров".

Подготовка SD-карты для запуска на Raspberry Pi 4 B

Для запуска примера vfs_extfs на Raspberry Pi 4 B необходимо, чтобы SD-карта, помимо загрузочного раздела с образом решения, также содержала 3 дополнительных раздела с файловыми системами ext2, ext3 и ext4 соответственно.

В начало
[Topic vfs_extfs_example]

Пример multi_vfs_ntpd

Пример демонстрирует поддержку сетевого протокола NTP (Network Time Protocol) для синхронизации системного времени в KasperskyOS.

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_ntpd

Список программ

  • Client – прикладная программа, изменяющая текущее системное время.
  • Ntpd – системная программа, реализующая NTP-клиент, который синхронизирует системное время с NTP-серверами.
  • Dhcpcd – системная программа, реализующая DHCP-клиент.
  • VfsSdCardFs – системная программа, поддерживающая файловую систему SD-карт.
  • VfsNet – системная программа, поддерживающая сетевые протоколы.
  • EntropyEntity – системная программа, реализующая генератор случайных чисел.
  • DNetSrv – драйвер сетевой карты.
  • SDCard – драйвер SD-карты.
  • BSP – драйвер для настройки параметров мультиплексирования пинов (pinmux).
  • Bcm2711MboxArmToVc – драйвер для работы с сопроцессором VideoCore (VC6) через технологию mailbox для Raspberry Pi 4 B.

Описание инициализации

Файл описания инициализации решения init.yaml генерируется в процессе сборки решения на основе шаблона:

./einit/src/init.yaml.in

Макрос @INIT_Client_ENTITY_CONNECTIONS+@ в шаблоне init.yaml.in при сборке примера заменяется в файле init.yaml на список IPC-каналов со всеми системными программами, с которыми скомпонована программа Client. Этот список дополняет вручную заданные IPC-каналы в шаблоне init.yaml.in.

Макрос @INIT_FileVfs_ENTITY_CONNECTIONS@ при сборке примера заменяется в файле init.yaml на список IPC-каналов со всеми системными программами, с которыми скомпонована программа FileVfs.

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне init.yaml.in при сборке заменяется в файле init.yaml на список системных программ, с которыми скомпонованы прикладные программы. Этот список содержит IPC-каналы системных программ, параметры запуска функции main() и значения переменных окружения.

Подробнее см. "Шаблон init.yaml.in".

Описание политики безопасности

Файл security.psl содержит описание политики безопасности решения и генерируется в процессе сборки решения на основе шаблона:

./einit/src/security.psl.in

Ресурсы

  • В директории ./resources/edl расположен файл формальной спецификации компонента решения на базе KasperskyOS Client.edl.
  • В директории ./resources/hdd/etc расположены файлы конфигурации для программ VfsNet, Dhcpcd и Ntpd: hosts, dhcpcd.conf и ntp.conf соответственно.

Сценарий работы

Программа Client изменяет текущее системное время на время, указанное в макросе. После синхронизации времени программой Ntpd ожидается, что год в полученном системном времени будет отличаться от года, установленного ранее макросом.

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic multi_vfs_ntpd_example]

Пример multi_vfs_dns_client

Этот пример показывает как использовать внешний dns-сервис в KasperskyOS.

Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении:

  • для работы с сетью используется программа VfsNet;
  • для работы с файловой системой используется программа VfsSdCardFs.

Программа Client использует стандартные функции библиотеки libc для обращения ко внешнему dns-сервису, которые транслируются в обращения к программе VfsNet по IPC.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Поставляемые ресурсы

  • В директории ./resources/edl расположен файл Client.edl, который содержит статическое описание программы Client.
  • В директории ./resources/hdd/etc расположены файлы конфигурации для программ VfsNet и Dhcpcd: hosts и dhcpcd.conf соответственно.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_dns_client

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic multi_vfs_dns_client_example]

Пример multi_vfs_dhcpcd

Пример использования программы kl.rump.Dhcpcd.

Программа Dhcpcd представляет собой реализацию DHCP-клиента, который в фоновом режиме получает параметры сетевых интерфейсов от внешнего DHCP-сервера и передает их виртуальной файловой системе (далее VFS).

Пример также демонстрирует использование разных VFS в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:

  • Для работы с сетью используется программа VfsNet.
  • Для работы с файловой системой используется программа VfsSdCardFs.

Программа Client использует стандартные функции библиотеки libc для получения информации о сетевых интерфейсах (ioctl), которые транслируются в обращения к VFS по IPC.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Поставляемые ресурсы

Директория ./resources/hdd/etc содержит файлы конфигурации для программ VFS и Dhcpcd. Для конфигурации программы Dhcpcd используется стандартный синтаксис dhcpcd.conf.

В корневом файле CMakeLists.txt задаются значения переменных, которые определяют выбор файла конфигурации:

  • DHCPCD_FALLBACK

    Динамическое получение параметров сетевых интерфейсов от внешнего DHCP-сервера с переходом на статическое задание параметров в случае недоступности DHCP-сервера. Значение используется по умолчанию.

  • DHCPCD_DYNAMIC

    Динамическое получение параметров сетевых интерфейсов от внешнего DHCP-сервера.

  • DHCPCD_STATIC

    Статическое задание параметров сетевых интерфейсов.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_dhcpcd

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic multi_vfs_dhcpd_example]

Пример mqtt_publisher (Mosquitto)

Пример использования протокола MQTT в KasperskyOS.

В этом примере MQTT-подписчик должен быть запущен в хостовой операционной системе, а MQTT-издатель в KasperskyOS. Программа Publisher представляет собой реализацию MQTT-издателя, который публикует текущее время с интервалом 5 секунд.

В результате успешного запуска и работы примера MQTT-подписчик, запущенный в хостовой операционной системе, выведет сообщение "received PUBLISH" с топиком "datetime".

Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении:

  • для работы с сетью используется программа VfsNet;
  • для работы с файловой системой используется программа VfsSdCardFs.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Запуск Mosquitto

Для запуска этого примера MQTT брокер Mosquitto должен быть установлен и запущен в хостовой системе. Для установки и запуска Mosquitto выполните следующие команды:

$ sudo apt install mosquitto mosquitto-clients $ sudo /etc/init.d/mosquitto start

Для запуска MQTT-подписчика в хостовой системе выполните следующую команду:

$ mosquitto_sub -d -t "datetime"

Поставляемые ресурсы

  • В директории ./resources/edl расположен файл Publisher.edl, который содержит статическое описание программы Publisher.
  • В директории ./resources/hdd/etc расположены файлы конфигурации для программ VfsNet, Dhcpcd и Ntpd: hosts, dhcpcd.conf и ntp.conf соответственно.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/mqtt_publisher

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic mqtt_publisher_example]

Пример mqtt_subscriber (Mosquitto)

Пример использования протокола MQTT в KasperskyOS.

В этом примере MQTT-издатель должен быть запущен в хостовой операционной системе, а MQTT-подписчик в KasperskyOS. Программа Subscriber представляет собой реализацию MQTT-подписчика.

В результате успешного запуска и работы примера MQTT-подписчик, запущенный в KasperskyOS, выведет сообщение "Got message with topic: my/awesome/topic, payload: hello".

Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении:

  • для работы с сетью используется программа VfsNet;
  • для работы с файловой системой используется программа VfsSdCardFs.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Запуск Mosquitto

Для запуска этого примера MQTT брокер Mosquitto должен быть установлен и запущен в хостовой системе. Для установки и запуска Mosquitto выполните следующие команды:

$ sudo apt install mosquitto mosquitto-clients $ sudo /etc/init.d/mosquitto start

Для запуска MQTT-издателя в хостовой системе выполните следующую команду:

$ mosquitto_pub -t "my/awesome/topic" -m "hello"

Поставляемые ресурсы

  • В директории ./resources/edl расположен файл Subscriber.edl, который содержит статическое описание программы Subscriber.
  • В директории ./resources/hdd/etc расположены файлы конфигурации для программ VfsNet, Dhcpcd и Ntpd: hosts, dhcpcd.conf и ntp.conf соответственно.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/mqtt_subscriber

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic mqtt_subscriber_example]

Пример gpio_input

Пример использования драйвера GPIO.

Этот пример позволяет проверить функциональность ввода GPIO пинов. Общее количество пинов на плате задается макросом GPIO_PIN_NUM. Все пины, кроме указанных в массиве ExceptionPinArr, по умолчанию ориентированы на ввод, напряжение на пинах согласуется с состоянием регистров подтягивающих резисторов. Состояния всех пинов будут последовательно считаны, сообщения о состояниях пинов будут выведены в консоль. Задержка между считываниями смежных пинов определяется макросом DELAY_S (время указывается в секундах).

ExceptionPinArr - массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.

При сборке и запуске этого примера на аппаратных платформах Raspberry Pi 4 или Radxa ROCK 3a ошибка не возникает.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_input

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic gpio_input_example]

Пример gpio_output

Пример использования драйвера GPIO.

Этот пример позволяет проверить функциональность вывода GPIO пинов. Общее количество пинов на плате задается макросом GPIO_PIN_NUM. Все пины, кроме указанных в массиве ExceptionPinArr, будут настроены на вывод. Каждый пин будет последовательно переведен в состояние логической единицы (появление на пине напряжения), а затем в состояние логического нуля. Задержка между изменениями состояния пинов задается макросом DELAY_S (время указывается в секундах).

ExceptionPinArr – массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.

При сборке и запуске этого примера на аппаратных платформах Raspberry Pi 4 или Radxa ROCK 3a ошибка не возникает.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_output

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic gpio_output_example]

Пример gpio_interrupt

Пример использования драйвера GPIO.

Этот пример позволяет проверить функциональность прерываний для GPIO пинов. Общее количество пинов на плате задается макросом GPIO_PIN_NUM. В битовой маске pinsBitmap пины из массива ExceptionPinArr помечаются отработавшими, чтобы в дальнейшем пример мог корректно завершиться. Все пины, кроме указанных в массиве ExceptionPinArr, переводятся в состояние PINS_MODE. Для всех пинов, кроме указанных в массиве ExceptionPinArr, будет зарегистрирована функция обработки прерывания.

В бесконечном цикле происходит проверка условия равенства битовой маски pinsBitmap битовой маске окончания работы примера DONE_BITMASK (соответствует условию, когда прерывание произошло на каждом GPIO пине). Далее в этом цикле вызывается функция обработчик прерывания. Если прерывание происходит впервые на пине, который не указан в массиве ExceptionPinArr, функция обработки прерывания получает это событие с помощью функции GpioGetEvent. Соответствующий пин в битовой маске pinsBitmap помечается отработавшим. Обнаружение прерываний на этом пине отключается вызовом функции GpioReleaseMode.

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

На некоторых пинах GPIO могут также присутствовать внешние подтягивающие резисторы (например, в ревизиях 1.4, 1.5 платформы Raspberry Pi 4 B они есть на пинах GPIO2 и GPIO3). При наличии таких резисторов, более слабые внутренние резисторы не позволят притянуть такие пины к 0.

Прерывания для событий GPIO_EVENT_LOW_LEVEL и GPIO_EVENT_HIGH_LEVEL не поддерживаются.

ExceptionPinArr – массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.

При сборке и запуске этого примера на аппаратных платформах Raspberry Pi 4 или Radxa ROCK 3a ошибка не возникает.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_interrupt

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic gpio_interrupt_example]

Пример gpio_echo

Пример использования драйвера GPIO.

Этот пример позволяет проверить функциональность ввода/вывода GPIO пинов, а также работу GPIO прерываний. При проверке используется порт gpio0. Пин вывода (номер пина задается в макросе GPIO_PIN_OUT) следует соединить с пином ввода (GPIO_PIN_IN). Устанавливается конфигурация для пина вывода (GPIO_PIN_OUT), а также для пина ввода (GPIO_PIN_IN). Конфигурация пина ввода указана в макросе IN_MODE. Регистрируется обработчик прерываний для пина ввода. Несколько раз изменяется состояние пина вывода. В случае корректной работы примера, при изменении состояния пина вывода должен вызываться обработчик прерываний, который выводит состояние пина ввода, при этом состояния пина вывода и пина ввода должны совпадать.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.

При сборке и запуске этого примера на аппаратных платформах Raspberry Pi 4 или Radxa ROCK 3a ошибка не возникает.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_echo

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic gpio_echo_example]

Пример koslogger

Пример демонстрирует использование библиотеки spdlog в KasperskyOS с помощью библиотеки-обертки KOSLogger.

В этом примере программа Client создает записи журнала, которые сохраняются на SD-карте (в случае запуска примера на Raspberry Pi) или в файле образа build/einit/sdcard0.img (при запуске примера на QEMU).

Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:

  • Для работы с сетью используется программа VfsNet.
  • Для работы с файловой системой используется программа VfsSdCardFs.

Программа kl.Ntpd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию ntp-клиента, который в фоновом режиме получает параметры времени от внешних ntp-серверов и передает их ядру KasperskyOS.

Программа kl.rump.Dhcpcd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию DHCP-клиента, который в фоновом режиме получает параметры сетевых интерфейсов от внешнего DHCP-сервера и передает их виртуальной файловой системе.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/koslogger

Сборка и запуск примера

См. "Сборка и запуск примеров".

Для корректной работы примера koslogger на Raspberry Pi после сборки примера и подготовки загрузочной SD-карты требуется выполнить следующие действия:

  • создать директорию /lib на загрузочной SD-карте, если этой директории не существует;
  • скопировать в директорию /lib на загрузочной SD-карте содержимое директории build/hdd/lib, которая генерируется во время сборки примера.
В начало
[Topic appendix_koslogger_example]

Пример pcre

Пример демонстрирует использование библиотеки pcre в KasperskyOS.

В этом примере программа Client использует библиотеку pcre и выводит результаты в консоль.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/pcre

Сборка и запуск примера

См. "Сборка и запуск примеров".

Для корректной работы примера pcre на Raspberry Pi после сборки примера и подготовки загрузочной SD-карты требуется выполнить следующие действия:

  • создать директорию /lib на загрузочной SD-карте, если этой директории не существует;
  • скопировать в директорию /lib на загрузочной SD-карте содержимое директории build/hdd/lib, которая генерируется во время сборки примера.
В начало
[Topic appendix_pcre_example]

Пример messagebus

Пример демонстрирует использование компонента MessageBus в KasperskyOS.

В этом примере программы Publisher, SubscriberA и SubscriberB используют компонент MessageBus для обмена сообщениями:

messagebus_example

Пример использования компонента MessageBus в решении на базе KasperskyOS

Компонент MessageBus реализует шину сообщений, которая обеспечивает прием, распределение и доставку сообщений между программами. Использование шины сообщений в решениях на базе KasperskyOS позволяет, например, легко масштабировать рассылку сообщений для большего количества подписчиков. Шина сообщений может обрабатывать большие объемы сообщений и распределять их эффективно между получателями.

Уровень журналирования для компонента MessageBus устанавливается переменной окружения LOG_LEVEL, которая задана в файле ./einit/CMakeLists.txt. Для этой переменной допустимы следующие значения:

  • LOG_TRACE
  • LOG_DEBUG
  • LOG_INFO (значение по умолчанию)
  • LOG_WARNING
  • LOG_ERROR
  • LOG_CRITICAL
  • LOG_OFF

Программа Publisher является издателем и передает сообщения в шину:

  1. Для получения интерфейса регистрации издателя в шине сообщений используется метод IProviderFactory::CreateBusControl().
  2. Для получения интерфейса, содержащего методы для отправки издателем сообщений в шину, используется метод IProviderFactory::CreateBus().
  3. Для регистрации издателя в шине сообщений используется метод IProviderControl::RegisterPublisher().
  4. Для оправки сообщений в шину используется метод IProvider::Push().
  5. Для дерегистрации издателя в шине сообщений используется метод IProviderControl::UnregisterPublisher().

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

  1. Для получения интерфейса регистрации подписчика в шине сообщений используется метод IProviderFactory::CreateBusControl().
  2. Для получения интерфейсов, содержащих методы для получения подписчиком сообщений из шины используется метод IProviderFactory::CreateSubscriberRunner().
  3. Для регистрации подписчика в шине сообщений используется метод IProviderControl::RegisterSubscriber().
  4. Чтобы перевести подписчика в режим ожидания сообщения от шины используется метод ISubscriberRunner::Run().
  5. При получении сообщения из шины вызывается метод ISubscriber::OnMessage().
  6. Для дерегистрации подписчика в шине сообщений используется метод IProviderControl::UnregisterSubscriber().

Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:

  • Для работы с сетью используется программа VfsNet.
  • Для работы с файловой системой используется программа VfsSdCardFs.

Программа kl.Ntpd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию ntp-клиента, который в фоновом режиме получает параметры времени от внешних ntp-серверов и передает их ядру KasperskyOS.

Программа kl.rump.Dhcpcd поставляется в составе KasperskyOS Community Edition и представляет собой реализацию DHCP-клиента, который в фоновом режиме получает параметры сетевых интерфейсов от внешнего DHCP-сервера и передает их виртуальной файловой системе.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/messagebus

Сборка и запуск примера

См. "Сборка и запуск примеров".

Для корректной работы примера messagebus на Raspberry Pi после сборки примера и подготовки загрузочной SD-карты требуется выполнить следующие действия:

  • создать директорию /lib на загрузочной SD-карте, если этой директории не существует;
  • скопировать в директорию /lib на загрузочной SD-карте содержимое директории build/hdd/lib, которая генерируется во время сборки примера.
В начало
[Topic appendix_messagebus_example]

Пример i2c_ds1307_rtc

Пример демонстрирует использование драйвера i2c (Inter-Integrated Circuit) в KasperskyOS.

В этом примере программа I2cClient использует интерфейс драйвера i2c.

Клиентская библиотека драйвера i2c статически компонуется с программой I2cClient. Реализация драйвера i2c использует подсистему BSP (Board Support Platform) для настройки частоты тактирования (Clocks) и мультиплексирование сигналов (PinMux). Поэтому, для корректной работы драйвера нужно:

  • скомпоновать программу I2cClient с клиентской библиотекой i2c_CLIENT_LIB;
  • скомпоновать программу I2cClient с клиентской библиотекой bsp_CLIENT_LIB;
  • создать IPC-канал между программой I2cClient и драйвером kl.drivers.I2C;
  • создать IPC-канал между программой I2cClient и драйвером kl.drivers.BSP.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/i2c_ds1307_rtc

Сборка и запуск примера

Этот пример предназначен только для запуска на Raspberry Pi. Для корректной работы примера необходимо подключить к i2c порту модуль часов реального времени на микросхеме DS1307Z.

См. "Сборка и запуск примеров".

В начало
[Topic appendix_i2c_example]

Пример i2c_bm8563_rtc

Пример демонстрирует использование драйвера i2c (Inter-Integrated Circuit) в KasperskyOS.

В этом примере программа Bm8563 использует интерфейс драйвера i2c.

Клиентская библиотека драйвера i2c статически компонуется с программой Bm8563. Реализация драйвера i2c использует подсистему BSP (Board Support Platform) для настройки частоты тактирования (Clocks) и мультиплексирование сигналов (PinMux). Поэтому, для корректной работы драйвера нужно:

  • скомпоновать программу Bm8563 с клиентской библиотекой i2c_CLIENT_LIB;
  • скомпоновать программу Bm8563 с клиентской библиотекой bsp_CLIENT_LIB;
  • создать IPC-канал между программой Bm8563 и драйвером kl.drivers.I2C;
  • создать IPC-канал между программой Bm8563 и драйвером kl.drivers.BSP.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/i2c_bm8563_rtc

Сборка и запуск примера

Этот пример предназначен только для запуска на Radxa ROCK 3A.

См. "Сборка и запуск примеров".

В начало
[Topic appendix_i2c_radxa_example]

Пример iperf_separate_vfs

Пример демонстрирует использование библиотеки iperf в KasperskyOS.

В этом примере программа Server использует библиотеку iperf.

По умолчанию, в примере используется программная эмуляция (SLIRP) сети в QEMU. Если вы настроили TAP-интерфейсы для QEMU, то для корректной работы примера нужно изменить сетевые параметры запуска QEMU (переменная QEMU_FLAGS) в файле einit/CMakeLists.txt (подробнее см. комментарии в файле).

В примере не используется DHCP, поэтому IP-адрес сетевого интерфейса должен быть указан вручную в коде программы Server (server/src/main.cpp). SLIRP использует значения по умолчанию.

Библиотека iperf в примере используется в режиме сервера. Чтобы подключиться к этому серверу, установите программу iperf3 на хостовой машине и запустите ее с помощью команды iperf3 -c localhost. Если вы настроили TAP-интерфейсы, укажите актуальный IP-адрес вместо localhost.

Первый запуск примера может занять продолжительное время, так как клиент iperf использует энтропию /dev/urandom для заполнения пакетов случайными данными. Чтобы избежать этого, запустите клиент iperf с параметром --repeating-payload.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/iperf_separate_vfs

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic appendix_iperf_example]

Пример uart

Пример использования драйвера UART.

Этот пример показывает, как вывести сообщение "Hello world!" в соответствующий порт, используя драйвер UART.

Полное описание интерфейса драйвера UART содержится в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/uart/uart.h.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/uart

Сборка и запуск примера

См. "Сборка и запуск примеров".

В начало
[Topic appendix_uart_example]

Пример spi_check_regs

Пример демонстрирует использование драйвера SPI (Serial Peripheral Interface) в KasperskyOS.

Пример показывает как работать с интерфейсом SPI на плате расширения Sense HAT для Raspberry Pi. В этом примере программа Client использует интерфейс драйвера SPI. Программа открывает SPI-канал, выводит его параметры и выставляет нужный режим работы. После этого программа посылает по каналу последовательность данных и ожидает получения идентификатора контроллера ATTiny, установленного на плате Sense HAT.

Клиентская библиотека драйвера SPI статически компонуется с программой Client. Программа Client также использует драйвер gpio для установки режима работы контроллера и подсистему BSP (Board Support Platform) для настройки частоты тактирования (Clocks) и мультиплексирование сигналов (PinMux).

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/spi_check_regs

Сборка и запуск примера

Для корректной работы примера необходимо подключить к SPI порту модуль Sense HAT.

См. "Сборка и запуск примеров".

В начало
[Topic spi_check_regs_example]

Пример barcode_scanner

Пример демонстрирует использование драйвера USB (Universal Serial Bus) в KasperskyOS с помощью библиотеки libevdev.

В этом примере программа BarcodeScanner использует библиотеку libevdev для взаимодействия со сканером штрихкодов, подключенным к USB порту Raspberry Pi.

Программа ожидает сигналов от сканера штрихкодов и выводит полученные данные в stderr.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/barcode_scanner

Сборка и запуск примера

Для корректной работы примера необходимо подключить к USB порту сканер штрихкодов, работающий в режиме эмуляции клавиатуры (например Zebra Symbol LS2208).

См. "Сборка и запуск примеров".

В начало
[Topic barcode_scanner_example]

Пример watchdog_system_reset

Пример демонстрирует использование драйвера Watchdog в KasperskyOS.

В этом примере программа Client использует интерфейс драйвера Watchdog для взаимодействия со сторожевым таймером:

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

Клиентская библиотека драйвера Watchdog статически компонуется с программой Client.

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/watchdog_system_reset

Сборка и запуск примера

Этот пример предназначен только для запуска на Raspberry Pi.

См. "Сборка и запуск примеров".

В начало
[Topic watchdog_system_reset_example]

Пример shared_libs

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

В примере программа Client выполняет следующие действия:

  • вызывает функцию из статической библиотеки hello_s;
  • вызывает функцию из динамической библиотеки hello_d1, скомпонованной вместе с программой и загружаемой в память при запуске процесса;
  • вызывает функцию из динамической библиотеки hello_d2, загружаемой в память при вызове функции dlopen() интерфейса POSIX.

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

Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/shared_libs

Сборка и запуск примера

См. "Сборка и запуск примеров".

Для корректной работы примера shared_libs на Raspberry Pi после сборки примера и подготовки загрузочной SD-карты требуется выполнить следующие действия:

  • создать директорию /lib на загрузочной SD-карте, если этой директории не существует;
  • скопировать в директорию /lib на загрузочной SD-карте содержимое директории build/hdd/lib, которая генерируется во время сборки примера.
В начало
[Topic shared_libs_example]

Пример pal_tests

Пример демонстрирует использование PAL (Policy Assertion Language) при написании тестов политики безопасности решения на базе KasperskyOS. Тесты на языке PAL позволяют проверить политику безопасности решения еще до начала разработки программного кода, основываясь на формальных спецификациях компонентов решения. Подробнее о PAL см. "Создание и выполнение тестов политики безопасности решения на базе KasperskyOS".

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/pal_tests

Список программ

Тесты проверяют события безопасности следующих программ:

  • WebServer – прикладная программа, предоставляющая пользователю доступ к программе Service через веб-интерфейс.
  • Service – прикладная программа, обрабатывающая запросы пользователя и возвращающая результат выполнения запроса.
  • UserManager – прикладная программа, реализующая управление учетными записями и авторизацией пользователей.

Описание инициализации

Файл init.yaml генерируется автоматически в директории сборки примера и не важен для понимания этого примера.

Описание политики безопасности

Файлы описания политики безопасности решения на базе KasperskyOS находятся по следующему пути ./einit/src.

Файл security.psl содержит описание политики безопасности решения. Этот файл является файлом верхнего уровня, в который через декларацию use включены части описания политики безопасности решения в виде PSL-файлов: core.psl, user_mngr.psl, service.psl, vfs_net.psl, vfs_sdcard.psl.

Файл pal_tests.psl содержит наборы тестов и также включен в файл верхнего уровня security.psl через декларацию use.

Ресурсы

В директориях ./resources/edl и ./resources/idl расположены EDL- и IDL-описания для программ WebServer, Service и UserManager.

Сценарий работы

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

Сборка и запуск примера

См. "Создание и выполнение тестов политики безопасности решения на базе KasperskyOS".

В начало
[Topic pal_tests_example]

Пример hello_from_rust

Пример демонстрирует, как включить в решение на базе KasperskyOS простую программу, разработанную на языке Rust и собранную с использованием системы сборки и менеджера пакетов Cargo.

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/hello_from_rust

Список программ

В состав решения входит прикладная программа Hello, которая выводит сообщение в стандартный вывод ошибок. Эта программа разработана на языке Rust.

Описание инициализации

Файл описания инициализации решения init.yaml генерируется в процессе сборки решения на основе шаблона:

./einit/src/init.yaml.in

Описание политики безопасности

Файл security.psl содержит описание политики безопасности решения и генерируется в процессе сборки решения на основе шаблона:

./einit/src/security.psl.in

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне security.psl.in при сборке решения заменяется на список системных программ, поставляемых в составе KasperskyOS SDK. Подробнее см. "Шаблон security.psl.in".

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

Ресурсы

В директории ./resources содержится EDL-описание программы Hello.

В директории ./vendor содержатся библиотеки и их метаданные, которые необходимы для управления зависимостями в проектах на Rust, собираемых с использованием системы сборки Cargo.

Сценарий работы

Программа Hello выводит в стандартный вывод ошибок сообщение Hello, world!.

Сборка и запуск примера

При сборке решения используется система сборки CMake из состава KasperskyOS SDK. Для сборки программы Hello используется система сборки Cargo, также входящая в SDK. В процессе сборки решения команда add_custom_command() в файле ./hello/CMakeLists.txt выполняет команду cargo build, которая собирает исполняемый файл программы Hello. Этот файл включается в решение как импортируемый исполняемый файл командой add_executable().

См. "Сборка и запуск примеров".

В начало
[Topic hello_from_rust_example]

Пример hello_corrosion

Пример демонстрирует, как включить в решение простую программу, разработанную на языке Rust, с использованием Corrosion – набора библиотек для интеграции Rust в CMake-проекты.

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/hello_corrosion

Список программ

В состав решения входит прикладная программа Hello, которая выводит сообщение в стандартный вывод ошибок. Эта программа разработана на языке Rust.

Описание инициализации

Файл описания инициализации решения init.yaml генерируется в процессе сборки решения на основе шаблона:

./einit/src/init.yaml.in

Макрос @INIT_hello_ENTITY_CONNECTIONS@ при сборке примера заменяется в файле init.yaml на список IPC-каналов со всеми системными программами, с которыми скомпонована программа Hello.

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне init.yaml.in при сборке заменяется в файле init.yaml на список системных программ, с которыми скомпонованы прикладные программы. Этот список содержит IPC-каналы системных программ, параметры запуска функции main() и значения переменных окружения.

Подробнее см. "Шаблон init.yaml.in".

Описание политики безопасности

Файл security.psl содержит описание политики безопасности решения и генерируется в процессе сборки решения на основе шаблона:

./einit/src/security.psl.in

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне security.psl.in при сборке решения заменяется на список системных программ, поставляемых в составе KasperskyOS SDK. Подробнее см. "Шаблон security.psl.in".

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

Ресурсы

В директории ./resources содержится EDL-описание программы Hello.

Сценарий работы

Программа Hello выводит в стандартный вывод ошибок сообщение Hello, world!.

Сборка и запуск примера

При сборке решения используется система сборки CMake из состава KasperskyOS SDK.

Чтобы синхронизировать целевую платформу для сборки исходного-кода, разработанного на Rust, с целевой платформой C-компилятора, нужно в файле ./CMakeList.txt добавить команду:

set (Rust_CARGO_TARGET ${CMAKE_C_COMPILER_TARGET})

Чтобы использовать в решении Corrosion нужно в этом же файле добавить команду:

find_package (Corrosion REQUIRED)

Чтобы интегрировать в решение исходный код, разработанный на Rust, в файле ./hello/CMakeList.txt нужно вызвать функцию:

corrosion_import_crate (MANIFEST_PATH ${CMAKE_SOURCE_DIR}/hello/Cargo.toml)

При выполнении этой функции скомпилируется исполняемый файл hello, который будет включен в решение.

См. "Сборка и запуск примеров".

В начало
[Topic hello_corrosion_example]

Пример mass_storage

Пример демонстрирует использование драйвера UsbMassStorage в решениях на базе KasperskyOS для работы с внешними USB-накопителем, подключенным к USB-порту Raspberry Pi 4 B.

Директория примера в SDK

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/mass_storage

Список программ

  • Client – прикладная программа, которая монтирует файловые системы в указанные директории на внешнем USB-накопителе, и выполняет базовые операции с файлами (создание, запись, чтение и удаление).
  • FileVfs – прикладная программа, реализующая серверную часть виртуальной файловой системы, предоставляя интерфейс для взаимодействия с файловыми системами и блочными устройствами.
  • UsbMassStorage – драйвер для доступа к данным на внешних USB-накопителях (USB-флеш-накопители, внешние жесткие диски).
  • EntropyEntity – системная программа, реализующая генератор случайных чисел.
  • USB – драйвер для управления всеми типами USB-устройств.
  • PCIE – драйвер шины PCIe.
  • Bcm2711MboxArmToVc – драйвер для работы с сопроцессором VideoCore (VC6) через технологию mailbox для Raspberry Pi 4 B.

Описание инициализации

Файл описания инициализации решения init.yaml генерируется в процессе сборки решения на основе шаблона:

./einit/src/init.yaml.in

Макрос @INIT_Client_ENTITY_CONNECTIONS+@ в шаблоне init.yaml.in при сборке примера заменяется в файле init.yaml на список IPC-каналов со всеми системными программами, с которыми скомпонована программа Client. Этот список дополняет вручную заданные IPC-каналы в шаблоне init.yaml.in.

Макрос @INIT_FileVfs_ENTITY_CONNECTIONS@ при сборке примера заменяется в файле init.yaml на список IPC-каналов со всеми системными программами, с которыми скомпонована программа FileVfs.

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне init.yaml.in при сборке заменяется в файле init.yaml на список системных программ, с которыми скомпонованы прикладные программы. Этот список содержит IPC-каналы системных программ, параметры запуска функции main() и значения переменных окружения.

Подробнее см. "Шаблон init.yaml.in".

Описание политики безопасности

Файл security.psl содержит описание политики безопасности решения и генерируется в процессе сборки решения на основе шаблона:

./einit/src/security.psl.in

Макрос @INIT_EXTERNAL_ENTITIES@ в шаблоне security.psl.in при сборке решения заменяется на список системных программ, поставляемых в составе KasperskyOS SDK. Подробнее см. "Шаблон security.psl.in".

Ресурсы

В директории ./resources/edl содержатся EDL-описания для программ Client и FileVfs.

Сценарий работы

Программа Client отправляет запросы через IPC программе FileVfs, чтобы смонтировать файловые системы (ext2, ext3, ext4) в указанные директории, и выполнить базовые операции с файлами (создание, запись, чтение и удаление) для проверки корректности монтирования файловых систем на внешнем USB-накопителе. Результаты выполнения операций отображаются в стандартном выводе.

Сборка и запуск примера

Чтобы подготовить USB-накопитель для использования в этом примере, необходимо вызвать следующие команды:

# В следующих командах /dev/sde – имя блочного устройства подключенного USB-накопителя parted /dev/sde mklabel msdos parted /dev/sde mkpart primary ext4 0% 100% mkfs.ext4 -L flash /dev/sde1

См. "Сборка и запуск примеров".

В начало
[Topic mass_storage_example]

Пример can_loopback

Пример использования драйвера CAN.

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

Для настройки порта используется CAN-интерфейс с именем can0, указатель на имя порта присваивается переменной CanPortName. Также драйвер CAN поддерживает имена can1 и can2, которые можно использовать в тестовом приложении.

Драйвер CAN поддерживает несколько режимов работы, и может работать как классический CAN, а также как CANFD. За режим CANFD отвечает флаг CAN_FLAGS_FD, который передается в функцию открытия CAN-порта тестового примера. Если флаг CAN_FLAGS_FD отсутствует в параметрах открытия порта, то будет использоваться классический CAN с соответствующими ограничениями по скорости.

В примере открывается порт и устанавливается скорость передачи 800 КБ/c. Для этого используется константа CAN_BR_800KBS.

При использовании флага CAN_FLAGS_FD, поддерживаются следующие константы скорости передачи данных:

  • CANFD_BR_500KBS_D_2MBS
  • CANFD_BR_500KBS_D_2_5MBS
  • CANFD_BR_1MBS_D_2MBS
  • CAN_BR_1MBS
  • CAN_BR_800KBS
  • CAN_BR_500KBS
  • CAN_BR_250KBS
  • CAN_BR_125KBS
  • CAN_BR_62_5KBS

Классический CAN не может использовать скорости выше 1 МБ/с, поэтому при отсутствии флага CAN_FLAGS_FD необходимо использовать только следующие константы для настройки скорости передачи:

  • CAN_BR_1MBS
  • CAN_BR_800KBS
  • CAN_BR_500KBS
  • CAN_BR_250KBS
  • CAN_BR_125KBS
  • CAN_BR_62_5KBS

Тестовый пакет CAN содержит идентификатор, длину поля данных и сами данные. Описание полей содержатся в структуре CanFrame. Для классического CAN, длина поля данных ограничена 8 байтами, для CANFD – 64 байтами.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/can_loopback

Сборка и запуск примера

Этот пример предназначен только для запуска на Radxa ROCK 3A.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера CAN для QEMU нет.

См. "Сборка и запуск примеров".

В начало
[Topic can_loopback_example]

Пример can2can

Пример использования драйвера CAN.

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

В отличие от примера can_loopback, где используется только один CAN-интерфейс и нет необходимости в дополнительном оборудовании, этот пример требует наличия двух трансиверов подключенных к линиям CAN_H и CAN_L. Описание способов подключения трансиверов ко встроенным CAN-контроллерам находится в директории примера.

Пример отправляет CAN-пакет между интерфейсами can0 и can1. В примере используются настройки классического CAN, что подразумевает ограничение скорости передачи в 1 МБ/с.

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

  • CAN_BR_1MBS
  • CAN_BR_800KBS
  • CAN_BR_500KBS
  • CAN_BR_250KBS
  • CAN_BR_125KBS
  • CAN_BR_62_5KBS

Драйвер CAN не накладывает ограничений на направление отправки сообщений. В примере происходит отправка сообщения из can0 в can1, но при использовании функции CanTransmitFrame, можно выполнить отправку и в обратном направлении.

Тестовый CAN-пакет содержит идентификатор пакета, длину поля данных и сами данные. Описание полей содержатся в структуре CanFrame. Для классического CAN, длина поля данных ограничена 8 байтами.

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/can2can

Сборка и запуск примера

Этот пример предназначен только для запуска на Radxa ROCK 3A.

При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера CAN для QEMU нет.

См. "Сборка и запуск примеров".

В начало
[Topic can2can_example]

Пример adc_hello

Пример демонстрирует использование драйвера Sensors в KasperskyOS.

В примере программа AdcHello позволяет проверить функциональность каналов АЦП. Номер канала, используемого при проверке, задается в макросе ADC_CHAN_NUM.

Программа считывает поданное на канал напряжение, нормализует его и выводит в стандартный вывод. Так же программа отображает список доступных для работы каналов ADC (каналы SARADC_VIN6 и SARADC_VIN7 присутствуют в выводе, но для работы недоступны).

Файлы примера

Код примера и скрипты для сборки находятся по следующему пути:

/opt/KasperskyOS-Community-Edition-<version>/examples/adc_hello

Сборка и запуск примера

Этот пример предназначен только для запуска на Radxa ROCK 3A.

Для корректной работы примера необходимо подключить к ADC пину источник напряжения 1 вольт согласно схеме:

RPI_USB

См. "Сборка и запуск примеров".

В начало
[Topic adc_hello_example]