Система сборки, анализа и верификации кода ОСРВ Embox Дипломная работа Автор: студент 545 группы Абусалимов Э.Ш. Научный руководитель: асп. каф. системного программирования Бондарев А.В. Рецензент: Венгеров В.В. Проблемная область ОСРВ 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 Verification tool nm output analysis Dependency injection Make rules generation Dependency graph source conf-files GCC, nm CPP em-files GNU Make Embuild cache Формат описаний em-файлы – для разработчика: • Подмножество языка Make define module foo brief = Main application module sources = foo.c depends = bar endef conf-файлы – для конечного пользователя: • Обрабатываются препроцессором C module(foo) Разрешение зависимостей foo.em: bar.em: define module foo sources = foo.c depends = bar endef define module bar sources = bar.c endef Граф зависимостей: modules.conf: module(foo) Абстрактные модули baz.em: alloc.em: define module baz depends = alloc endef define api alloc brief = Dyn memory endef buddy.em: best_fit.em: define module buddy sources = buddy.c provides = alloc endef define module best_fit sources = best_fit.c provides = alloc endef Внедрение зависимостей foo.em: bar.em: define module foo sources = foo.c depends = bar endef define module bar sources = bar.c endef foo.c: bar.c: 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.em: bar.em: define module foo sources = foo.c depends = bar endef define module bar sources = bar.c endef foo.c: bar.c: 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: 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); • Компиляция | Обработка утилитой nm | анализ вывода foo.o: bar.o: U the_answer 00000000 B the_answer Анализ графов зависимостей foo.o: bar.o: U the_answer 00000000 B the_answer • Сопоставление дуг foo.em: bar.em: define module foo sources = foo.c depends = bar endef define module bar sources = bar.c endef Сравнение Kbuild Embuild Используют среду исполнения GNU Make Сборка приложений, имеющих множество конфигураций Рекурсивный Make Нерекурсивный Make Опции конфигурации и список исходников в разных файлах Описание модуля в одном файле Все опции в одном пространстве Различные пространства имен имен для модулей Ограничивается только сборкой Модель зависимостей доступна образа во время исполнения Отсутствие средств верификации Анализ и сравнение описаний с исходным кодом Полученные результаты Реализована система сборки Embuild, которая: • Имеет простой формат описаний o Модулей разрабатываемого приложения o Конечной конфигурации приложения • Поддерживает межмодульные зависимости o Разрешение зависимостей при сборке • Использует знания о конфигурации во время исполнения o Внедрение зависимостей • Обладает возможностью верификации предоставленных описаний o Анализ исходного кода o Проверка корректности описаний Контакты Essential toolbox for embedded development Embox Project Homepage • http://code.google.com/p/embox/ Эльдар Абусалимов • eldar.abusalimov@gmail.com