COBE 0.1 ALPHA

D:/COBE-Packet/cobe/system/fat.c-Dateireferenz

Diese Datei enthält den gesamten Treiber für das FAT-Dateisystem. Mehr ...

#include <fat.h>
#include <stdint.h>
#include <fdc.h>
#include <stdio.h>
#include <pic.h>
#include <pmm.h>

gehe zum Quellcode dieser Datei

Funktionen

void init_fat ()
 Diese Funktion initialisiert das FAT-Dateisystem.
void fat_show_directory ()
 Diese Funktion sorgt dafür, dass der Ordner angegebene Ordner angezeigt wird.
void fat_change_directory (char *new_dir)
 Diese Funktion ist dafür zuständig, dass in den angegebenen Ordner gewechselt wird.
void fat_mkdir (char *name)
 Diese Funktion erstellt den angegebenen Ordner.
void fat_del (char *name)
 Diese Funktion löscht einen Ordner.
void fat_change_cluster (uint16_t para_cluster, uint16_t val)
 Diese Funktion nimmt eine Änderung in der FAT vor.
void fat_copy_act_sector (void *buffer, uint16_t act_sector, bool write)
 Diese Funktion kümmert sich darum, dass Daten-Übertragungen einfacher ausgeführt werden können.
void * fat_long_name (char *name)
 Diese Funktion erstellt Verzeichniseinträge für VFAT-Namen.
uint32_t fat_get_cluster ()
 Diese Funktion fordert einen feien Cluster an.
void fat_get_boot (boot_fat_table_t *fat_table)
 Diese Funktion liest den Bootsektor nach Informationen für die FAT aus.

Variablen

boot_fat_table_ttable
 Diese Tabelle enthält für FAT interessante Informationen aus dem Bootsektor.
uint32_t sec_actdir
 Diese Variable enthält immer die aktuelle Gesamt-Sektor-Nummer.
uint8_t act_drive
 Diese Variable gibt die Nummer des aktuellen Floppy-Laufwerk an.
char curr_dir [90]
 Dieses char-Array enthält den aktuellen Verzeichnis-Pfad.
directory_tfirst_dir = NULL
 Dies ist das erste Listen-Element für die Verzeichnisliste.
directory_tcurr_dir_t = NULL
 Dieses Element kann als aktuelles Element bei der Auswertung der Verzeichnisliste genutzt werden.
uint32_t first_data
 Diese Variable enthält die Adresse des ersten Datensektors.
uint32_t start_dir_list
 Diese Variable enthält die Adresse auf den Speicherbereich für die Verzeichnisliste.
uint32_t dir_size
 Diese Variable enthält die Größe des aktuellen Verzeichnis.
uint8_t boot_run
uint8_t long_file_name_set
 Diese Variable ist eine einfache Flag-Variable, welche gesetzt wird, wenn es sich um einen langen VFAT-Dateinamen handelt.
uint8_t booted

Ausführliche Beschreibung

Diese Datei enthält den gesamten Treiber für das FAT-Dateisystem.

Definiert in Datei fat.c.


Dokumentation der Funktionen

void fat_change_cluster ( uint16_t  para_cluster,
uint16_t  val 
)

Diese Funktion nimmt eine Änderung in der FAT vor.

Soll ein bestimmter Cluster in der FAT geändert werden, so kümmert sich diese Funktion darum. Es muss als Parameter lediglich, die Nummer des zu ändernden Cluster angegeben werden und dessen Wunschwert. Diese Funktion geht nun die Cluster in der FAT solange durch, bis diese bei der gewünschten Cluster-Nummer ist und ersetzt dessen Wert durch den gewünschten Wert.

Parameter:
para_clusterDieser Parameter übernimmt die Nummer des zu ändernden Clusters#
valDieser Parameter enthält den Wert, welcher der Cluster danach haben soll

Definiert in Zeile 309 der Datei fat.c.

void fat_change_directory ( char *  new_dir)

Diese Funktion ist dafür zuständig, dass in den angegebenen Ordner gewechselt wird.

Die Durchführung ist einfach: Die von fat_show_directory erstellte Ordner-Liste wird solange durchgeprüft, bis der angeforderte Name dort gefunden wurde. Dann wird der Pfad um den Namen und einem Slash erweitert und die aktuelle Gesamt-Sektor-Nummer auf den zu wechselnden Ordner gesetzt.

Parameter:
new_dirDieser Parameter enthält den Namen des Ordners, in dem gewechselt werden soll

