RISC-V P4

PDF

Постановка задачи

Для выполнения перспективных работ возникла задача проверки работоспособности приложений P4 и компилятора P4C на аппаратной платформе с процессором RISC-V. В качестве платформы была выбрана плата HiFive Unleashed производства компании SiFive. Для этой платформы имеется ряд SDK, основанных на ОС Linux и доступных в исходном коде. После ряда экспериментов было выбрано в качестве основы решение SiFive Freedom Unleashed SDK на основе среды разработки OpenEmbedded (Yocto, OE). Репозиторий исходных кодов включает компоненты, оптимизированные для платы HiFive Unleashed, что позволило сразу же перейти к созданию образа с нужными компонентами P4. Создание и установка базового образа с компонентами P4 были описаны ранее. Здесь же более подробно рассматривается текущее состояние использованных компонент, возникшие проблемы и возможные способы их решения. Сборка образа выполнялась в среде Mageia Linux v7.1.

Набор компонент

Для экспериментов были выбраны модель BMV2 с библиотекой PI и компилятор P4C. Все эти компоненты зависят от библиотеки Judy, поэтому работа началась со сборки этой библиотеки, отсутствующей в репозитории meta-sifive.

Библиотека Judy

Judy представляет собой библиотеку функций C для работы с динамическими массивами. Эти функции широко используются компонентами и приложениями P4. После загрузки исходного кода было создано задание для сборки пакета в системе OE. Настройка конфигурации для сборки проблем не вызвала, но при компиляции возникли ошибки.

В процессе компиляции пакета создаются два исполняемых файла (JudyLTablesGen и Judy1TablesGen), которые запускаются для генерации таблиц (файлы C), применяемых далее в процессе компиляции. Проблема заключается в том, что создаются исполняемые файлы для процессора RISC-V, а запускаются они в среде кросс-компиляции и, естественно, не могут работать. Эта проблема известна уже давно (см., например, https://sourceforge.net/p/judy/bugs/21/ и https://www.linuxquestions.org/questions/linux-software-2/cross-compiling-libjudy-608455/), но решения найти не удалось, поэтому был выбран другой подход, представляющийся более реальным.

Библиотека была собрана непосредственно на платформе HiFive Unleashed1 и созданные таблицы были перенесены в среду кросс-компиляции, а запуск программ генерации таблиц был исключен из соответствующих файлов Makefile. Собранная в результате библиотека Judy работает при загрузке образа на платформе HiFive Unleashed.

Недостатком решения является необходимость повторения переноса файлов и правки Makefile при каждом изменении конфигурации Judy. Но в любом случае это многократно быстрее повторения сборки непосредственно на платформе.

Библиотека PI

PI представляет собой набор API (исходный код) для взаимодействия с объектами, определенными в программах P4 (таблицы, счетчики, измерители). Для сборки и работы требуется выполнить ряд зависимостей, включая пакет behavioral-model (bmv2). Но для сборки этого пакета требуется наличие PI. В результате образуется циклическая зависимость, которая не позволяет собрать пакеты в среде OE. Приходиться отказаться от поддержки BMV2. Остальная часть настройки и сборки проходит без проблем и пакет удается включить в образ.

Пакет BMV2

Этот пакет (исходный код) включает прототипы коммутаторов и маршрутизатора, работающих на основе кода P4. Некоторые фрагменты кода P4 представлены в примерах. Настройка и сборка пакета серьезных проблем не вызвали, пока не была предпринята попытка включить библиотеку Apache Thrift, без которой собирались лишь библиотеки, но не исполняемые программы (simple_switch и др.), что нас явно не устроило.

Когда была включена опция работы с Thrift2, настройка конфигурации для сборки завершалась ошибкой.

| checking dynamic linker characteristics... (cached) GNU/Linux ld.so 
| checking how to hardcode library paths into programs... immediate 
| checking whether riscv64-oe-linux-g++    -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+
gitAUTOINC+9a331b900c-r0/recipe-sysroot supports C++11 features by default... yes 
| checking for thrift... no 
| checking thrift/Thrift.h usability... no 
| checking thrift/Thrift.h presence... no 
| checking for thrift/Thrift.h... no 
| configure: error: Thrift headers not found. Install Thrift from http://thrift.apache.org/docs/install/ 
| WARNING: /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/temp/run.do_configure.3659:1 exit 1 from 'exit 1' 
ERROR: Task (/OE/sifive-new/meta-poPingUI/recipes-p4/bm/bm_git.bb:do_configure) failed with exit code '1'

Явное добавление в файл задания зависимости от thrift и thrift-native проблему не решило.

| checking for thrift... /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/recipe-sysroot-native/usr/bin/thrift 
| checking thrift/Thrift.h usability... yes 
| checking thrift/Thrift.h presence... yes 
| checking for thrift/Thrift.h... yes 
| checking thrift/stdcxx.h usability... no 
| checking thrift/stdcxx.h presence... no 
| checking for thrift/stdcxx.h... no 
| checking for thrift version... configure: error: in `/OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/build': 
| configure: error: cannot run test program while cross compiling 
| See `config.log' for more details 
| WARNING: /OE/sifive-new/build/tmp-glibc/work/riscv64-oe-linux/bm/1.13.0+gitAUTOINC+9a331b900c-r0/temp/run.do_configure.9810:1 exit 1 from 'exit 1'

При просмотре журнала настройки конфигурации сборки (config.log) подтвердилось, что кросс-компиляция пакета не поддерживается.

configure:16615: error: cannot run test program while cross compiling

Таким образом, создание полноценного пакета BMV2 в среде кросс-компиляции оказалось невозможным и остается лишь собирать пакет непосредственно на платформе HiFive Unleashed.

Компилятор P4C

Пакет P4C представляет собой прототип компилятора, поддерживаюзий спецификации P414 и P416. При попытке собрать пакет в кросс-среде OE возникли проблемы, аналогичные ситуации с библиотеков Judy, описанной выше. Здесь также генерируется ряд файлов исходного кода с помощью созданной в процессе компиляции программы. Путем переноса файлов, созданных при сборке на платформе HiFive Unleashed и исключения одной строки из файла build.ninja, управляющего сборкой, проблему удалось решить.

Заключение

Проведенные эксперименты показывают, что собрать образ Linux для платы HiFive Unleashed (это справедливо и для других плат) с поддержкой P4 в среде кросс-компиляции OpenEmbedded на сегодняшний день не представляется возможным. Для решения этой задачи требуется внести достаточно серьезные изменения в исходный код ряда компонент и библиотек.

Работа выполнена в рамках проекта «Орион».

Николай Малых

nmalykh@protokols.ru

1Может возникнуть резонный вопрос — почему не собрать все компоненты непосредственно на платформе, коль скоро имеется набор инструментальных средств. Ответ достаточно прост и безрадостен — сборка P4C на платформе занимает больше 10 часов, поэтому оказалось проще перенести файлы в среду сборки, где производительность во много раз выше.

2Она включена по умолчанию и для отключения нужна опция —without-thrift.

Запись опубликована в рубрике Linux, RISC-V, SDN, Сетевое программирование. Добавьте в закладки постоянную ссылку.