Неможливо завантажити модуль: не погоджуються щодо версії символу_молодіння модуля


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");

Під час виготовлення помилок немає. Але коли я використовую, 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, що відповідає саме вашому ядру. Верхній потік, ймовірно, не працюватиме, оскільки дистрибутиви виправляють ядра. По-друге, afaik, який ви можете компілювати з заголовками ядра, джерело ядра вам не потрібно. Заголовки також повинні бути доступними у вигляді двійкового пакету. Ви також можете ознайомитися з посібником з ядра Debian , який містить повчальні матеріали про ядра тощо на Debian, що також стосується Ubuntu.
Faheem Mitha

Відповіді:


13

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

У ядрах, побудованих за допомогою CONFIG_MODVERSIONS, номер версії може відрізнятися, але компонування структур даних має бути однаковим. Ця опція активована в ядрах Ubuntu. З цією опцією, окрім заголовків, модулі потрібно зібрати у відповідний Module.symversфайл. Ubuntu, як і більшість дистрибутивів, включає цей файл у той самий пакет, що й заголовки ядра, що є результатом компіляції. В Ubuntu Kernel заголовок пакета називається , наприклад .linux-headers-VERSION-VARIANTlinux-headers-3.8.0-38-generic

З ядрами, побудованими без CONFIG_MODVERSIONS(що може бути випадком, якщо ви склали власне ядро), перевірка при завантаженні модуля - це проста перевірка версії. Ви можете взяти джерело розпакованого ядра, скопіювати те, .configщо було використано під час компіляції запущеного ядра, та запустити make modules_prepare. Здійснюється функція onus, щоб переконатися, що будь-який патч, який ви внесли до ядра, не впливає на бінарну сумісність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.