Невозможно загрузить модуль: не согласен с версией символа module_layout


12

После этого урока, чтобы написать мой первый драйвер.

Makefile - это:

# Makefile – makefile of our first driver

# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
    obj-m := ofd.o
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
    KERNEL_SOURCE := /usr/src/linux 3.8
    PWD := $(shell pwd)
default:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules

clean:
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif

И код драйвера:

* ofd.c – Our First Driver code */
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>

static int __init ofd_init(void) /* Constructor */
{
    printk(KERN_INFO "Namaskar: ofd registered");
    return 0;
}

static void __exit ofd_exit(void) /* Destructor */
{
    printk(KERN_INFO "Alvida: ofd unregistered");
}

module_init(ofd_init);
module_exit(ofd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Anil Kumar Pugalia <email_at_sarika-pugs_dot_com>");
MODULE_DESCRIPTION("Our First Driver");

Там нет ошибки во время make. Но когда я использую, insmod ofd.koя не могу загрузить его. В dmesgнем говорится:

не согласен с версией символа module_layout

  • uname -r возвращает '3.8.0-38-generic' и исходный код ядра также 3.8.
  • modprobe -f ofd.ko также не удается

Также:

#56~precise1-Ubuntu SMP Thu Mar 13 16:23:47 UTC 2014
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 12.04.4 LTS
Release:    12.04
Codename:   precise

Что происходит?


Несколько очевидных комментариев. Во-первых, точно ли совпадает исходный код ядра с ядром Ubuntu? Вы должны использовать исходный код ядра Ubuntu, точно соответствующий вашему ядру. Upstream, вероятно, не будет работать, так как дистрибутивы исправляют свои ядра. Во-вторых, afaik вы можете компилировать с заголовками ядра, вам не нужен исходный код ядра. Заголовки также должны быть доступны в виде двоичного пакета. Вы также можете взглянуть на Руководство по ядру Debian , в котором есть полезные сведения о ядрах и т. Д. В Debian, которые также применимы к Ubuntu.
Фахим Митха

Ответы:


13

Ядро Linux содержит структуры данных, структура которых варьируется не только от версии к версии, но и в зависимости от параметров компиляции. Как следствие, когда вы компилируете модуль ядра, вам нужны не только заголовочные файлы из источника ядра, но также некоторые заголовочные файлы, которые генерируются во время компиляции ядра. Просто распаковки исходного кода ядра недостаточно.

В ядрах, созданных с помощью CONFIG_MODVERSIONS, номер версии может отличаться, но структура структур данных должна быть одинаковой. Эта опция активирована в ядрах Ubuntu. С этой опцией, в дополнение к заголовкам, модули должны быть скомпилированы для соответствующего Module.symversфайла. Ubuntu, как и большинство дистрибутивов, включает этот файл в тот же пакет, что и заголовки ядра, полученные в результате компиляции. Пакет заголовка ядра Ubuntu называется , например .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

С ядрами, собранными без CONFIG_MODVERSIONS(что может быть в случае, если вы скомпилировали свое собственное ядро), проверка при загрузке модуля является простой проверкой версии. Вы можете взять распакованный исходный код ядра, скопировать тот, .configкоторый использовался во время компиляции вашего работающего ядра, и запустить make modules_prepare. На вас лежит ответственность за проверку того, что любой сделанный вами патч для ядра не влияет на двоичную совместимость.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.