AUDIO FILESYSTEM
von
Markus Jäger und Christian Seitz
Aufgabenstellung:
Im Rahmen einer Projektarbeit wurde die Aufgabe gestellt, ein Filesystem für Audio-CD's zu enwickeln,
wobei dies als ladbares Modul zu realisiern war. Die Musik-Tracks sollten nach dem Mounten
wie reguläre Dateien behandelt werden können und direkt abspielbar sein.
Probleme:
Am Anfang stand die Einarbeitung in ziemlich wirre Kernstrukturen und -funktionen im Vordergrund.
Dies lag vor allem daran, daß die für unser Projekt nötigen Informationen nicht explizit zur Verfügung
standen und das Lesen von anderen Kernel-Quellen sehr viel Zeit in Anspruch nimmt.
Ist diese Hürde überwunden, steht erst einmal die v-node im Mittelpunkt. In Unix hat jedes offene File
eine v-node. In der v-node Struktur ist u. a. ein Bereich für private Daten enthalten, hier wird
bei uns der Name und Größe gespeichert, außerdem ist hier auch noch ein Verweis auf die Operationen
(open, read, lookup u.v.a.m.) die mit solch einem v-node durchgeführt werden können.
Vorgehensweise:
Mount:
In der Mount Funktion muß zuerst der Typ des CD-Rom Laufwerks erkannt werden,
damit der erste Zugriff erfolgen kann.
Danach kann die Table of Contents (TOC) gelesen werden. In dieser Tabelle sind die Anfangsadressen jedes
Tracks verzeichnet. Diese Daten werden in einem Vektor gespeichert, da sie später für die Lokation und
Grössenbestimmung eines Files benötigt werden.
Lookup:
Die Umsetzung von Filenamen auf v-nodes geschieht in der lookup Funktion. Unsere v-nodes werden in einer
verketteten Liste verwaltet. Ist ein Filename schon in unserer Liste, so wird die darin enthalten v-node
zurückgeliefert ansonsten wird eine neue erzeugt und in der Liste verankert.
Read:
Damit auch ein Benutzerprozeß mit dem Filesystem operieren kann, ist dieses Kommando wesentlich.
Hier wurde ein Read-Ahead-Buffer implementiert. Der Buffer wird beim open-Aufruf mit dem Header des
.au - Audioformats initialisiert. Im Read wird nun solange von der CD gelesen bis im Puffer ein
ausreichender Vorrat an Daten vorhanden ist.
Ein Sonderfall bei Read ist noch zu beachten. Wenn zwischen zwei Read Aufrufen ein Seek durchgeführt
wurde, sind die Daten im Puffer nicht mehr konsistent. Deswegen wird in diesem Fall der komplette
Puffer gelöscht und ab der neuen Position neu erzeugt.
Sonstiges:
Wurde ein Block von der CD in den Puffer gelesen, so kann es vorkommen, daß das Aufsetzen des
Laufwerks nicht exakt mit dem Ende des Puffers übereinstimmt. Abhilfe schafft hier ein Vergleich
der letzten Daten im Puffer mit den neuen gelesenen Daten. Dieses Verfahren war bei uns nicht
nötig, da neuere CD-ROM Laufwerke dieses Automatisieren.
Besonderes Feature: Erkennung der Tracknamen
Damit mit ls nicht nur nichtssagende Tracknamen erscheinen, wird im User-Level Mount Kommando
ein neuer Prozeß erzeugt. Dieser erfragt die Titelnamen über eine CDDB-Anfrage bei einem entsprechenden
Server im Internet. Dort werden anhand der UPC und anderer Angaben die CD-Daten gesucht und zurückgeschickt.
Der Datenaustausch zwischen dem User-Level Mount Kommando und dem Kern wird über sog. IO-Control
Operationen auf die Root-v-node abgewickelt.
Erweiterungsmöglichkeiten:
- Verbessern der Pufferstrategie und eingliedern dieser in das Virtual Memory Management
- Erkennung anderer Audioformate .wav etc....
- Lesen von Video CD's
- Track über NFS lesen
- ......
- ...
Christian Seitz
und
Markus Jäger
Last modified: Fri Mar 13 10:28:39 MET 1998