Forum: PC Hard- und Software FAT: Speichergröße


von Johannes (Gast)


Lesenswert?

Hallo,

fang gerade an mich mit FAT auseinander zusetzen. Eine Frage hab ich 
diesbezüglich bereits; wird in der FAT selbst auch hinterlegt wie groß 
z.B. der USB-Stick (Speicherkapazität) ist?

Gruß
Johannes

: Verschoben durch User
von hdd (Gast)


Lesenswert?

In der Partitionstabelle steht am Offset 0xC ein 4 Byte Eintrag, der die 
Gesamtzahl der Sektoren der jeweiligen Partition angibt und dort, wo die 
Partition anfängt gibt es bei Offset 0xB (bei FAT16/32) einen 2 Byte 
Eintrag, wieviele Byte ein Sektor jeweils hat. Daraus kannst du dann die 
Größe der Partition berechnen.

von Johannes (Gast)


Lesenswert?

vielen Dank für die Information!

von Johannes (Gast)


Lesenswert?

kann mir jmd von euch noch den Begriff Cluster etwas anschaulicher 
definieren? Irgendwie fehlt mir hier noch der Zugang.

von Bernhard B. (schluchti)


Lesenswert?

Was genau ist dir nicht klar?

Ein Cluster besteht aus mehreren Sektoren. Wieviele Sektoren das sind, 
steht im Bootsektor.

Wenn du etwas genauer schreibst was dir an dem Begriff nicht klar ist, 
dann kann man dir sicherlich helfen.

von Johannes (Gast)


Lesenswert?

habs jetzt verstanden - es sind einfach ziemlich viele Begriffe zu 
Beginn dieses Thema, Cluster, Spur, Sektor...

Hab mir jetzt ein Beispiel FAT12 angeschaut, welches leider die ganzen 
Einträge nur per Hexwert dargestellt hat und keine weiteren 
Informationen vorhanden sind:

