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:


Christian Seitz und Markus Jäger
Last modified: Fri Mar 13 10:28:39 MET 1998