Next: Quellcode eines Gerätetreibers
Up: Linux Gerätetreiber
Previous: Hardwarezugriff
# Makefile for Linux kernel module driver
# major device number
# this must be unused in the linux kernel!
MAJOR := 63
CC := gcc -Wall -fomit-frame-pointer -fno-strength-reduce -pipe
# if you have enabled CONFIG_MODVERSION when compiling the kernel
# you must add -DMODVERSIONS after -DMODULE!
MFLAGS := -D__KERNEL__\
-DMODULE -DMODVERSIONS\
-D__NO_VERSION__\
-DBSP_MAJOR=$(MAJOR)\
CFLAGS := -O2
joystick.o: joystick.c
$(CC) -o joystick.o $(CFLAGS) $(MFLAGS) -c joystick.c
clean:
rm -f *.o
device:
rm -r /dev/joystick; true
mknod -m 777 /dev/joystick c $(MAJOR) 0
load:
/sbin/insmod joystick
unload:
/sbin/rmmod joystick
Mit diesem Makefile läßt sich ein allgemeiner Gerätetreiber, der
ein bestimmtes Device steuert, erstellen. Zum Compilieren des
Gerätetreibers reicht ein Aufruf von make aus. Zusätzlich
werden Regeln definiert,
um den Gerätetreiber zu laden (make load), wieder zu entfernen
(make unload) und das Device anzulegen (make device).
Erläuterung der einzelnen Compileroptionen:
- -O2 -fomit-frame-pointer
- schaltet den Optimierer des
Compilers an.
- -Wall
- schaltet alle Warnmeldungen des Compilers an. Dies ist
nützlich, um Programmfehler leichter zu finden.
- -pipe
- dient zur Beschleunigung des Compilerlaufs.
- -fno-strength-reduce
- verhindert etwaigen fehlerhaften Code bei
eingeschalteter Optimierung wegen eines Bugs im gcc Compiler
(mindestens bis Version 2.7.2).
- -D__KERNEL__
- ist nötig, um auf interne
Kerneldefinitionen in den Headerdateien zugreifen zu können.
- -DMODULE -DMODVERSIONS
- definiert die Flags für
Module. Dadurch wird dem Modul der Zugriff auf Funktionen des laufenden
Kernels ermöglicht. Die Option MODVERSIONS muß immer dann
angeben werden, wenn der Kernel mit eingeschalteter Option
CONFIG_MODVERSIONS übersetzt wurde.
- -D__NO_VERSION__
- ist aus
Kompatibilitätsgründen nötig. In neueren Kernelversionen wird
die Variable kernel_version in den Headerdateien definiert,
falls diese Option nicht angegeben wird. Die Variable wird beim
Übersetzen mit der augenblicklichen Kernelversion initialisiert.
Sie wird von dem Modutils-Paket benötigt, um
sicherzustellen, daß der Kernel, in dem das Modul eingebunden
werden soll, dem entspricht, mit dem das Modul übersetzt
wurde. Die internen Kernelstrukturen unterscheiden sich nämlich
bei verschiedenen Kernelversionen.
Da der Treiber aber auch
mit älteren Kerneln laufen soll, wird kernel_version in der
Quelldatei definiert und mit __NO_VERSION__ sichergestellt,
daß die Variable bei neueren Kerneln nicht doppelt definiert
wird.
Marius Heuler
Tue Jan 7 12:11:50 MET 1997