Автор: студент 545 группы Абусалимов Э.Ш. Научный руководитель: асп. каф. системного программирования Бондарев А.В. Рецензент: Венгеров В.В. Система сборки, анализа и верификации кода ОСРВ Embox Дипломная работа
ОСРВ Embox: модульная и конфигурируемая Исходные коды (на сегодня около 300 файлов) организованы в модули (около 180) Модули взаимосвязаны по следующим отношениям: o "Зависит от" (около 100 связей) o "Наследует" (около 20 связей) Каждый модуль также имеет: o Документацию o Флаги компиляции o Доступные опции конфигурации Проблемная область
Постановка задачи Система сборки, обладающая следующими свойствами: Простой формат описаний o Для разработчика o Для конечного пользователя Поддержка межмодульных зависимостей o Разрешение зависимостей при сборке Возможность использовать знания о конфигурации во время исполнения o Внедрение зависимостей Верификация предоставленных описаний o Анализ исходного кода o Проверка корректности описаний
GNU Make – стандарт де-факто в Unix'ах o Инкрементальная сборка o Слишком общее средство o Не решает ни одну из поставленных задач GNU Autotools – переносимость программ между Unix'ами o Основная цель отлична от поставленной задачи Cmake, Scons – замена GNU Autotools o Не ориентированы на модульные приложения Kbuild – система сборки ядра Linux o Поддерживает зависимости для опций CONFIG_XXX o Информация о зависимостях используется только во время сборки Существующие средства
Система сборки Embuild GNU Make Embuild cache CPP conf -files em -files Dependency graph nm output analysis Verification tool Dependency injection Make rules generation source GCC, nm
Формат описаний em -файлы – для разработчика: Подмножество языка Make define module foo brief = Main application module sources = foo.c depends = bar endef conf -файлы – для конечного пользователя: Обрабатываются препроцессором C module(foo)
Разрешение зависимостей define module bar sources = bar.c endef define module foo sources = foo.c depends = bar endef foo.em:bar.em: modules.conf: module(foo) Граф зависимостей:
Абстрактные модули define api alloc brief = Dyn memory endef define module baz depends = alloc endef baz.em:alloc.em: define module best_fit sources = best_fit.c provides = alloc endef define module buddy sources = buddy.c provides = alloc endef buddy.em:best_fit.em:
define module bar sources = bar.c endef Внедрение зависимостей define module foo sources = foo.c depends = bar endef static int foo_init() { printf("%d", the_answer); return 0; } MODULE_INIT(foo_init); int the_answer; static int bar_init() { the_answer = 42; return 0; } MODULE_INIT(bar_init); foo.c:bar.c: foo.em:bar.em:
define module bar sources = bar.c endef Верификация описаний define module foo sources = foo.c depends = bar endef static int foo_init() { printf("%d", the_answer); return 0; } MODULE_INIT(foo_init); int the_answer; static int bar_init() { the_answer = 42; return 0; } MODULE_INIT(bar_init); foo.c:bar.c: foo.em:bar.em:
Анализ исходного кода static int foo_init() { printf("%d", the_answer); return 0; } MODULE_INIT(foo_init); int the_answer; static int bar_init() { the_answer = 42; return 0; } MODULE_INIT(bar_init); foo.c:bar.c: Компиляция | Обработка утилитой nm | анализ вывода U the_answer B the_answer foo.o:bar.o:
Анализ графов зависимостей define module bar sources = bar.c endef define module foo sources = foo.c depends = bar endef foo.em:bar.em: U the_answer B the_answer foo.o:bar.o: Сопоставление дуг
KbuildEmbuild Сравнение Рекурсивный MakeНерекурсивный Make Опции конфигурации и список исходников в разных файлах Описание модуля в одном файле Все опции в одном пространстве имен Различные пространства имен для модулей Ограничивается только сборкой образа Модель зависимостей доступна во время исполнения Отсутствие средств верификации Анализ и сравнение описаний с исходным кодом Используют среду исполнения GNU Make Сборка приложений, имеющих множество конфигураций
Полученные результаты Реализована система сборки Embuild, которая: Имеет простой формат описаний o Модулей разрабатываемого приложения o Конечной конфигурации приложения Поддерживает межмодульные зависимости o Разрешение зависимостей при сборке Использует знания о конфигурации во время исполнения o Внедрение зависимостей Обладает возможностью верификации предоставленных описаний o Анализ исходного кода o Проверка корректности описаний
Контакты Эльдар Абусалимов Embox Project Homepage Essential toolbox for embedded development