Treiber

Als Treiber (Driver) wird Software bezeichnet, die die Steuerung von Hardware übernimmt, teilweise auch Software, die dazu Hilfsfunktionen anbietet (bspw. generischer TCP-Stack für beliebige Ethernet-Hardware). Treiber können, je nachdem, welche Kernelarchitektur verwendet wird, im Userspace oder Kernelspace laufen; können Teil des Kernels sein, können aber auch als Prozesse ausgeführt werden.

Eine Aufgabe eines Betriebssystems ist es, von einer hässlichen Schnittstelle auf eine schönere zu abstrahieren. Dieser Aufgabe kommen auch Treiber nach. Das Betriebssystem bietet bspw. Systemrufe an, die wiederum auf Treiber zugreifen um Aktionen auszuführen.

Zugriff auf Hardware

Der Zugriff auf Hardware kann auf zwei Arten erfolgen:

  • I/O-Befehle der Hardware (CPU)
  • Memory mapped I/O

Das hängt von der Art ab, wie die CPU Ein- und Ausgabegeräte steuert.

I/O-Befehle

Einige Prozessoren bringen spezielle Befehle mit um I/O-Geräte zu steuern. Auf diese wird hier nicht tiefer eingegangen.

Memory Mapped I/O

Einige Prozessoren binden Geräte in den Adressraum ein. Dann bedeutet der Zugriff auf eine Speicheradresse keine echte Schreibaktion im Hauptspeicher, sondern vielmehr eine Übermittlung von Daten zum / vom I/O-Gerät.

Beispielsweise könnte ein I/O-Gerät zwei 32 Bit Register haben, die an der Adresse 0x20 eingebunden sind. Liest ein Programm von dieser „Speicherstelle“, erhält das Programm die Werte, die in diesen Registern gespeichert sind zurück, schreibt es auf diese Stelle, werden Daten in die I/O-Register gelegt. Das Gerät, welches eventuell sogar völlig unabhängig von der eigentlichen CPU läuft, liest irgendwann diese Werte und führt Aktionen aus.

Zeitpunkt des Zugriffs

Es gibt verschiedene Zeitpunkte zum Steuern von Hardware. Zum einen kann ein zyklisches Polling angewandt werden, um zu sehen ob Daten bereits angekommen sind, oder es kann in der CPU ein Interrupt registriert werden, der, wenn er auftritt, den Treibercode ruft.

Polling

Polling ist die Methodik zyklisch nach Ergebnissen zu schauen, dh. in Zeitintervallen Speicherbereiche neu auszulesen und die Daten auszuwerten. Problem hierbei ist, dass mit vielen Geräten viel CPU-Zeit verbraucht wird, weil jedes Gerät einzeln abgefragt werden muss.

Interrupts

Cleverer ist es oftmals Interrupts zu registrieren, die aufgerufen werden, wenn I/O-Geräte Ergebnisse haben, bspw. wenn der Ethernet-Controller Ethernet-Frames erhalten hat. Der Treiber hat dann die Aufgabe (evtl. unter Nutzung einer DMA-Einheit (Direct Memory Access) des Computers) diese Daten aus dem Puffer der Netzwerkkarte in den Hauptspeicher (einen Puffer des Betriebssystem) zu verlegen, wo später Anwenderprogramme diese Daten auslesen können.