Einführung


... [ Seminar Linux und Apache ] ... [ Thema Gerätetreiber unter Linux 2.4 ] ... [ Grundlagen ] ...

Übersicht: Einführung


'Vorwort'

Gerätetreiber für Linux vorzustellen ist mit Sicherheit eine einfachere Aufgabe, als dies für andere Betriebssysteme zu tun. Sie sind einfacher und schneller realisierbar. Eine umfassende, alles abdeckende Ausarbeitung ist allerdings kaum machbar, da das Thema sehr komplex ist.
Diese Seminarausarbeitung konzentriert sich auf die Grundkonzepte, die z.T. mit Code-Beispielen erläutert werden. Wer sich für die Details interessiert, sei auf die bekanntermassen offengelegten Sourcen verwiesen.
Grundkenntnisse über das Betriebssystem Linux werden vorausgesetzt.


Gerätetreiber allgemein

Linux läuft auf nahezu jeder Hardware. Das hat seinen Grund in der guten Skalierbarkeit des Betriebssystems, den Konzepten von Unix und natürlich in der Offenlegung der Quellen. Einfache Systemstrukturen erleichtern die Portierung und die Anbindung zusätzlicher Hardware.
Doch ohne Treiber funktioniert kein Betriebssystem. Für jedes Stück Hardware muß irgendwann irgendwer einen Treiber geschrieben haben.

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.

Treiberanteil am Codeumfang [2]

treiberanteil.gif nicht                 gefunden

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.


Treiberklassen

Gerätetreiber differenziert man abhängig von der Zugriffsart durch die Applikationen und der Geräteart. Jede der so entstehenden Klassen stellt eigene Schnittstellenfunktionen im Kernel zur Verfügung, um Treiber optimal einbinden zu können.
Diese Einteilung ist nicht als absolut zu betrachten. Jeder Programmierer kann alle seine Treiber in ein grosses Modul packen, aber aus Gründen der Erweiterbarkeit und Übersichtlichkeit sollte jede neue Funktionalität ein eigenes Modul erhalten.
Die drei Hauptklassen sind die folgenden:

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.


Sicherheitsaspekte

Jedes Objekt des Betriebssystems hat einen Benutzer oder gehört einer Gruppe an. Diese werden über eine ID, die User-ID oder Group-ID, gekennzeichnet. Als Objekte werden Dateien (passive Objekte) und Prozesse (aktive Objekte) bezeichnet.
Dateien besitzen zusätzlich Zugriffsrechte, die vom Systemkern auf Übereinstimmung mit der ID geprüft werden, wenn ein Prozess auf die Datei zugreifen möchte.
Einige besondere Prozesse werden aus Sicherheitsgründen nur dem Superuser gestattet. Das betrifft zum Teil auch Hardwarezugriffe, sodass darauf ein besonderes Augenmerk gelegt werden sollte. Der Kernel prüft zwar die Zugriffsrechte, doch kann es durchaus notwendig sein, innerhalb des Treibers weitergehende Sicherheitsprüfungen durchzuführen.

Die bei der Programmierung zu beachtenden Aspekte sollen hier nicht weiter angesprochen werden.


... [ Seminar Linux und Apache] ... [ Thema Gerätetreiber unter Linux 2.4] ... [ nach oben ] ... [ Grundlagen ] ...