Вопрос или проблема
Я скомпилировал простой драйвер для ядра Linux для системы ARM:
$ uname -a
Linux CR5 4.4.171-cr5 #2 Tue Mar 10 11:49:00 CET 2020 armv7l GNU/Linux
Для компиляции я использовал конфигурационный файл из работающей системы, расположенный по адресу:
/proc/config.gz
Я загрузил ванильное ядро, переключился на тег 4.4.5, заменил конфигурационный файл, скомпилировал ядро, а затем скомпилировал драйвер с помощью инструментария для ARM:
gcc-linaro-7.2.1-2017.11-i686_arm-linux-gnueabi
Драйвер содержит простой код
#include <linux/module.h>
#include <linux/kernel.h>
int init_module(void) {
printk(KERN_INFO "Привет, мир.\n");
return 0;
}
void cleanup_module(void) {
printk(KERN_INFO "До свидания, мир.\n");
}
Я использовал insmod для загрузки драйвера, но сообщение об ошибке в терминале:
insmod: ERROR: не удалось вставить модуль test_module.ko: Неверный формат модуля
В dmesg я получаю следующее сообщение:
test_module: несовпадение версии символа module_layout
Однако, когда я сравнивал загруженный в систему модуль с моим модулем с помощью readelf -a
Заголовки ELF идентичны, и Атрибуты файла совпадают.
Что еще я могу проверить? Может, загрузка модуля была заблокирована ядром? Как я могу это проверить? Есть ли кто-то, кто может подсказать, что мне делать дальше?
p.s
- программа на простом C работает нормально, так что я думаю, что инструментарий в порядке
- insmod -f также не сработало
Спасибо
Проблема была в компоновке, хотя всё выглядело одинаково, компоновка была изменена.
Ответ найден здесь
Ответ или решение
Проблема, с которой вы столкнулись, связана с несовместимостью символа module_layout
. Эта ошибка возникает, когда модуль, который вы пытаетесь загрузить, скомпилирован для другой версии ядра, чем установленное в вашей системе. Вот подробное объяснение возможных причин и решений.
Возможные причины проблемы:
-
Неправильная версия ядра: Вы указали, что вы собрали ядро версии 4.4.5, однако на машине, на которой вы пытаетесь загрузить модуль, работает ядро версии 4.4.171-cr5. Это может привести к несовместимости символов, так как версии могут иметь изменения в структуре.
-
Использование неправильной конфигурации: Вы загрузили конфигурационный файл из
/proc/config.gz
, но убедитесь, что все опции ядра, связанные с модульной системой, правильно настроены. Особенно это касается параметров, влияющих на поддержку модулей. - Определение структуры
module_layout
: Структураmodule_layout
могла измениться между версиями ядра, что значит, что ваш модуль может не совпадать со структурой, ожидаемой в текущем ядре.
Как исправить ситуацию:
-
Соберите модуль для правильной версии ядра: Если возможно, следует пересобрать модуль для версии ядра 4.4.171-cr5. Это гарантирует совместимость, поскольку вы будете использовать символы и структуру, которые действительно присутствуют в вашем работающем ядре.
-
Проверка конфигураций: Убедитесь, что конфигурационный файл, используемый для сборки модуля, соответствует конфигурации ядра. Например, если вы используете параметры ядра для модуля, убедитесь, что они активированы в конфигурации вашего ядра.
-
Проверьте наличие обновлений: Если возможно, обновите ваше ядро до более новой версии и пересоберите ваши модули, чтобы избежать таких несовместимостей.
- Исследуйте зависимости: Иногда проблема может быть связана с другими модулями или зависимостями. Убедитесь, что все необходимые модули также загружены и совместимы.
Заключение:
Вы уже столкнулись с типичной проблемой несовместимости, когда работаете с ядром и модулями. Правильная версия для сборки, корректные конфигурации и чёткое соответствие между версиями ядра – ключевые факторы для успешной загрузки модулей. Надеюсь, информация окажется полезной, и вы сможете решить вашу проблему. Если у вас есть дополнительные вопросы или потребность в уточнении, не стесняйтесь обращаться.