Common Driver Interface — Änderungen 3806 → 3862

Zeile 12: Zeile 12:
  
 
Ein Betriebssystem muss dabei nicht zwingend die Schnittstellen aller Module implementieren. Alle Treiber benutzen Funktionen aus ''core'', aber es ist ohne weiteres möglich, z.B. neben ''core'' nur die Schnittstelle für Netzwerktreiber zu implementieren.
 
Ein Betriebssystem muss dabei nicht zwingend die Schnittstellen aller Module implementieren. Alle Treiber benutzen Funktionen aus ''core'', aber es ist ohne weiteres möglich, z.B. neben ''core'' nur die Schnittstelle für Netzwerktreiber zu implementieren.
 +
 +
=== Net ===
 +
Ein Neztwerktreiber muss nur eine Funktion bereitstellen um Pakete über eine Karte zu versenden:
 +
* '''send_packet'''(device, buffer, size)
 +
Die Implementierung stellt dem Treiber eine Funktion zur Verfügung um empfangene Pakete abzuliefern.
 +
=== FS ===
 +
Das Interface für Dateisystemtreiber ist komplexer als bei den anderen Treibern. Hier müssen Funktionen für alle möglichen Dateioperationen zur Verfügung gestellt werden.
 +
 +
Um möglichst alle Dateisysteme unterstützen zu können, verfolgt CDI/FS ein etwas ungewöhnliches Konzept. Im Zentrum stehen dabei so genannte Ressourcen. Diese '''Ressourcen können''' Datei, Verzeichnis, Symlink, Spezialdatei oder alles gleichzeitig sein. Umgesetzt wird das mit den so genannten '''Klassen'''. Eine Ressource gehört zu mindestens einer Klasse (andernfalls ist sie nicht persistent). Diese Klassen beschreiben dann jeweils die verfügbaren Operationen. Es existieren momentan 4 verschiedene Klassen:
 +
* '''file''': Reguläre Datei
 +
* '''dir''': Verzeichnis
 +
* '''link''': Symbolische Verknüpfung (symlink)
 +
* '''special''': Spezialdateien
 +
 +
Ein Treiber kann jeweils mehrere Klassen des selben Typs anbieten, in denen unterschiedliche Funktionen eingetragen sind.
 +
 +
=== Storage ===
 +
Die Schnittstelle für Massenspeicher-Treiber ist äusserst einfach definiert. Der Treiber muss die folgenden Funktionen bereitstellen:
 +
* '''read_blocks'''(device, start_block, block_count, buffer)
 +
* '''write_blocks'''(device, start_block, block_count, buffer)
 +
Diese beiden Funktionen werden von der Implementierung dazu Benutzt Sektoren zu lesen oder zu schreiben. Wieviele Sektoren ein Gerät hat, und wie gross diese sind, wird in der Device-Struktur festgelegt. Die Implementierung muss garantieren, dass die Funktion nur mit, für dieses Gerät sinnvollen, Parametern aufgerufen wird.
  
 
== Aufbau eines typischen Treibers ==
 
== Aufbau eines typischen Treibers ==