next up previous contents
Next: Quellcode eines Gerätetreibers Up: Linux Gerätetreiber Previous: Hardwarezugriff

Makefile eines Gerätetreibers

# 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