Copyright © 1995 by O'Reilly/International Thomson Verlag

Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen.

Wünschen Sie mehr Informationen zu der gedruckten Version des Buches "Linux - Wegweiser zur Installation & Konfiguration", dann klicken Sie hier.


Kapitel 4

Die ladbaren Gerätetreiber

Es hat sich eingebürgert, Gerätetreiber direkt in den Kernel einzubinden, und mehrere Gründe sprechen dafür. Erstens benötigen fast alle Treiber den speziellen Zugriff auf die Hardware, der ihnen als Bestandteil des Kernel-Codes zur Verfügung steht. Dieser Zugriff auf die Hardware ist mit einem Anwenderprogramm nicht ohne weiteres zu realisieren. Außerdem lassen sich Gerätetreiber als Teil des Kernels viel einfacher implementieren -- solche Treiber haben vollen Zugriff auf die Datenstrukturen und die anderen Routinen des Kernels, die sie jederzeit aufrufen können.

Allerdings gibt es mehrere Probleme mit einem derart zusammengesetzten Kernel, der alle Treiber enthält. Zunächst muß der Systemverwalter einen neuen Kernel erstellen, um bestimmte Gerätetreiber einzubinden oder zu entfernen -- wir haben dies im vorherigen Abschnitt besprochen. Außerdem verführt diese Vorgehensweise die Programmierer von Treibern zu nachlässiger Arbeit; nichts kann einen Programmierer davon abhalten, Code zu schreiben, der nicht streng modular aufgebaut ist -- z.B. Code, der direkt auf Daten zugreift, die zu anderen Teilen des Kernels gehören. Dieses Problem wird durch die kooperative Arbeitsweise, in der der Linux-Kernel entsteht, noch verstärkt, und nicht alle Teile des Codes sind so modular angelegt, wie sie sein sollten. Dies kann die Pflege und das Debuggen des Codes erschweren.

Um sich von dieser Vorgehensweise zu befreien, unterstützt der Linux-Kernel ladbare Gerätetreiber -- das sind Treiber, die zur Laufzeit mit bestimmten Befehlen in den Speicher geladen oder von dort entfernt werden. Solche Treiber sind immer noch ein Teil des Kernels, aber sie werden getrennt kompiliert und erst durch das Laden aktiviert. Ladbare Gerätetreiber ( Module ) werden im allgemeinen mittels einiger Befehle in den rc -Skripts, die beim Booten aufgerufen werden, in den Speicher geladen.

Module bieten eine sauber definierte Schnittstelle für das Schreiben von Treibern. Sie müssen bis zu einem gewissen Grad modular sein und bestimmte Programmierkonventionen einhalten. (Beachten Sie aber, daß ein Programmierer diese Konventionen trotzdem mißachten und nicht-modularen Code schreiben kann. Nach dem Laden kann so ein Modul denselben Schaden anrichten, als ob es direkt in den Kernel eingebunden wäre.) Die Verwendung von Modulen vereinfacht das Debuggen von Treibern -- Sie können ein Modul einfach entladen, es neu kompilieren und wieder laden, ohne daß das System neu gestartet oder der Kernel komplett neu kompiliert werden muß. Module können außer für Gerätetreiber auch für andere Teile des Kernels benutzt werden, etwa die verschiedenen Dateisysteme.

Unter Linux sind mehrere Gerätetreiber in Form von Modulen implementiert. Einer der bekanntesten davon ist der »Floppy-Streamer«-Treiber ftape , für solche Streamer, die direkt an den Floppy-Controller angeschlossen werden, wie z.B. die Modelle Colorado Memory Jumbo 120 und 250. Wenn Sie diesen Treiber in Ihrem System einsetzen möchten, müssen Sie wissen, wie Module kompiliert, geladen und wieder entladen werden. Lesen Sie zu diesem Thema auch das Ftape-HOWTO von Linux.

Sie brauchen zunächst das Paket modules , in dem die Befehle zum Laden und Entladen von Modulen enthalten sind. Auf den FTP-Servern ist das meistens die Datei modules.tar.gz in dem Verzeichnis, in dem auch die Kernel-Quellen stehen. Dieses Paket enthält die Befehle insmod , rmmod und lsmod . In den meisten Linux-Distributionen sind diese Befehle bereits vorhanden (in /sbin ); falls sie bei Ihnen schon installiert sind, brauchen Sie das modules -Paket wahrscheinlich nicht mehr. Trotzdem kann es nicht schaden, dieses Paket zu besorgen und die Befehle neu zu kompilieren, damit Sie auf jeden Fall die aktuelle Version haben.

Zum Kompilieren dieser Befehle entpacken Sie zunächst modules.tar.gz (z.B. in einem Unterverzeichnis zu /usr/src ). Befolgen Sie die mitgelieferten Installationshinweise; in der Regel brauchen Sie nur als root zuerst make und dann make install aufzurufen. Die drei Befehle werden dann in /sbin aufrufbereit installiert.

