Ein Gerätetreiber ist eigentlich nichts anderes als eine Sammlung von Funktionen, die den Zugriff auf ein Peripheriegerät über ein einheitliches Applikations-Interface ermöglichen. Das Interface ist dabei durch das Betriebssystem vorgegeben.
Im Linux-Kernel haben Treiber eine besondere Rolle: sie sind "black boxes", die dafür sorgen,
daß eine bestimmte Hardware auf ein wohldefiniertes Interface reagiert. Wie die Hardware im Detail arbeitet, bleibt dabei vollkommen verborgen.
Um Benutzeraktivititäten auszuführen, gibt es standardisierte Aufrufe (open, close, read, write, ioctl, select/poll, fcntl, lseek), die unabhängig vom jeweiligen Treiber sind. Für den Programmierer ist das von Vorteil, da er nicht ständig neue Funktionen für jedes neue Gerät erlernen und verwenden muß.
Die Aufgabe des Treibers ist es nun, diese Aufrufe auf die gerätespezifischen Operationen zu mappen.
Das Interface ist so definiert, dass Treiber unabhängig vom Rest des Kernels gebaut werden können.
Bei Bedarf werden sie zur Laufzeit 'eingefügt'.
Durch diese Modularität ist es relativ einfach, Gerätetreiber für Linux zu schreiben.
Noch wichtiger als ein einheitliches Interface ist es, Peripheriegeräte systemkonform zu integrieren. Ein Gerät muß immer in einen sicheren Zustand gebracht werden, wenn es nicht benutzt wird, oder wenn eine Applikation aufgrund eines Fehlers abgebrochen wird.
Mit dem neuen Kernel gibt es etliche neue Treiber für Sound-, Netz-, Video- und ISDN-Karten, SCSI-Controller, USB-Geräte und sogar einige Winmodems.
Wer selber Treiber entwickeln möchte, benötigt keine zusätzlichen Werkzeuge. Ein Editor und ein Compiler, z.B. gcc (Optimierung -O nicht vergessen, um den Assemblercode aus den Headerfiles richtig zu übernehmen), sind ausreichend. Zusätzlich sind make und eine Versionsverwaltung unerläßliche Hilfsmittel bei der Treiberentwicklung.
Wer lieber eine integrierte Entwicklungsumgebung verwendet, dem wird kdevelop weiterhelfen.
Dazu kommen weitere Treiber, die später kurz angesprochen werden. Diese Treibervielfalt ist zum einen durch Standards im Bereich der Geräteankopplung, wie beispielsweise USB, PCI oder IRda, bedingt, aber auch die zunehmende gemeinsame Nutzung einer nur einmal vorhandenen Ressource, wie beispielsweise dem Parallelport, spielt eine Rolle.
Das ist auch ein Grund, warum Treiber zunehmend als stacked drivers realisiert werden.
Auf normalerweise drei Hierarchie-Ebenen werden die Aufgaben eines Treibers verteilt.
Ein Lowlevel-Treiber greift tatsächlich auf die Hardware zu. Auf der obersten Ebene steht ein Highlevel-Treiber, der durch die Applikation angesprochen wird. Dazwischen ist ein Core-Treiber geschaltet, der für die Highlevel-Treiber einheitliche Zugriffsfunktionen und für die Lowlevel-Treiber eine systemkonforme Schnittstelle zur Verfügung stellt. Die Module werden nacheinander in den Kernel geladen.
Das kann für USB zum Beispiel ein Treiber für eine Webcam sein (Highlevel), der auf dem low level sozusagen als Gegenstück einen Treiber für den USB-Controller hat.