Definiert in Zeile 161 der Datei fat.c.

void fat_copy_act_sector ( void *  buffer,
uint16_t  act_sector,
bool  write 
)

Diese Funktion kümmert sich darum, dass Daten-Übertragungen einfacher ausgeführt werden können.

Dabei muss lediglich die Adresse auf den Datenpuffer, der Sektor und die Art der Übertragung übergeben werden. Um die Berechnung des Head, Cylinder und des eigentlichen Sektors kümmert sich diese Funktion, ebenfalls nimmt diese gleich die Daten-Übertragung vor.

Parameter:
bufferDieser Parameter enthält die Adresse auf den Datenpuffer
act_sectorDieser Parameter enthält den Wert des zu übertragenden Sektors (Gesamtsektor)
writeDieser Parameter bestimmt, ob es sich um ein Lese- oder um ein Schreib-Vorgang handelt (true für schreiben)

Definiert in Zeile 357 der Datei fat.c.

void fat_del ( char *  name)

Diese Funktion löscht einen Ordner.

Dabei wird zuerst das aktuelle Verzeichnis nach einem Verzeichnis-Eintrag mit dem angegebenen Namen durchsucht. Wenn ein solches gefunden wurde, wird das erste Zeichen des Eintrages auf 0xE5 gesetzt, was bedeutet, dass dieser Eintrag gelöscht ist und überschrieben werden darf. Danach wird in der FAT der/die reservierte/n Sektor/en wieder auf 0x000 gesetzt und somit wieder zu freien Verwendung freigegben.

Parameter:
nameDieser Parameter enthält den Namen des zu löschenden Verzeichnisses

Definiert in Zeile 267 der Datei fat.c.

void fat_get_boot ( boot_fat_table_t fat_table)

Diese Funktion liest den Bootsektor nach Informationen für die FAT aus.

Der Bootsektor enthält einige relevante Informationen für den Aufbau des Dateisystems. Diese Funktion kümmert sich darum, dass diese Informationen aus dem Bootsektor ausgelesen werden und in die dafür vorgesehene table eingetragen werden. Die Prozedur ist dabei sehr einfach, es wird der Bootsektor ausgelesen und danach nach und nach der Wert in umgekehrter Endian-Richtung in die table geschrieben.

Parameter:
fat_tableDieser Parameter ist ein Zeiger auf die globale Tabelle table, in dem die Bootinformationen für die FAT gespeichert werden

Definiert in Zeile 433 der Datei fat.c.

uint32_t fat_get_cluster ( )

Diese Funktion fordert einen feien Cluster an.

Wird beim anlegen eines Ordners oder einer Datei ein freier Cluster benötigt, so fordert durchsucht diese Funktion die FAT nach einem Cluster, welcher den Wert 0x000 (frei) hat, ändert den Wert auf belegt und liefert die Nummer des Clusters zurück. Wird kein freier Cluster mehr gefunden, wird 0xFFFFFFFF zurückgeliefert, was bedeutet, dass kein Speicherplatz mehr vorhanden ist.

Rückgabe:
Der Rückgabewert entspricht der Nummer ersten gefundenen Clusters, welcher frei war

Definiert in Zeile 387 der Datei fat.c.

void* fat_long_name ( char *  name)

Diese Funktion erstellt Verzeichniseinträge für VFAT-Namen.

Ist ein Dateiname beim anlegen einer Datei oder eines Ordners länger als acht Zeichen, so müssen VFAT-Namen verwendet werden. Diese Funktion erstellt diese VFAT-Einträge für längere Dateinamen an der richtigen Stelle und gibt die Adresse auf den ersten Eintrag zurück.

Parameter:
nameDieser Parameter enthält den langen Dateinamen
Rückgabe:
Der Rückgabewert ist die Adresse auf den ersten VFAT-Eintrag des langen Dateinamens

Definiert in Zeile 374 der Datei fat.c.

void fat_mkdir ( char *  name)

Diese Funktion erstellt den angegebenen Ordner.