Als nächstes brauchen Sie ein Modul, mit dem Sie experimentieren können. Ein geeignetes Objekt dafür ist der Treiber für den Floppy-Streamer, den wir bereits erwähnt haben. Sie finden diesen Treiber auf den meisten FTP-Servern als ftape-version .tar.gz ; entpacken Sie diese tar-Datei und folgen Sie den Hinweisen in der README -Datei, um den Treiber zu kompilieren.

Ein Modul ist nichts weiter als eine einzige Objektdatei, die den kompletten Treibercode enthält. Das Modul ftape könnte also ftape.o heißen. Auf vielen Systemen stehen die Module im Verzeichnis /lib/modules/"vsn" , wobei "vsn" die Kernelversion ist, für die das Modul kompiliert wurde (z.B. /lib /modules/1.2.10). Vielleicht sind auf Ihrem System auch schon einige Module installiert; suchen Sie nach Dateinamen mit dem Suffix .o in /lib/modules/"vsn" .

Sobald Sie ein fertig kompiliertes Modul haben, laden Sie es mit dem Befehl:

insmod modul

wobei Modul der Name der Objektdatei des Moduls ist. Ein Beispiel:

insmod /boot/ftape.o

installiert den Treiber ftape , wenn dieser in der Datei ftape.o enthalten ist.

Wenn ein Modul installiert wird, gibt es wahrscheinlich auf der Konsole (und in die Logdateien) einige Informationen aus, die anzeigen, daß das Modul initialisiert ist. Der Treiber ftape könnte etwa folgendes ausgeben:

ftape v1.14 29/10/94 (c) 1993, 1994 Bas Laarhoven (bas@vimec.nl)
  QIC-117 driver for QIC-40 and QIC-80 tape drives
[000] kernel-interface.c (init_module) - installing QIC-117 ftape driver....
[001] kernel-interface.c (init_module) - 3 tape_buffers @ 001B8000.
[002]  calibr.c (time_inb) - inb() duration: 1436 nsec.
[003]  calibr.c (calibrate) - TC for `udelay()' = 2944 nsec (at 2049 counts).
[004]  calibr.c (calibrate) - TC for `fdc_wait()' = 2857 nsec (at 2049
counts).

Der genaue Text der Meldung hängt natürlich vom Modul ab. Es sollte immer eine ausführliche Dokumentation dazugehören, in der beschrieben wird, was das Modul tut und wie Sie es im Problemfall debuggen müssen -- zum Zeitpunkt des Schreibens sind Module noch relativ neu, und die Einzelheiten ändern sich ständig. (8)

Mit lsmod können Sie die geladenen Treiber auflisten:

rutabaga% lsmod 
Module:        #pages:
ftape             40

Auch der Speicherplatzbedarf des Moduls wird angezeigt; unter Linux ist eine Speicherseite (page) vier Kilobytes groß. Der Treiber ftape belegt also 160 KB an Speicherplatz.

Mit dem Befehl rmmod läßt sich ein Modul wieder entladen:

rmmod ftape

rmmod bekommt als Argument den Namen des Treibers mit, so wie er in der lsmod -Liste erscheint.

Sobald die Module zu Ihrer Zufriedenheit funktionieren, können Sie den entsprechenden insmod -Befehl in eines der rc -Skripts einfügen, die beim Booten ausgeführt werden. Eventuell ist in einem der Skripts auch schon eine Stelle vorgegeben, an der insmod -Befehle plaziert werden können -- das hängt von Ihrer Distribution ab.

Die Implementierung von Modulen hat sich erst in den letzten paar Monaten entwickelt (wir schreiben dies Ende 1994). Zur Zeit müssen Sie ein Modul jedesmal neu kompilieren, wenn Sie eine neue Kernel-Version oder einen höheren Patchlevel einspielen. (Wenn Sie den Kernel lediglich in derselben Version neu kompilieren, brauchen Sie das Modul nicht gleichzeitig zu aktualisieren.) Man macht das, um sicherzustellen, daß ein Modul zu der neuen Kernel-Version kompatibel bleibt. Wenn Sie versuchen, ein Modul mit einer Kernel-Version zu laden, für die es nicht kompiliert wurde, erhalten Sie eine Fehlermeldung von insmod und das Modul wird nicht geladen. Bei der Neukompilierung eines Moduls müssen Sie mit dem Kernel arbeiten, unter dem das Modul benutzt werden soll. Aktualisieren Sie deshalb bei einem Update des Systems zuerst den Kernel und starten Sie das System neu, bevor Sie die Module neu kompilieren und laden.


Fußnoten

(8)
Beachten Sie auch, daß der Treiber ftape darauf angewiesen ist, daß im Kernel die Unterstützung für QIC-117 enthalten ist; in der Regel erledigen Sie dies im Schritt make config.


Inhaltsverzeichnis Vorherige Abschnitt Nächste Abschnitt