Быстрый старт

Ознакомление с 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> 

где это i386, arm, sparc, mips, ppc или misc (для microblaze) Примечание: Все пакеты qemu можно установить единым пакетом —

    $ sudo apt-get install qemu-system

Сборка и запуск на QEMU

Загружаем конфигурацию по умолчанию для выбранной архитектуры:

   $ make confload-<ARCH>/qemu

, где : x86, arm, mips, ppc, sparc, microblaze. Пример под x86:

    $ 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(), которая будет заменена на другой символ в процессе сборки.