COBE 0.1 ALPHA
|
Diese Datei enthält die Prototypen für das FAT-Dateisystem, sowie Strukturen dafür. Mehr ...
#include <stdint.h>
gehe zum Quellcode dieser Datei
Datenstrukturen | |
struct | boot_fat_table |
Diese Struktur bezeichnet die Informationen über die FAT aus dem Bootsektor. Mehr ... | |
struct | directory |
Diese Struktur stellt Informationen zu einem Verzeichnis bereit. Es handelt sich um eine Listen-Struktur. Mehr ... | |
Makrodefinitionen | |
#define | NULL (void*) 0 |
Typdefinitionen | |
typedef struct boot_fat_table | boot_fat_table_t |
Diese Struktur bezeichnet die Informationen über die FAT aus dem Bootsektor. | |
typedef struct directory | directory_t |
Diese Struktur stellt Informationen zu einem Verzeichnis bereit. Es handelt sich um eine Listen-Struktur. | |
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 *) |
Diese Funktion ist dafür zuständig, dass in den angegebenen Ordner gewechselt wird. | |
void | fat_mkdir (char *) |
Diese Funktion erstellt den angegebenen Ordner. | |
void | fat_del (char *) |
Diese Funktion löscht einen Ordner. | |
uint32_t | fat_get_cluster () |
Diese Funktion fordert einen feien Cluster an. | |
void * | fat_long_name (char *) |
Diese Funktion erstellt Verzeichniseinträge für VFAT-Namen. | |
void | fat_copy_act_sector (void *, uint16_t, bool) |
Diese Funktion kümmert sich darum, dass Daten-Übertragungen einfacher ausgeführt werden können. | |
void | fat_get_boot (boot_fat_table_t *) |
Diese Funktion liest den Bootsektor nach Informationen für die FAT aus. | |
void | fat_change_cluster (uint16_t, uint16_t) |
Diese Funktion nimmt eine Änderung in der FAT vor. |
Diese Datei enthält die Prototypen für das FAT-Dateisystem, sowie Strukturen dafür.
Definiert in Datei fat.h.
typedef struct boot_fat_table boot_fat_table_t |
Diese Struktur bezeichnet die Informationen über die FAT aus dem Bootsektor.
typedef struct directory directory_t |
Diese Struktur stellt Informationen zu einem Verzeichnis bereit. Es handelt sich um eine Listen-Struktur.
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.
para_cluster | Dieser Parameter übernimmt die Nummer des zu ändernden Clusters# |
val | Dieser Parameter enthält den Wert, welcher der Cluster danach haben soll |
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.
new_dir | Dieser Parameter enthält den Namen des Ordners, in dem gewechselt werden soll |
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.
buffer | Dieser Parameter enthält die Adresse auf den Datenpuffer |
act_sector | Dieser Parameter enthält den Wert des zu übertragenden Sektors (Gesamtsektor) |
write | Dieser Parameter bestimmt, ob es sich um ein Lese- oder um ein Schreib-Vorgang handelt (true für schreiben) |
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.
name | Dieser Parameter enthält den Namen des zu löschenden Verzeichnisses |
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.
fat_table | Dieser Parameter ist ein Zeiger auf die globale Tabelle table, in dem die Bootinformationen für die FAT gespeichert werden |
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.
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.
name | Dieser Parameter enthält den langen Dateinamen |
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.
name | Dieser Parameter enthält den Namen des zu erstellenden Verzeichnisses |
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
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