После изучения того, как информация о разделах модуля попадает в sysfs, я не нашел способа извлечь ее без использования внутренних структур ядра.Использование такого материала не является опцией в моем проекте, поэтому я наконец-то реализовал другой подход, который, надеюсь, более надежен.Мой модуль ядра использует вспомогательный API пользовательского режима для запуска процесса в пользовательском пространстве (фактически, это оболочка, выполняющая мой скрипт).Этот процесс получает имя «целевого» модуля ядра в качестве параметра и собирает информацию о его разделах из sysfs (/sys/module/<target_name>/sections/
).Из пространства пользователя эту информацию можно легко получить.После этого он передает собранные данные моему модулю ядра в виде строки через файл в debugfs.Модуль анализирует строку и проверяет ее содержимое.Если все в порядке, имена и начальные адреса секций ELF будут доступны.
Признаюсь, уловка с помощником пользовательского режима довольно неуклюжа, но она выполняет свою работу.
Я подготовил пример реализации описанного выше подхода - см. Пример «Разделов» .
Подробнее о вспомогательном API пользовательского режима см. Код в <linux/kmod.c>
и * 1013.* в исходниках ядра, а именно в определении call_usermodehelper()
.Примеры, а также объяснения типичного использования API доступны в этой статье .
Обратите внимание, что примеры из , в которых статья немного неточна: функция init модуля возвращает там результат call_usermodehelper()
.Последний, однако, возвращает 2-байтовый код состояния (по крайней мере, когда вызывается с UMH_WAIT_PROC
), а не 0 или отрицательный код ошибки, который должна вернуть функция init.Это может привести к предупреждениям во время выполнения.Что call_usermodehelper()
на самом деле возвращает, объясняется здесь .