Po tym samouczku napisać mój pierwszy sterownik.
Plik Makefile to:
# 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
A kod sterownika to:
* 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");
Podczas make nie ma błędu. Ale kiedy korzystam, insmod ofd.ko
nie mogę go załadować. W dmesg
tym jest napisane:
nie zgadza się na temat wersji symbolu moduł_wyjściowy
uname -r
zwraca „3.8.0-38-generic”, a źródło jądra również 3.8.modprobe -f ofd.ko
również zawodzi
Również:
#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
Co się dzieje?
linux
compiling
kernel-modules
użytkownik2799508
źródło
źródło
Odpowiedzi:
Jądro Linux zawiera struktury danych, których układ różni się nie tylko w zależności od wersji, ale także w zależności od opcji kompilacji. W związku z tym podczas kompilacji modułu jądra potrzebne są nie tylko pliki nagłówkowe ze źródła jądra, ale także niektóre pliki nagłówkowe generowane podczas kompilacji jądra. Samo rozpakowanie źródła jądra nie wystarczy.
W przypadku jądra zbudowanego za pomocą
CONFIG_MODVERSIONS
numeru wersji może się różnić, ale układ struktur danych musi być taki sam. Ta opcja jest aktywowana w jądrach Ubuntu. Dzięki tej opcji, oprócz nagłówków, moduły muszą zostać skompilowane z odpowiednimModule.symvers
plikiem. Ubuntu, podobnie jak większość dystrybucji, zawiera ten plik w tym samym pakiecie, co nagłówki jądra wynikające z kompilacji. Pakiet nagłówka jądra Ubuntu nazywa się np .linux-headers-VERSION-VARIANT
linux-headers-3.8.0-38-generic
W jądrach zbudowanych bez
CONFIG_MODVERSIONS
(co może się zdarzyć, jeśli skompilowałeś własne jądro), sprawdzanie podczas ładowania modułu jest prostym sprawdzaniem wersji. Możesz pobrać rozpakowane źródło jądra, skopiować to,.config
które było użyte podczas kompilacji uruchomionego jądra i uruchomićmake modules_prepare
. Na tobie spoczywa obowiązek sprawdzenia, czy jakakolwiek łatka wprowadzona do jądra nie wpływa na zgodność binarną.źródło