Hallo,
ich versuche gerade ein virtuelles FAT12 Dateisystem auf einem PIC
Controller zu schreiben, die Verbindung zum PC besteht per USB.
(Zunächst mal kurz zum Verständnis was zum Hintergrund meiner Frage)
Virtuell deshalb, weil ich dieses Dateisystem quasi als Bootloader für 3
weitere angeschlossene Bausteine verwenden möchte, so dass ich durch den
PIC die anderen beim Übertragen der Datei flashen kann und ebenso
auslesen kann.
Das Dateisystem arbeitet soweit schon einwandfrei, nur ist mir noch
unklar wie Windows nun vorgeht wenn ich eine Datei ersetzen möchte?
Durch den oben beschriebenen Anwendungsfall arbeite ich mit einer fest
einprogrammierten FAT-Tabelle, die einzelnen Firmware-Files sind immer
gleich groß.
Wie geht nun beispielsweise Windows vor, wenn ich versuche eine
gleichnamige Datei zu ersetzen und diese dieselbe Dateigröße aufweist?
(Hier fragt mich ja Windows "Möchten Sie diese Datei ersetzen")
Werden dann exakt dieselben Sektoren benutzt und einfach überschrieben?
Oder wird eine komplett neue Datei auf freien Sektoren angelegt und die
alte anschließend gelöscht?
Und noch eine kleine Zusatzfrage: woran ermittelt das Betriebssystem den
noch freien Speicherplatz? Die Dateigrößeninformationen zieht es dazu
jedenfalls nicht heran, wie ich feststellen musste.
Grüße
Matze
Matze schrieb:> Und noch eine kleine Zusatzfrage: woran ermittelt das Betriebssystem den> noch freien Speicherplatz?
ich denke mal einfach die Anzahl der freien FAT-Einträge
> Oder wird eine komplett neue Datei auf freien Sektoren angelegt und die> alte anschließend gelöscht?
wird immer so gemacht, unabhängig davon, wie die neue Dateigrösse ist.
Es gibt ja Situationen, wo Windows nicht weiss, wie gross die Datei am
Ende werden wird.
>Werden dann exakt dieselben Sektoren benutzt und einfach überschrieben?>Oder wird eine komplett neue Datei auf freien Sektoren angelegt und die>alte anschließend gelöscht?
Das ist völlig egal, wenn die Dateien gleich groß sind. Normalerweise
wird es letztere Methode benutzen, da die Dateien nicht immer gleich
groß sind. Aber wenn der Speicherplatz voll ist, dann könnte es auch
nach ersterem Vorgehen vorgehen. =)
Matze schrieb:> Werden dann exakt dieselben Sektoren benutzt und einfach überschrieben?> Oder wird eine komplett neue Datei auf freien Sektoren angelegt und die> alte anschließend gelöscht?
Hallo Matze,
das erstere ist aus verschiedenen Gründen unerwünscht - z.B. könnte man
dann gelöschte Dateien fast nie wiederherstellen. Windows verwendet
meines Wissens erst dann gelöschte Sektoren wieder, wenn keine leeren
oder schon früher gelöschten mehr zu finden sind. Ich weiss allerdings
nicht, ob das irgendwo spezifiziert und garantiert ist.
Eine Folge ist so oder so, dass du damit rechnen musst, dass eine neue
Datei nicht mehr "am Stück" geschrieben wird, sondern in mehrere Lücken.
Das ist dann die berüchtigte Fragmentierung.
Gruss Reinhard
Matze schrieb:> Und noch eine kleine Zusatzfrage: woran ermittelt das Betriebssystem den> noch freien Speicherplatz? Die Dateigrößeninformationen zieht es dazu> jedenfalls nicht heran, wie ich feststellen musste.
bei FAT12/16 werden einfach die unbelegten FAT-Einträge gezählt; FAT32
speichert die Zahl der freien Blöcke zusätzlich im Bootsektor (oder so,
weiß nicht mehr genau wo das war) ab sodass nicht jedes Mal durchgezählt
werden muss. Die Dateigrößen kann man nicht nehmen weil dort die exakte
Größe in Bytes drinsteht. Ok, man könnte sie vor dem Addieren auf die
Clustergröße aufrunden. Wäre aber trotzdem umständlicher, denn man
müsste ja den ganzen Verzeichnisbaum durchsuchen.
Reinhard Kern schrieb:> Windows verwendet> meines Wissens erst dann gelöschte Sektoren wieder, wenn keine leeren> oder schon früher gelöschten mehr zu finden sind.
in der FAT wird meines Wissens doch gar nicht zwischen leeren und
gelöschten Sektoren unterschieden? wobei ich mich gerade frage wie
undelete denn dann überhaupt funktioniert...?
@Matze: wenn die Dateien immer gleich groß sind, reicht es vielleicht,
das Volume gerade so groß zu machen dass alles darauf passt um Windows
dazu zu bringen immer wieder die gleichen Sektoren zu verwenden.
Definiert ist das aber meines Wissens nicht, also müsste man im Grunde
alle Betriebssysteme durchtesten mit denen das Gerät bedient werden
soll..
Mathias A. schrieb:> in der FAT wird meines Wissens doch gar nicht zwischen leeren und> gelöschten Sektoren unterschieden? wobei ich mich gerade frage wie> undelete denn dann überhaupt funktioniert...?
Undelete funktioniert nur, wenn nach dem versehendlichen Löschen keine
weiteren Daten geschrieben wurden. Falls doch, ist ein Glücksspiel.
Beim Löschen einer Datei wird nur das erste Zeichen des Dateinamens mit
0xE5 überschrieben. Der Rest des Dateinamen und die FAT-Kette selber
bleibt bestehen.
FAT12 unterscheidet zwischen folgenden Clustertypen:
- frei
- defekt
- belegt (Verweis auf Folgeeintrag)
- Dateiende (es gibt keinen Folgeeintrag)
Dabei können die als belegt markierten Cluster ohne weiteres zu einer
gelöschten Datei gehören. Anhand der Clustertypen kann man also nicht
sagen, ob sie wirklich belegt oder schon wieder frei sind.
Beim Schreiben hat man nun zwei Möglichkeiten:
1. Die als frei markierten Cluster verwenden
2. Den ersten gelöschten Verzeichniseintrag nehmen und die
dort verwendeten Cluster verwerten. Ist die neue Datei kürzer, werden
alle noch übrigen Cluster als frei markiert.
Was zuerst gemacht wird, weiß ich jetzt nicht. Es kommt vielleicht auch
auf die Implementation drauf an.
Zum Berechnen des freien Speichers ist es am einfachsten, die Cluster
der ungelöschten Verzeichniseinträge durchzuzählen und deren Zahl von
der
Gesamtzahl abzuziehen.