Forum: Mikrocontroller und Digitale Elektronik Wie geht ein Disk-Controller beim ersetzen von Dateien vor?


von Matze (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von bingo (Gast)


Lesenswert?

> 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.

von Sebastian Hepp (Gast)


Lesenswert?

>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. =)

von Reinhard Kern (Gast)


Lesenswert?

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

von Mathias A. (mrdelphi)


Lesenswert?

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..

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.