Быстрый старт
Ознакомление с Embox лучше начать с запуска на эмуляторе qemu поддерживающего различные процессорные архитектуры.
Получение кода Embox
Клонируем мастер:
$ git clone https://github.com/embox/embox
Либо скачиваем архивом из https://github.com/embox/embox/releases
Работа в Windows и MacOS
Все описания сделаны для Linux. Для сборки и работы под Windows и MacOS лучше использовать Docker в котором уже настроено все необходимое окружение для начальной работы. Для этого:
- Установите docker для вашей ОС.
- Убедитесь, что docker установлен правильно с помощью команд:
$ docker-machine ls
$ docker-machine start default
- Перейдите в консоли в корневую папку с исходниками Embox.
- Запустите докер выполнив скрипт
$ ./scripts/docker/docker_start.sh
- Для упрощения работы выполните скрипт командой
$. ./scripts/docker/docker_rc.sh
Данный скрипт позволит писать команду dr
вместо docker run
Далее перед каждой командой необходимо вставлять dr
. Например,
$ dr make confload-x86/qemu
$ dr make
$ dr ./scripts/qemu/auto_qemu
Для конфигурации сборки и запуска базового темплейта.
После установки и проверки работоспособности, можно пропустить раздел настройка окружения и перейти сразу к разделу “Сборка и запуск на QEMU”
Настройка окружения
Необходимые пакеты: make, gcc (кросс-компилятор под выбранную архитектуру, см. “Установка кросс-компилятора”). Дополнительные пакеты (рекомендуется установить сразу): build-essential gcc-multilib curl libmpc-dev python Пример установки для Debian:
$ sudo apt-get install make gcc \
build-essential gcc-multilib \
curl libmpc-dev python
Пример установка для Arch:
$ sudo pacman -S make gcc-multilib cpio qemu
Установка кросс-компилятора
x86:
$ sudo apt-get install gcc
Обычно уже установленный пакет. Вам потребуется другой компилятор, если Вы настраиваете окружение самостоятельно для Windows или MacOS.
ARM:
$ sudo apt install arm-none-eabi-gcc
Или для Debian
$ sudo apt install gcc-arm-none-eabi
Либо скачать архив с тулчейном с сайта https://launchpad.net/gcc-arm-embedded. Распаковать архив и сделать export тулчейна:
$ export PATH=$PATH:<путь к тулчейну>/gcc-arm-none-eabi-<version>/bin
SPARC, Microblaze, MIPS, PowerPC, MSP430:
Для этих архитектур можно воспользоваться нашим проектом по сборке crosstool https://github.com/embox/crosstool.
Можно скачать последнюю версию уже собранного архива в требуемым кросс-компилятором отсюда https://github.com/embox/crosstool/releases.
Или собрать его выкачав скрипты из репозитория с помощью команды
$ ./crosstool.sh ARCH
После этого должен появиться архив с тулчейном — ARCH-elf-toolchain.tar.bz2. Далее, его нужно распаковать и добавить в переменную окружения PATH как показано выше для ARM.
Установка эмулятора QEMU
Поддерживаемые архитектуры: x86, ARM, MIPS, Sparc, PPC, Microblaze.
Необходимые пакеты: qemu (под выбранную архитектуру)
$ sudo apt-get install qemu-system-<ARCH>
где
$ sudo apt-get install qemu-system
Сборка и запуск на QEMU
Загружаем конфигурацию по умолчанию для выбранной архитектуры:
$ make confload-<ARCH>/qemu
, где
$ make confload-x86/qemu
Собираем Embox:
$ make
или запускаем параллельную сборку:
$ make (-jN)
Пример:
$ make -j4
Запускаем:
$ ./scripts/qemu/auto_qemu
Пример вывода в консоль:
Embox kernel start
unit: initializing embox.kernel.task.task_resource: done
unit: initializing embox.mem.vmem_alloc: done
...
Если все unit тесты прошли успешно и система загружена, появиться консоль в которой можно выполнять команды. Начать можно с команды 'help' которая выведет список доступных команд для вашей конфигурации. Для выхода из эмулятора qemu нажмите последовательно ctrl+’A’ затем ‘x’.
Особенности системы сборки Mybuild
Embox - модульная и конфигурируемая система. Для этих целей был разработан декларативный язык описания Mybuild. Он позволяет описывать как отдельные единицы системы (модули) так и всю систему в целом.
Модуль является базовым понятием для системы сборки. Он содержит: список файлов относящихся к данному модулю, параметры которые можно задать модулю в момент конфигурации и список зависимостей.
Конфигурация является детализированным описанием желаемой системы. Включает в себя: список модулей необходимых для сборки, параметры модулей и описания правил сборки (компилятор, флаги компилятора, карта памяти устройства, и так далее). На основе конфигурации и описания модулей строится граф с параметрами системы и по нему генерируются различные файлы для сборки: линкер скрипты, makefile-ы, заголовочные файлы. В конфигурации не обязательно указывать все необходимые модули, они подтягиваются по зависимостям из описания модулей.
Текущая конфигурация располагается в папке conf/. Может быть выбрана с помощью команды
$ make confload-<CONF_NAME>
Например, для задания демонстрационной конфигурации для запуска на qemu-system-arm необходимо выполнить
$ make confload-arm/qemu
Для просмотра готовых конфигураций можно выполнить
$ make confload
После задания текущей конфигурации можно изменять файлы под свои требования. Например, чтобы добавить какое нибудь приложение которого нет в текущей конфигурации достаточно добавить в файл conf/mods.conf строку
include <PACKAGE_NAME><MODULE_NAME>
Пример, для добавления в конфигурацию команды 'help' нужно добавить строчку
include embox.cmd.help
Создание и запуск “hello world”
Приложение в Embox представляет собой модуль в описании которого содержаться атрибуты указывающие, что это приложение можно запускать из командной строки. Исходный код представляет собой обычное приложение которое можно скомпилировать с том числе и в Linux окружении.
Создание и запуск примера
Разберем простейшее приложение “hello world”.
- Создадим папку hello_world в src/cmds:
$ mkdir src/cmds/hello_world
- Создадим файл с исходным кодом приложения src/cmds/hello_world/hello_world.c со следующим содержанием:
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello, world!\n");
}
- Создадим файл описания модуля src/cmds/hello_world/Mybuild следующего содержания:
package embox.cmd
@AutoCmd
@Cmd(name = "hello_world", help=”First Embox application”)
module hello_world {
source "hello_world.c"
}
- Добавим в файл конфигурации системы conf/mods.conf строчку с подключением нового модуля:
include embox.cmd.hello_world
- Компилируем:
$ make
- Запускаем:
$ ./scripts/qemu/auto_qemu
В появившейся консоли убедимся, что если набрать команду 'help' то в списке будет новая команда. Выполним команду набрав ее в консоли hello_world Должно появиться наше сообщение выведенное с помощью функции printf() :
root@embox:/#hello_world
Hello, world!
root@embox:/#
Файл описания модуля
Разберем немного подробнее файл описания модуля.
package embox.cmd
@AutoCmd
@Cmd(name = "hello_world", help=”First Embox application”)
module hello_world {
source "hello_world.c"
}
В первой строке идет указание имени пакета package embox.cmd. В Embox все модули распределены по пакетам, для удобства именования. Полное имя модуля будет состоять из имени пакета и имени модуля. Имя модуля в нашем случае находиться в строке module hello_world.
Строка source "hello_world.c" указывает файлы с исходным кодом необходимые для корректной сборки модуля.
В строке @Cmd(name = "hello_world", help=”First Embox application”) задается атрибут для модуля. Во первых модуль будет представлять из себя приложение, во вторых задает имя с помощью которого это приложение можно вызвать. И наконец, задается строка, которая будет отображаться для этого приложения при вызове команды 'help'. Строка @AutoCmd указывает, что в приложении есть стандартная функция входа в приложение main(), которая будет заменена на другой символ в процессе сборки.