После этого урока, чтобы написать мой первый драйвер.
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
Что происходит?
linux
compiling
kernel-modules
user2799508
источник
источник
Ответы:
Ядро Linux содержит структуры данных, структура которых варьируется не только от версии к версии, но и в зависимости от параметров компиляции. Как следствие, когда вы компилируете модуль ядра, вам нужны не только заголовочные файлы из источника ядра, но также некоторые заголовочные файлы, которые генерируются во время компиляции ядра. Просто распаковки исходного кода ядра недостаточно.
В ядрах, созданных с помощью
CONFIG_MODVERSIONS
, номер версии может отличаться, но структура структур данных должна быть одинаковой. Эта опция активирована в ядрах Ubuntu. С этой опцией, в дополнение к заголовкам, модули должны быть скомпилированы для соответствующегоModule.symvers
файла. Ubuntu, как и большинство дистрибутивов, включает этот файл в тот же пакет, что и заголовки ядра, полученные в результате компиляции. Пакет заголовка ядра Ubuntu называется , например .linux-headers-VERSION-VARIANT
linux-headers-3.8.0-38-generic
С ядрами, собранными без
CONFIG_MODVERSIONS
(что может быть в случае, если вы скомпилировали свое собственное ядро), проверка при загрузке модуля является простой проверкой версии. Вы можете взять распакованный исходный код ядра, скопировать тот,.config
который использовался во время компиляции вашего работающего ядра, и запуститьmake modules_prepare
. На вас лежит ответственность за проверку того, что любой сделанный вами патч для ядра не влияет на двоичную совместимость.источник