В данном репозитории собран ряд утилит для изучения исходных кодов модуля ядра Linux и для работы с ними. Программы имеют внешние по perl модулям и другим программам. Для того, чтобы установить perl модули необходимо выполнить команды:
cpan cpanm cpanm --with-all-features --installdeps .
Зависимости по иным программам описываются на отдельной странице EXTERNAL_DEPS.md
Для удобства работы с программами можно задать переменные окружения:
- CURRENT_PROJECT - директория с исходными кодами исследуемого модуля ядра Linux
- CURRENT_KERNEL - директория с исходными кодами ядра Linux с которым сочетается модуль
Каждая из программ имеет собственную man документацию, которая доступна по ключу --help. Здесь сведено вместе краткое описание программ, их функциональности и предназначения.
Данные программы используются для работы с исходными кодами и разработки спецификаций.
- extricate - из исходных кодов "вытаскиваются" все зависимости для конкретных функций так, чтобы компилятор мог создать отдельный объектный файл. У инструментов верификации вызывает затруднение работа с большими объёмами кода, что проявляется в существенном замедлении их работы. Программа позволяет многократно сократить объём исходного кода за счёт того, что неиспользуемый код исключается. В получившемся коде функции расположены в соответствии с графом их вызовов, структуры и остальные сущности расположены так, чтобы программисту было наиболее удобно работать с получившимся набором исходных кодов.
- merge - спецификации переносятся с одного набора исходных кодов на другой. Осуществляется полуавтоматическим образом. В случае невозможности автоматического разрешения конфликтов вызывается внешняя программа. Расположение функций в файлах не имеет значения.
Данные программы предназначены для изучения исходных кодов модуля ядра как самостоятельного объекта. А также для изучения взаимодействия модулей с интерфейсом ядра. Используются при исследовании новых релизов исходных кодов, для подготовки отчётов и планирования работ.
- graph - строит карту исходных кодов. Карта представляет собой граф вызовов функций модуля ядра.
- graph_diff - строит карту различий между версиями графов вызовов разных релизов.
- complexity_plan - строит таблицу функций, где отображены метрики их сложности.
- headers - строит карту подключений заголовочных файлов в исходном коде.
- calls - программа для анализа и сбора статистики вызовов функций и функциональных макросов в модуле ядра. Автоматическое определение сущности функция/макрос, и места определения ядро/модуль.
- lsm_diff - программа для анализа интерфейса lsm ядра и его использования в модуле ядра.
- stapgen - по исходным кодам ядра создаёт скрипт для systemtap. Скрипт в динамике перехватывает вызовы lsm интерфейса ядра, осуществляет логирование параметров и контекста вызова функции. Позволяет отследить какие действия в ОС, приводят к вызову конкретных функций интерфейса lsm.
- get_preprocessed - осуществляет частичный (раскрываются только макросы ядра) либо полный препроцессинг исходных кодов модуля ядра.
- recursion - программа для детектирования рекурсии (прямой/косвенной) в исходных кодах модуля ядра Linux.
- count_specifications - программа для подсчета количества строк спецификаций на языке ACSL.
- list_functions - программа для вывода "плоского" списка функций модуля в соответствии с приоритетом.
Форматы конфигурационных файлов для этих программ описываются в отдельном файле FORMAT.md
Разворачивается через docker. После карта доступна локально через проброс портов.
docker build -t ext2_callgraph .
docker run -d -p 127.0.0.1:8889:80 ext2_callgraph
firefox http://localhost:8889/graph
- только изображение: http://localhost:8889/graph/image
- html: http://localhost:8889/graph
Передвижение по карте - передвинуть указатель к границе окна. Изменить масштаб - колёсико мышки.
- fmt=fmt - формат (svg|png|jpeg)
- func=func1,func2,... - функции через запятую (отображать не всю карту, а только от заданных функций)
- level=n - строить карту от функций приоритета n
- no-display-done=(0|1) - не отображать на карте проверифицированные функции (по умолчанию 0)
- reverse=(0|1) - строить карту не сверху вниз(какие функции вызываются из функций), а снизу вверх (какие функции могут вызвать функции) (по умолчанию 0)
- from-done=(0|1) - строить карту от проверифицированных функций (по умолчанию 0)
- available=(0|1) - показать доступные для верификации функции, исходя из проверифицированных к текущему моменту функций (по умолчанию 0)
- legend=(0|1) - отображать список приоритетов на карте (по умолчанию 1)
Пример: http://localhost:8889/graph/image?fmt=png&func=ext2_setattr,ext2_mknod
Карта генерируется по коду для каждого запроса. Соответственно, если код/настройки уровней приоритетов меняются, то это будет отображено при следующем запросе. По умолчанию формат - svg. Если кликнуть мышкой по вершине, то будет осуществлён переход по адресу http://localhost:8889/graph/image?func={имя_вершины}
- Проще всего начать исправлять замечания с kritika.io
- Убрать все experimental конструкции
- Вычистить smart-matching
- Минимизировать использование lib/Local функций, заменить их на функции из других библиотек (List::Utils, List::MoreUtils)
- Добавить тестов на другие модули ядра для extricate
- Добавить тестов на другие утилиты (например, сравнение генерируемых dot файлов для graph)
- Использовать Dist::Zilla или другую систему и залить исходных код в CPAN
- Добавить
--help
для описания параметров утилит, в которых это еще не сделано - Упростить кастомизацию регулярок из
*Set.p
модулей (добавить возможность их конфигурации на основе выделения стандартных конструкций и типовых использований макросов) - ...