Den Bootsektor hab ich verstanden (bzw. die Werte konnte ich alle 
entschlüsseln) -> danach (nach dem ersten Cluster 512Bytes mit dem 
abschließenden 0xaa55 kommt allerdings folgende Zeile
1
0xF8,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F
Und dann lauter 0x00 und das zwei ganze 512Byte Cluster lang. Für diese 
Zeile find ich leider keine weiteren Informationen bei wikipedia und co.

Anschließend kommt wieder ein Cluster, in dem Sachen drinnen stehen 
(vielleicht der second Bootloader) und im darauf folgenden fängt dann 
der Inhalt einer Textdatei an.

Gruß
Johannes

von Bernhard B. (schluchti)


Lesenswert?

Also bei FAT16 funktionierts so:

Im Root Directory gibts für jedes File und jedes Directory einen 32 Byte 
langen Eintrag. In dem 32 Byte langen Eintrag steht unter anderem: Der 
Filename, die Filegröße, die Uhrzeit wann das File erstellt wurde, der 
Startcluster..etc
Um jetzt ein File zu öffnen, muss zuerst das Root Directory nach dem zu 
öffnenden File durchsucht werden. Wenn das File gefunden wurde, dann 
holt man sich aus dem 32 Byte langen Eintrag den Startcluster des Files.
Der Startcluster wird anschließend in einen (Start-)sektor umgewandelt 
(wie das geht steht im Wikipedia Link). Das heißt, dein zu öffnendes 
File beginnt bei eben diesem (Start-)sektor. Den ersten Cluster kannst 
du also schon mal sektorweise lesen. Nun kann es aber sein, dass dein 
File etwas größer ist und mehrere Cluster belegt. Du gehst also her, 
nimmst den Startcluster von dem zu öffnenden File und schaust in der FAT 
nach ob der Eintrag auf einen weiteren Cluster zeigt, oder ob das der 
letzte Cluster ist (wenn 0xFFFF drinnen steht). Wenn du ein größeres 
File hast, dann bildet sich da eine "Cluster-Chain", also ein Cluster 
zeigt auf die Adresse des nächsten Cluster...usw.

Mir hats sehr geholfen, eine FAT16 formatierte SD-Karte herzunehmen und 
diese mit einem Hex-Editor zu untersuchen. Also einfach mal ein paar 
Werte überprüfen: Auf welchem Sektor befindet sich der Bootloader? Wo 
beginnt die FAT? Wo beginnt das Root Directory?

Ein guter Link ist übrigens: 
http://en.wikipedia.org/wiki/File_Allocation_Table

von Ich (Gast)


Lesenswert?

Ich habe vor Kurzem ein Programm geschrieben (in C) das 
FAT12-Dateisystem lesen kann. Das F8 FF FF FF FF FF FF 0F ist die FAT.
Funktioniert so:
Er schreibt zu jedem Cluster (wo eine Datei drinnensteht), welcher der 
nachfolgende Cluster ist, denn die meisten Dateien passen nicht in einen 
Cluster.
Wenn ich mich recht erinnere macht er aus zwei 12-stelligen Nummern drei 
Byte: abc def wird zu bc fa de, bin mir aber nicht mehr ganz sicher.
000 steht für frei, FF8 - FFF für Dateiende/belegt, FF7 steht für 
defekt.
Also FF8 FFF FFF FFF FFF 000 000 000 000 000 ...
Cluster 1-5 sind belegt, der Rest frei.
Wenn eine Datei gespeichert wird müsste es dann so aussehen:
FF8 FFF FFF FFF FFF 007 008 009 00A 00B FFF 000 000 000 ...
Die Datei beginnt in Cluster 6 (steht im Root-Directory), in der Fat 
steht bei Cluster 6 (sechste Zahl) 007 => nächster Cluster ist Cluster 
7.
So geht es weiter bis Cluster B, da steht FFF drin für Dateiende.
Also die Datei besteht aus Cluster 6, 7, 8, 9, A und B in dieser 
Reihenfolge. Wenn das Dateisystem recht voll wird, sind die Cluster 
einer Datei oft nicht mehr direkt hintereiander, sondern quer verteilt 
auf der Diskette (Fragmentierung), du musst immer die Kette verfolgen.

Nach der FAT beginnt das Root-Directory, da drin stehen Dateinamen, 
Größe, Änderungsdatum, Erstellzeitpunkt, ..., und ganz wichtig 
Anfangscluster.

Hoffe du kannst was anfangen damit.

von Johannes (Gast)


Lesenswert?

vielen Dank für deine Erklärungen - haben mich um einiges weiter 
gebracht:

Allerdings hab ich noch ein paar Fragen zum Stammverzeichnis - bzw. 
dessen Inhalt bei einem Example:

Als erstes kommt das Volume-Label; insgesamt befindet sich auf dem 
Massenspeicher eine Datei Readme.txt. Im Stammverzeichnis gibt es 
allerdings dazu zwei Einträge????

Und es sind zwei 0xE5 (gelöschte) Einträge vorhanden - warum? Die könnte 
man doch auch einfach komplett weglassen, oder ist das egal, weil sie 
entsprechend neu belegt werden, wenn sie benötigt werden für neue 
Dateien etc.?
1
//zu Beginn Volume-Label 
2
3
//Readme TXT --> Archiv | Offset 0x32 
4
0xE5,0x45,0x41,0x44,0x4D,0x45,0x20,0x20,0x54,0x58,0x54,0x20,0x00,0x00,0x00,0x00,      
5
0x21,0x00,0xBB,0x32,0x00,0x00,0xDC,0x83,0xBB,0x32,0x02,0x00,0x57,0x00,0x00,0x00,
6
7
//schreibgeschützt systemdatei 0x0F  --> 0xE5 bedeutet gelöschter eintrag? 
8
0xE5,0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x4D,0x00,0x0F,0x00,0x73,0x65,0x00,    //identisch 
9
0x2E,0x00,0x74,0x00,0x78,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
10
11
0xE5,0x45,0x41,0x44,0x4D,0x45,0x20,0x20,0x54,0x58,0x54,0x20,0x00,0x87,0x99,0x71,
12
0x45,0x37,0x45,0x37,0x00,0x00,0x4F,0x68,0x45,0x37,0x02,0x00,0x5E,0x00,0x00,0x00,
13
14
//schreibgeschützt systemdatei 0x0F 
15
0x41,0x52,0x00,0x65,0x00,0x61,0x00,0x64,0x00,0x4D,0x00,0x0F,0x00,0x73,0x65,0x00,     //identisch 
16
0x2E,0x00,0x74,0x00,0x78,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
17
18
//README TXT --> Archiv | Offset 0x38  
19
0x52,0x45,0x41,0x44,0x4D,0x45,0x20,0x20,0x54,0x58,0x54,0x20,0x00,0x87,0x99,0x71,
20
0x45,0x37,0xA9,0x38,0x00,0x00,0xD6,0x6E,0xA9,0x38,0x02,0x00,0x5F,0x00,0x00,0x00,

Gruß
Johannes

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.