COBE 0.1 ALPHA
|
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_t * | table |
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_t * | first_dir = NULL |
Dies ist das erste Listen-Element für die Verzeichnisliste. | |
directory_t * | curr_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 |
Diese Datei enthält den gesamten Treiber für das FAT-Dateisystem.
Definiert in Datei fat.c.
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
Definiert in Zeile 32 der Datei cobekrnl.c.
char curr_dir[90] |
directory_t* curr_dir_t = NULL |
directory_t* first_dir = NULL |