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
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.
kann mir jmd von euch noch den Begriff Cluster etwas anschaulicher definieren? Irgendwie fehlt mir hier noch der Zugang.
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.
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.