Содержание
- Дополнительные примеры
- Пример hello
- Пример echo
- Пример ping
- Пример net_with_separate_vfs
- Пример net2_with_separate_vfs
- Пример embedded_vfs
- Пример embed_ext2_with_separate_vfs
- Пример multi_vfs_ntpd
- Пример multi_vfs_dns_client
- Пример multi_vfs_dhcpcd
- Пример mqtt_publisher (Mosquitto)
- Пример mqtt_subscriber (Mosquitto)
- Пример gpio_input
- Пример gpio_output
- Пример gpio_interrupt
- Пример gpio_echo
- Пример koslogger
- Пример pcre
- Пример messagebus
- Пример i2c_ds1307_rtc
- Пример iperf_separate_vfs
- Пример uart
- Пример spi_check_regs
- Пример barcode_scanner
- Пример perfcnt
Дополнительные примеры
Этот раздел содержит описания дополнительных примеров, входящих в состав KasperskyOS Community Edition.
См. также описания примеров реализации паттернов безопасности:
- Пример Secure Logger
- Пример Separate Storage
- Пример Defer to Kernel
- Пример Device Access
- Пример Secure login (Civetweb, TLS-terminator)
Пример hello
Код hello.c
выглядит привычным и простым для разработчика на языке C – он полностью совместим с POSIX:
hello.c
int main(int argc, const char *argv[])
{
fprintf(stderr,"Hello world!\n");
return EXIT_SUCCESS;
}
Скомпилируйте этот код с использованием aarch64-kos-gcc
(входит в состав средств разработки KasperskyOS Community Edition):
aarch64-kos-gcc -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 выглядит следующим образом:
Пример echo
Пример echo демонстрирует использование IPC-транспорта.
Показана работа с основными инструментами, позволяющими реализовать взаимодействие между программами.
Пример echo описывает простейший случай взаимодействия двух программ:
- Программа
Client
передает программеServer
число (value
). - Программа
Server
изменяет это число и передает новое число (result
) программеClient
. - Программа
Client
выводит числоresult
на экран.
Чтобы организовать такое взаимодействие программ, потребуется:
- Соединить программы
Client
иServer
, используя init-описание. - Реализовать на сервере интерфейс с единственным методом
Ping
, который имеет один входной аргумент – исходное число (value
) и один выходной аргумент – измененное число (result
).Описание метода
Ping
на языке IDL:Ping(in UInt32 value, out UInt32 result);
- Создать файлы статических описаний на языках EDL, CDL и IDL. С помощью компилятора NK сгенерировать файлы, содержащие транспортные методы и типы (прокси-объект, диспетчеры и т.д.).
- В коде программы
Client
инициализировать все необходимые объекты (транспорт, прокси-объект, структуру запроса и др.) и вызвать интерфейсный метод. - В коде программы
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/Ping.cdl
,resources/Ping.idl
– статические описания;init.yaml
– init-описание.
Сборка и запуск примера
См. "Сборка и запуск примеров".
Схема сборки примера echo выглядит следующим образом:
Пример ping
Пример ping демонстрирует использование политики безопасности решения для управления взаимодействиями между программами.
Пример ping включает в себя две программы: Client
и Server
.
Программа Server
предоставляет два идентичных метода Ping
и Pong
, которые получают число и возвращают измененное число:
Ping(in UInt32 value, out UInt32 result);
Pong(in UInt32 value, out UInt32 result);
Программа Client
вызывает оба этих метода в различной последовательности. Если вызов метода запрещен политикой безопасности решения, выводится сообщение Failed to call...
Транспортная часть примера ping практически аналогична таковой для примера echo. Единственное отличие состоит в том, что в примере ping используется два метода (Ping
и Pong
), а не один.
Политика безопасности решения в примере ping
Политика безопасности решения в этом примере разрешает запуск всех программ и позволяет любой программе обращаться к программам Core
и Server
. При этом обращениями к программе Server
управляют методы модели безопасности Flow.
Конечный автомат, описанный в конфигурации объекта request_state
модели безопасности Flow, имеет два состояния: ping_next
и pong_next
. Исходное состояние – ping_next
. Разрешены только переходы из ping_next
в pong_next
и обратно.
При вызове методов Ping
и Pong
проверяется текущее состояние объекта request_state
. В состоянии ping_next
разрешен только вызов Ping
, при этом состояние изменится на pong_next
. Аналогично, в состоянии pong_next
разрешен только вызов Pong
, при этом состояние изменится на ping_next
.
Таким образом, методы Ping
и Pong
разрешено вызывать только по очереди.
security.psl
/* Политика безопасности решения для демонстрации использования модели
* безопасности Flow в примере ping */
/* Включение PSL-файлов с формальными представлениями моделей безопасности
* Base и Flow */
use nk.base._
use nk.flow._
/* Создание объекта модели безопасности Flow */
policy object request_state : Flow {
type States = "ping_next" | "pong_next"
config = {
states : ["ping_next" , "pong_next"],
initial : "ping_next",
transitions : {
"ping_next" : ["pong_next"],
"pong_next" : ["ping_next"]
}
}
}
/* Запуск любых программ разрешен. */
execute {
grant ()
}
/* Любые запросы разрешены. */
request {
grant ()
}
/* Любые ответы разрешены. */
response {
grant ()
}
/* Включение EDL-файлов */
use EDL kl.core.Core
use EDL ping.Client
use EDL ping.Server
use EDL Einit
/* При запуске программы Server инициировать эту программу с конечным автоматом */
execute dst=ping.Server {
request_state.init {sid: dst_sid}
}
/* При вызове метода Ping проверить, что конечный автомат находится в состоянии ping_next.
Если это так, разрешить вызов метода Ping и перевести конечный автомат в состояние pong_next. */
request dst=ping.Server, endpoint=controlimpl.connectionimpl, method=Ping {
request_state.allow {sid: dst_sid, states: ["ping_next"]}
request_state.enter {sid: dst_sid, state: "pong_next"}
}
/* При вызове метода Pong проверить, что конечный автомат находится в состоянии pong_next.
Если это так, разрешить вызов метода Pong и перевести конечный автомат в состояние ping_next. */
request dst=ping.Server, endpoint=controlimpl.connectionimpl, method=Pong {
request_state.allow {sid: dst_sid, states: ["pong_next"]}
request_state.enter {sid: dst_sid, state: "ping_next"}
}
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/ping
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример net_with_separate_vfs
Пример представляет собой простейший случай взаимодействия по сети с использованием сокетов Беркли.
Пример состоит из программ Client
и Server
, связанных TCP-сокетом с использованием loopback-интерфейса. В коде программ используются стандартные POSIX-функции.
Чтобы соединить программы сокетом через loopback, они должны использовать один экземпляр сетевого стека, то есть взаимодействовать с "общей" программой VFS (в этом примере программа называется NetVfs
).
Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/net_with_separate_vfs
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример 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
должна взаимодействовать с программой NetVfs
. Программа NetVfs
при сборке компонуется с сетевым драйвером, который обеспечит взаимодействие с программой Server
, запущенной в Linux.
Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/net2_with_separate_vfs
Сборка и запуск примера
См. "Сборка и запуск примеров".
Для корректной работы примера необходимо запустить программу Server
в хостовой операционной системе Linux или на компьютере, подключенном к Raspberry Pi.
После выполнения сборки, исполняемый файл server
программы Server
находится в следующей директории:
/opt/KasperskyOS-Community-Edition-<version>/examples/net2_with_separate_vfs/build/host/server/
Чтобы собрать исполняемый файл программы Server
самостоятельно, нужно выполнить следующие команды:
$ cd net2_with_separate_vfs/server/src/
$ gcc -o server server.c
Пример embedded_vfs
Пример показывает, как встроить виртуальную файловую систему (далее VFS), поставляемую в составе KasperskyOS Community Edition, в разрабатываемую программу.
В этом примере программа Client
полностью инкапсулирует реализацию VFS из KasperskyOS Community Edition. Это позволяет избавиться от использования IPC для всех стандартных функций ввода-вывода (stdio.h
, socket.h
и так далее), например, для отладки или повышения производительности.
Программа Client
тестирует следующие операции:
- создание директории;
- создание и удаление файла;
- чтение из файла и запись в файл.
Поставляемые ресурсы
В пример входит образ жесткого диска с файловой системой FAT32 – hdd.img
.
Этот пример не содержит реализации драйверов блочных устройств, с которыми работает Client
. Эти драйверы (программы ATA
и SDCard
) поставляются в составе KasperskyOS Community Edition и добавляются в файле сборки ./CMakeLists.txt
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/embedded_vfs
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd hdd.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример embed_ext2_with_separate_vfs
Пример показывает, как встроить новую файловую систему в виртуальную файловую систему (VFS), поставляемую в составе KasperskyOS Community Edition.
В этом примере программа Client
тестирует работу файловых систем (ext2, ext3, ext4) на блочных устройствах. Для этого Client
обращается по IPC к виртуальной файловой системе (программе FileVfs
), а FileVfs
в свою очередь обращается по IPC к блочному устройству.
Файловые системы ext2
и ext3
работают с настройками по умолчанию. Файловая система ext4
работает, если отключить extent
(mkfs.ext4 -O ^64bit,^extent /dev/foo
).
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/embed_ext2_with_separate_vfs
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd hdd.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
Подготовка SD-карты для запуска на Raspberry Pi 4 B
Для запуска примера embed_ext2_with_separate_vfs
на Raspberry Pi 4 B необходимо, чтобы SD-карта, помимо загрузочного раздела с образом решения, также содержала 3 дополнительных раздела с файловыми системами ext2
, ext3
и ext4
соответственно.
Пример multi_vfs_ntpd
Этот пример показывает как использовать ntp-сервис в KasperskyOS. Программа kl.Ntpd
поставляется в составе KasperskyOS Community Edition и представляет собой реализацию ntp-клиента, который в фоновом режиме получает параметры времени от внешних ntp-серверов и передает их ядру KasperskyOS.
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
иVfsSdCardFs
.
Программа Client
использует стандартные функции библиотеки libc для получения информации о времени, которые транслируются в обращения к программе VFS по IPC.
Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.
Поставляемые ресурсы
В пример входят следующие файлы конфигурации:
./resources/include/config.h.in
содержит описание бэкенда файловой системы, которая будет использоваться в решении:sdcard
илиramfs
.Для каждого бэкенда в решении также используется отдельная программа VFS:
VfsSdCardFs
илиVfsRamfs
соответственно.- Директории
./resources/ramfs/etc
и/resources/sdcard/etc
содержат файлы конфигурации для программ VFS иNtpd
. Для конфигурации программыntpd
используется стандартный синтаксисntpd.conf
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_ntpd
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример multi_vfs_dns_client
Этот пример показывает как использовать внешний dns-сервис в KasperskyOS.
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
иVfsSdCardFs
.
Программа Client
использует стандартные функции библиотеки libc для обращения ко внешнему dns-сервису, которые транслируются в обращения к программе VfsNet
по IPC.
Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.
Поставляемые ресурсы
В пример входят следующие файлы конфигурации:
./resources/include/config.h.in
содержит описание бэкенда файловой системы, которая будет использоваться в решении:sdcard
илиramfs
.Для каждого бэкенда в решении также используется отдельная программа VFS:
VfsSdCardFs
илиVfsRamfs
соответственно.- Директории
./resources/ramfs/etc
и/resources/sdcard/etc
содержат файлы конфигурации для программы VFS.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_dns_client
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример multi_vfs_dhcpcd
Пример использования программы kl.rump.Dhcpcd
.
Программа Dhcpcd
представляет собой реализацию DHCP-клиента, который в фоновом режиме получает параметры сетевых интерфейсов от внешнего DHCP-сервера и передает их виртуальной файловой системе (далее VFS).
Пример также демонстрирует использование разных VFS в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
иVfsSdCardFs
.
Программа Client
использует стандартные функции библиотеки libc
для получения информации о сетевых интерфейсах (ioctl
), которые транслируются в обращения к VFS по IPC.
Для сборки и запуска примера используется система CMake из состава KasperskyOS Community Edition.
Поставляемые ресурсы
В пример входят следующие файлы конфигурации:
./resources/include/config.h.in
содержит описание бэкенда файловой системы, которая будет использоваться в решении:sdcard
илиramfs
.Для каждого бэкенда в решении также используется отдельная программа VFS:
VfsSdCardFs
илиVfsRamfs
соответственно.- Директории
./resources/ramfs/etc
и/resources/sdcard/etc
содержат файлы конфигурации для программ VFS иDhcpcd
. Для конфигурации программыdhcpcd
используется стандартный синтаксисdhcpcd.conf
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/multi_vfs_dhcpcd
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример mqtt_publisher (Mosquitto)
Пример использования протокола MQTT в KasperskyOS.
В этом примере MQTT-подписчик должен быть запущен в хостовой операционной системе, а MQTT-издатель в KasperskyOS. Программа Publisher
представляет собой реализацию MQTT-издателя, который публикует текущее время с интервалом 5 секунд.
В результате успешного запуска и работы примера MQTT-подписчик, запущенный в хостовой операционной системе, выведет сообщение "received PUBLISH"
с топиком "datetime"
.
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
и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/include/config.h.in
содержит описание бэкенда файловой системы, которая будет использоваться в решении:sdcard
илиramfs
.Для каждого бэкенда в решении также используется отдельная программа VFS:
VfsSdCardFs
илиVfsRamfs
соответственно.- Директории
./resources/ramfs/etc
и/resources/sdcard/etc
содержат файлы конфигурации для программVFS
,Dhcpcd
иNtpd
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/mqtt_publisher
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример mqtt_subscriber (Mosquitto)
Пример использования протокола MQTT в KasperskyOS.
В этом примере MQTT-издатель должен быть запущен в хостовой операционной системе, а MQTT-подписчик в KasperskyOS. Программа Subscriber
представляет собой реализацию MQTT-подписчика.
В результате успешного запуска и работы примера MQTT-подписчик, запущенный в KasperskyOS, выведет сообщение "Got message with topic: my/awesome/topic, payload: hello"
.
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
и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/include/config.h.in
содержит описание бэкенда файловой системы, которая будет использоваться в решении:sdcard
илиramfs
.Для каждого бэкенда в решении также используется отдельная программа VFS:
VfsSdCardFs
илиVfsRamfs
соответственно.- Директории
./resources/ramfs/etc
и/resources/sdcard/etc
содержат файлы конфигурации для программVFS
,Dhcpcd
иNtpd
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/mqtt_subscriber
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".
В началоПример gpio_input
Пример использования драйвера GPIO.
Этот пример позволяет проверить функциональность ввода GPIO пинов. Используется порт "gpio0". Все пины, кроме указанных в массиве exceptionPinArr
, по умолчанию ориентированы на ввод, напряжение на пинах согласуется с состоянием регистров подтягивающих резисторов. Состояния всех пинов, начиная с GPIO0 (с учетом указанных в массиве exceptionPinArr
), будут последовательно считаны, сообщения о состояниях пинов будут выведены в консоль. Задержка между считываниями смежных пинов определяется макроопределением DELAY_S
(время указывается в секундах).
exceptionPinArr
- массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.
При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.
При сборке и запуске этого примера на Raspberry Pi 4 B ошибка не возникает.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_input
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример gpio_output
Пример использования драйвера GPIO.
Этот пример позволяет проверить функциональность вывода GPIO пинов. Используется порт "gpio0". Начальное состояние всех пинов GPIO должно соответствовать логическому нулю (напряжение на пине отсутствует). Все пины, кроме указанных в массиве exceptionPinArr
, будут настроены на вывод. Каждый пин, начиная с GPIO0 (с учетом указанных в массиве exceptionPinArr
), будет последовательно переведен в состояние логической единицы (появление на пине напряжения), а затем в состояние логического нуля. Задержка между изменениями состояния пинов определяется макроопределением DELAY_S
(время указывается в секундах). Включение/выключение пинов производится от GPIO0
до GPIO27
и обратно до GPIO0
.
exceptionPinArr
- массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.
При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.
При сборке и запуске этого примера на Raspberry Pi 4 B ошибка не возникает.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_output
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример gpio_interrupt
Пример использования драйвера GPIO.
Этот пример позволяет проверить функциональность прерываний для GPIO пинов. Используется порт "gpio0". В битовой маске pinsBitmap
структуры контекста прерываний CallBackContext
пины из массива exceptionPinArr
помечаются отработавшими, чтобы в дальнейшем пример мог корректно завершиться. Все пины, кроме указанных в массиве exceptionPinArr
, переводятся в состояние PINS_MODE
. Для всех пинов, кроме указанных в массиве exceptionPinArr
, будет зарегистрирована функция обработки прерывания.
В бесконечном цикле происходит проверка условия равенства битовой маски pinsBitmap
из структуры контекста прерываний CallBackContext
битовой маске окончания работы примера DONE_BITMASK
(соответствует условию, когда прерывание произошло на каждом GPIO пине). Также в цикле снимается функция-обработчик для последнего пина, на котором произошла обработка прерывания. При возникновении в первый раз прерывания на пине вызывается функция-обработчик, которая помечает соответствующий пин в битовой маске pinsBitmap
в структуре контекста прерываний CallBackContext
. Функция-обработчик для этого пина в дальнейшем снимается.
Следует учитывать возможное влияние начального состояния регистров подтягивающих резисторов для каждого пина на работу примера.
Прерывания для событий GPIO_EVENT_LOW_LEVEL
и GPIO_EVENT_HIGH_LEVEL
не поддерживаются.
exceptionPinArr
- массив номеров GPIO пинов, которые необходимо исключить из примера. Это может понадобиться в случае, если часть пинов уже задействована для других функций, например, если пины используются для UART соединения при отладке.
При сборке и запуске этого примера на QEMU возникает ошибка. Это ожидаемое поведение, поскольку драйвера GPIO для QEMU нет.
При сборке и запуске этого примера на Raspberry Pi 4 B ошибка не возникает.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_interrupt
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример 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 B ошибка не возникает.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/gpio_echo
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример koslogger
Пример демонстрирует использование библиотеки spdlog
в KasperskyOS с помощью библиотеки-обертки KOSLogger
.
В этом примере программа Client
создает записи журнала, которые сохраняются на SD-карте (в случае запуска примера на Raspberry Pi) или в файле образа build/einit/sdcard0.img
(при запуске примера на QEMU).
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
и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
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример pcre
Пример демонстрирует использование библиотеки pcre
в KasperskyOS.
В этом примере программа Client
использует библиотеку pcre
и выводит результаты в консоль.
Для сборки и запуска примера используется система CMake
из состава KasperskyOS Community Edition.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/pcre
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример messagebus
Пример демонстрирует использование компонента MessageBus
в KasperskyOS.
В этом примере программы Publisher
и SubscriberA
и SubscriberB
используют компонент MessageBus для обмена сообщениями.
Компонент MessageBus
реализует шину сообщений. Программа Publisher
является издателем и передает сообщения в шину. Программы SubscriberA
и SubscriberB
являются подписчиками и получают сообщения из шины.
Пример также демонстрирует использование разных виртуальных файловых систем (далее VFS) в одном решении. В примере для доступа к функциям работы с файловой системой и функциям работы с сетью используются разные VFS:
- Для работы с сетью используется программа
VfsNet
. - Для работы с файловой системой используются программы
VfsRamfs
и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
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример 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.
См. "Сборка и запуск примеров".
В началоПример iperf_separate_vfs
Пример демонстрирует использование библиотеки iperf
в KasperskyOS.
В этом примере программа Server
использует библиотеку iperf
.
По умолчанию, в примере используется программная эмуляция (SLIRP) сети в QEMU. Если вы настроили TAP-интерфейсы для QEMU, то для корректной работы примера нужно изменить сетевые параметры запуска QEMU (переменная QEMU_NET_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
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример uart
Пример использования драйвера UART.
Этот пример показывает, как вывести сообщение "Hello world!" в соответствующий порт, используя драйвер UART.
При запуске эмуляции примера под QEMU, в флагах QEMU указывается -serial stdio
. Это означает, что первый порт UART будет выводиться только в стандартный поток хостовой машины.
Полное описание интерфейса драйвера UART содержится в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-aarch64-kos/include/uart/uart.h
.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/uart
Сборка и запуск примера
См. "Сборка и запуск примеров".
В началоПример 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
Сборка и запуск примера
Этот пример предназначен только для запуска на Raspberry Pi. Для корректной работы примера необходимо подключить к SPI порту модуль Sense HAT.
См. "Сборка и запуск примеров".
В началоПример 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
Сборка и запуск примера
Этот пример предназначен только для запуска на Raspberry Pi. Для корректной работы примера необходимо подключить к USB порту сканер штрихкодов, работающий в режиме эмуляции клавиатуры (например Zebra Symbol LS2208).
См. "Сборка и запуск примеров".
В началоПример perfcnt
Пример демонстрирует использование счетчиков производительности в KasperskyOS.
Пример включает в себя две программы: Worker
и Monitor
.
Программа Worker
выполняет вычисления в цикле, периодически нагружая процессор и используя память.
Программа Monitor
использует функцию KnProfilerGetCounter()
библиотеки libkos
для получения значений счетчиков производительности для программы Worker
и выводит их в консоль.
Для сборки и запуска примера используется система CMake
из состава KasperskyOS Community Edition.
При сборке и запуске этого примера на QEMU некоторые счетчики производительности могут работать некорректно.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/perfcnt
Сборка и запуск примера
См. "Сборка и запуск примеров".
В начало