Zusammensetzen eines Moduls (eines Treibers) des Linuxkernels mithilfe configure, automake, autoconf und anderer Autotools.
Module des Linuxkernels sind Dateien mit der Endung «ko». In der Regel wird das Kommando «insmod» oder das Kommando «modprobe» für das Laden eines Moduls verwendet. Zum Entladen des Moduls dient das Kommando «rmmod». Zum Anzeigen der Liste der geladenen Module dient das Kommando «lsmod». Für weitere Informationen über das Modul dient das Kommando «modinfo».
Hier ist ein Beispiel, wie ein Modul mittels Autotools zusammengestellt werden kann:
1. Erstellen wir ein Verzeichnis für das Projekt module.
2. Im Verzeichnis module erstellen wir das Verzeichnis src.
3. Im src erstellen wir die Datei module_hello.c
/* src/module_hello.c */ #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk("Hello, world!\n"); return 0; } module_init(hello_init); static void __exit hello_exit(void) { printk("Goodbye, world!\n"); } module_exit(hello_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("noname"); MODULE_DESCRIPTION("\"Hello, world!\" test module"); MODULE_VERSION("printk");
Der Algorithmus des Zusammensetzens eines Kernel-Moduls mithilfe Autotools unterscheidet sich ein wenig von dem Algorithmus des Zusammensetzens eines einfachen Programms oder einer Bibliothek. Es sind noch zwei weitere Makefile zu erstellen.
Im Root-Verzeichnis des Moduls (im Verzeichnis module) erstellen wir die Datei:
# Makefile.am SUBDIRS = src
Das Stichwort SUBDIRS bedeutet, dass die Quelldateien für das Zusammenstellen in diesem Verzeichnis sind.
Es ist auch die Datei Makefile.am im Verzeichnis src mit dem folgenden Inhalt zu erstellen:
# src/Makefile.am EXTRA_PROGRAMS = automake_dummy automake_dummy_SOURCES = module_hello.c module_DATA = module_hello.o include ../Makefile.common
automake_dummy_SOURCES sind Quelldateien, aus denen der Modul zusammengesetzt wird.
module_DATA = module_hello.o ist der Modulname.
include ../Makefile.common - unbedingt notwendig ist eine externe Datei einzbinden, die das Zusammensetzen eines Moduls ermöglicht. Diese Datei befindet sich im Root-Verzeichnis des Moduls.
Erstellen wir die Datei Makefile.common im Root-Verzeichnis des Moduls (im Verzeichnis module )
# Makefile.common moduledir = @moduledir@ KERNEL_LOCATION=@kerneldir@ KBUILD_VERBOSE = 1 MOD_DEVDIR = $(PWD) export module_DATA $(module_DATA): $(automake_dummy_SOURCES) mv Makefile Makefile.automake cp $(srcdir)/../Makefile.kernel Makefile CPPFLAGS="" CFLAGS="" LDFLAGS="" \ $(MAKE) -C $(KERNEL_LOCATION) \ ARCH="x86" CC="gcc" M=$(PWD) modules\ KBUILD_VERBOSE=$(KBUILD_VERBOSE) mv Makefile.automake Makefile CLEANFILES = $(module_DATA) .$(module_DATA).flags $(module_DATA:.o=.mod.c) $(module_DATA:.o=.@kernelext@) *~
Hier erfolgt die Substitution Makefile auf Makefile.kernel und startet das Zusammensetzen des Moduls. Ein sehr wichtiger Parameter des Zusammensetzens ist die Initialisierung der Variable KERNEL_LOCATION. Initialisiert wird sie in configure mithilfe Übertragung der Einstellungen. Oder kann die folgende Zeile:
$(MAKE) -C $(KERNEL_LOCATION) \
durch diese ersetzt werden
$(MAKE) -C /lib/modules/$(shell uname -r)/build \
Die Letzte Datei, die zu erstellen ist, ist die Datei Makefile.kernel. Sie befindet sich im Root-Verzeichnis des Moduls (im Verzeichnis module ):
# Makefile.kernel obj-m=$(module_DATA) MI_OBJS = $(module_DATA) all clean: mv Makefile.automake Makefile $(MAKE) $@
Das wäre alles.
Erstellen wir configure.in mit Hilfsmittel autoscan. Dieses Programm erstellt die Datei configure.scan, die der Prototyp von configure.in ist.
Führen wir Folgendes aus::
autoscan
Bearbeiten wir configure.scan und dann benennen wir sie in configure.in um:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([src/module_hello.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE AC_PATH_KERNEL_SOURCE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT
Makro AC_PATH_KERNEL_SOURCE fügt die Option --with-kerneldir zu configure hinzu, wo der Weg zu übergeben ist ("/lib/modules/$(shell uname-r)/build"). Wenn dieser Parameter nicht übergeben wird, wird der Weg automatisch gefunden und als Default-Wert übergeben. Diese Option ist für die Erfüllung der Cross-Compilierung notwendig.
DAS WÄRE ALLES! Jetzt führen wir Folgendes aus und Makefile ist bereit.
aclocal erstellt aclocal.m4.
autoconf dieser Utility erstellt den Skript configure laut Macros, die in der Datei `configure.in' angegeben sind.
autoheader erstellt eine Header-Datei (config.h.in).
touch NEWS README AUTHORS ChangeLog (diese Dateien werden für Automake benötigt)
automake --add-missing - dieses Programm erstellt die Dateien "Makefile.in" auf Basis von den Dateien "Makefile.am".
configure erstellt Makefile
make stellt einen Modul zusammen.