Das Verfahren legt sich folgendermaßen dar: Zunächst werden Variablen für ein auszulesenden Sektor, einen leeren Sektor-Eintrag und einem Verzeichnis-Eintrag angelegt. Hauptsächlich gearbeitet wird dabei mit dem Verzeichnis-Eintrag, welcher den Namen entry trägt. Zunächst wird dieser komplett mit Nullen belegt, um möglichen Datenmüll zu vermeiden. Nun wird der Name kopiert, wobei überprüft wird, ob der Verzeichnis-Name länger oder kürzer als acht Zeichen ist. Gleichzeitig werden auch die ungültigen Zeichen durch Leerzeichen ersetzt. Sollte der Verzeichnis-Name länger als acht Zeichen sein, so wird eine Funktion gestartet, welche sich um das Anlegen der VFAT-Einträge kümmert. Danach wird im Verzeichnis-Eintrag mit 0x10 festgelegt, dass es sich um einen Ordner handelt. Nachfolgend wird ein freier Cluster in der FAT gesucht und in den Eintrag geschrieben. Nun wird der Eintrag in das aktuelle Verzeichnis geschrieben und die FATs werden ebenfalls aktualisiert. Als letzten Schritt mit nur noch der Inhalt des neuen Verzeichnisses geleert werden und zwei Einträge für den aktuellen Ordner und den übergeordneten Ordner erstellt werden.

Parameter:
nameDieser Parameter enthält den Namen des zu erstellenden Verzeichnisses

Definiert in Zeile 190 der Datei fat.c.

void fat_show_directory ( )

Diese Funktion sorgt dafür, dass der Ordner angegebene Ordner angezeigt wird.

Zunächst wird der aktuelle Ordner nach Verzeichnis-Einträgen für Ordner durchsucht. Dabei wird eine Liste mit dem Namen des Ordners und dessen Cluster erstellt. Diese Liste ist global verfügbar, Dateien werden nicht in die Liste mit aufgenommen. Wärend des Suchvorgangs kann die Funktion zwischen langen VFAT Dateinamen und normalen 8-Zeichen-Dateinamen unterscheiden. Während des Erstellens der Liste, wird egal ob Ordner oder Datei, der Eintrag auf dem Bildschirm ausgegeben, so dass es auch, wenn es ein Fehler während der Verarbeitung gibt, zumindest ein Teil angezeigt werden kann. Diese Funktion hat weder Parameter noch Rückgabewerte. Das aktuelle Verzeichnis wird durch die aktuelle Gesamt-Sektor-Nummer angegeben.

Diese Variable enthält den Dateinamen, auch 8-Zeichen Namen werden in diese Variable kopiert

Definiert in Zeile 66 der Datei fat.c.

void init_fat ( )

Diese Funktion initialisiert das FAT-Dateisystem.

Dabei wird zunächst table mit den Bootinformationen für FAT gefüllt. Danach wird der aktuelle Sektor und der erste Datensektor berechnet. Nun folgen verschiedene Initialisierungen, wie ein Slash als Startzustand für den Pfad oder einen 4KByte Bereich für die Ordner-Liste zu allozieren. Ebenfalls werden weitere kleinere Initialisierungen von Variablen vorgenommen. Aufgerufen wird diese Funktion in cobekrnl.c

Definiert in Zeile 43 der Datei fat.c.


Variablen-Dokumentation

Diese Variable gibt die Nummer des aktuellen Floppy-Laufwerk an.

Definiert in Zeile 18 der Datei fat.c.

Definiert in Zeile 31 der Datei fat.c.

Definiert in Zeile 32 der Datei cobekrnl.c.

char curr_dir[90]

Dieses char-Array enthält den aktuellen Verzeichnis-Pfad.

Definiert in Zeile 20 der Datei fat.c.

Dieses Element kann als aktuelles Element bei der Auswertung der Verzeichnisliste genutzt werden.

Definiert in Zeile 24 der Datei fat.c.

Diese Variable enthält die Größe des aktuellen Verzeichnis.

Definiert in Zeile 30 der Datei fat.c.

Diese Variable enthält die Adresse des ersten Datensektors.

Definiert in Zeile 26 der Datei fat.c.

Dies ist das erste Listen-Element für die Verzeichnisliste.

Definiert in Zeile 22 der Datei fat.c.

Diese Variable ist eine einfache Flag-Variable, welche gesetzt wird, wenn es sich um einen langen VFAT-Dateinamen handelt.

Definiert in Zeile 33 der Datei fat.c.

Diese Variable enthält immer die aktuelle Gesamt-Sektor-Nummer.

Definiert in Zeile 16 der Datei fat.c.

Diese Variable enthält die Adresse auf den Speicherbereich für die Verzeichnisliste.

Definiert in Zeile 28 der Datei fat.c.

Diese Tabelle enthält für FAT interessante Informationen aus dem Bootsektor.

Definiert in Zeile 14 der Datei fat.c.

 Alle Datenstrukturen Dateien Funktionen Variablen Typdefinitionen Makrodefinitionen