Forum: Mikrocontroller und Digitale Elektronik FAT32 Dateisystem


von Ralf (Gast)


Lesenswert?

Hallo zusammen!

Versuche gerade das FAT32 Dateisystem auf einer CF-Karte zu verstehen.
Dabei lese ich gerade per Hand einzelne Sektoren aus. Aus dem MBR habe
ich nun die Startadresse der Volume ID gefunden. Diese liegt bei mir
auf der LBA Adresse 0x00000020.Lese ich diesen Sektor aus, erhalte ich
die folgenden Werte und kann daraus die anschließenden Berechnungen
durchführen, um das Root-Directory zu finden:

Sektor an Adresse 0x00000020
(aus Master Boot Record)

EB 58 90 4D 53 44 4F 53 35 2E 30 00 02 02 24 00
02 00 00 00 00 F8 00 00 3F 00 FF 00 20 00 00 00
E0 D0 03 00 CA 03 00 00 00 00 00 00 02 00 00 00
01 00 06 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 29 F0 69 B5 F4 4E 4F 20 4E 41 4D 45 20 20
20 20 46 41 54 33 32 20 20 20 33 C9 8E D1 BC F4
7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 08
CD 13 73 05 B9 FF FF 8A F1 66 0F B6 C6 40 66 0F
B6 D1 80 E2 3F F7 E2 86 CD C0 ED 06 41 66 0F B7
C9 66 F7 E1 66 89 46 F8 83 7E 16 00 75 38 83 7E
2A 00 77 32 66 8B 46 1C 66 83 C0 0C BB 00 80 B9
01 00 E8 2B 00 E9 48 03 A0 FA 7D B4 7D 8B F0 AC
84 C0 74 17 3C FF 74 09 B4 0E BB 07 00 CD 10 EB
EE A0 FB 7D EB E5 A0 F9 7D EB E0 98 CD 16 CD 19
66 60 66 3B 46 F8 0F 82 4A 00 66 6A 00 66 50 06
53 66 68 10 00 01 00 80 7E 02 00 0F 85 20 00 B4
41 BB AA 55 8A 56 40 CD 13 0F 82 1C 00 81 FB 55
AA 0F 85 14 00 F6 C1 01 0F 84 0D 00 FE 46 02 B4
42 8A 56 40 8B F4 CD 13 B0 F9 66 58 66 58 66 58
66 58 EB 2A 66 33 D2 66 0F B7 4E 18 66 F7 F1 FE
C2 8A CA 66 8B D0 66 C1 EA 10 F7 76 1A 86 D6 8A
56 40 8A E8 C0 E4 06 0A CC B8 01 02 CD 13 66 61
0F 82 54 FF 81 C3 00 02 66 40 49 0F 85 71 FF C3
4E 54 4C 44 52 20 20 20 20 20 20 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 0D 0A 44 61
74 65 6E 74 72 84 67 65 72 20 65 6E 74 66 65 72
6E 65 6E FF 0D 0A 4D 65 64 69 65 6E 66 65 68 6C
65 72 FF 0D 0A 4E 65 75 73 74 61 72 74 3A 20 54
61 73 74 65 20 64 72 81 63 6B 65 6E 0D 0A 00 00
00 00 00 00 00 00 00 00 00 AC C4 D3 00 00 55 AA

Bytes per Sector:    512  =0x0200
Bytes per Cluster:    2  =0x02
Reserved Sectors:    36  =0x0024
Number of FATs:      2  =0x02
Sectors per FAT:    970  =0x03CA
Root Directory First Cluster:  2  =0x00000002

fat_begin_lba = Partition_LBA_Begin + Number_Of_Reserved_Sectors
fat_begin_lba = 0x00000020 + 0x00000024 = 0x00000044

cluster_begin_lba = Partition_LBA_Begin + Number_Of_Reserved_Sectors +
(Number_of_FATs * Sectors_Per_FAT)
cluster_begin_lba = 0x00000020 + 0x00000024 + (2 * 0x03CA) =
0x000007D8

sectors_per_cluster = 2

root_dir_first_cluster = 0x00000002

Wenn ich jetzt den Sektor 'cluster_begin_lba' (also LDA-Adresse
0x000007D8) auslese, erhalte ich nur 0x00. Auch die weiteren Sektoren
liefern nur solche Werte. Sollte an dieser Adresse oder einer folgenden
das Root Dir stehen? Wo liegt mein Fehler?

Auf Adresse 'fat_begin_lba' finde ich Daten, die mir schlüssig
vorkommen. Es scheint die FAT zu sein. (Verschiedene kleinere Werte und
0xFFFFFFF0).

Also, meine Frage ist, was mache ich bei der Berechnung der Adresse des
Root Directory falsch?

Viele Grüße,

Ralf

von Matthias (Gast)


Lesenswert?

Hi

ist auf der Platte überhaupt irgendwas drauf? Wenn nein dann würde ich
die 0x00 als normal ansehen. Ich hab deine Werte mal durch meine
FAT32-Routinen gejagt und komme als Beginn des Datenbereichs (Einen
definierten Root-Bereich wie bei FAT16 gibt es bei FAT32 nicht) auch
auf 0x7D8

Matthias

von Ralf (Gast)


Lesenswert?

Hi,

habe die Karte zunächst in FAT32 formatiert und dann ein paar
Quellcodedateien von meinem Programm draufkopiert. Die Karte ist also
nicht leer. In meinem Kartenleser am PC werden die Dateien ganz normal
angezeigt. Allerding ist in den Daten oben auch ein ganz normaler
String enthalten:

"Medienfehler Datenträger entfernen" oder so ungefähr.

Die Formatierung der Karte geht auch innerhalb von Sekunden. Kann es
vielleicht sein, dass ich mir das Ding irgendwie geschossen habe? Mich
wundert es nur, dass die Karte am PC ganz normal am PC gelesen werden
kann und die ersten Sektoren, welche ich mit dem Controller auslese
auch vernünftige Werte aufweisen. Die FAT liegt ja auch an der
richtigen Stelle.

Gruß,
Ralf

von Jens Renner (Gast)


Lesenswert?

Hallo,

ich hatte dieses Problem auch mal gehabt. Ich habe dann einfach die
Cluster vor und hinter dem berechneten Datenbereich angeschaut (sehr
nuetzliches Programm: http://www.sf-soft.de/winhex/index-m.html), und
letztendlich lag der Beginn des Datenbereichs 2 Cluster (1024 bzw.
0x400 Sektoren) weiter vorne.

Ich hatte das nicht weiter verfolgt, auf jeden Fall funktioniert alles
einwandfrei, wenn ich immer 2 Cluster abziehe (unabhaengig von der
verwendeten Festplatte).
root_dir_first_cluster waere in dem fall 0, der erste Sektor folglich
bei 0x3D8.

Wuerde mich interessieren, ob das bei Dir aehnlich ist. Schau Dir ggf.
auch mal die CF-Karte mit einem Diskviewer an. Dann weisst Du
definitiv, wo Deine Daten anfangen.

von Jens Renner (Gast)


Lesenswert?

Entschuldige, die Angabe

"(1024 bzw. 0x400 Sektoren)"

ist natuerlich falsch (dementsprechend die 0x3D8), der Cluster hat
keine 512 Sektoren. Setz statt dessen Deine Clustergroesse ein.

Jens

von Matthias (Gast)


Lesenswert?

Hi

@Jens
Ist ja ulkig. Das was du als Fehler betrachtest ist ein Teil der
FAT32-Spezifikation. Cluster 0 des Datenbereichs ist immer der mit
Clusternummer 2. Du mußt also grundsätzlich 2 von der Clusternummer
abziehen um die entsprechende Sektornummer zu berechnen.

Der passende Startsektor eines Clusters berechnet sich demnach nach:

fat_data_start + ((cluster - 2) * fat_clustersize);

@Ralf
Laß dir einfach mal sequenziell alle Sektoren ausgeben. Irgendwann
müssen deine Daten ja mal kommen.

Matthias

von Ralf (Gast)


Lesenswert?

@Jens:

Danke für den Link! Jetzt weiß ich, wo mein Verzeichnis liegt! Es liegt
auf Sektor 1976 = 0x07B8. Ich hatte allerdings 7D8 ausgerechnet, also
genau 0x20 zu viel. Das ist aber genau der Offset, der durch die Volume
ID entsteht. Ist dann meine Formel falsch? Oder wo liegt mein
Vertsändnisproblem?
Leider kann ich es jetzt nich gleich testen, da ich mir gerade noch
meine Schaltung geschossen habe :-((.

@Mathias:

Du hattest doch auch 0x7D8 berechnet. Gibt es vielleicht noch weitere
kleinigkeiten, worauf ich achten muß?

Also dann,

Viele Grüße,

ralf

von Jens Renner (Gast)


Lesenswert?

Ist ja ulkig, dass ich die FAT32-Spezifikationen nicht im Kopf habe...
Im Uebrigen habe ich das nicht als Fehler der Spezifikation betrachtet,
so vermessen bin ich nicht. Der Fehler lag in meiner Berechnung, aber
das Phaenomen war letztendlich dasselbe.

von Matthias (Gast)


Lesenswert?

Hi

ich hab eben nochmal in meine Sourcen geschaut. Ich berechne den
Datenstart wie folgt:

fat_data_start = par_begin + fat_res_sectors + fat_length*num_fat;

Das hat bisher eigentlich sehr zuverlässig funktioniert.

Matthias

von Ralf (Gast)


Lesenswert?

Hi,

ich glaube der Fehler mit den fehlenden 0x20 lag daran, dass ich die
Software Winhex zunächst falsch verstanden habe. Das Programm fängt bei
der Volume ID an zu zählen und nicht beim Bootsektor. (Wenn man sich
mal blöd anstellt)
Ich habe im Moment die Vermutung, dass nur mein unterstes Byte der
LBA-Adresse richtig gesetzt wird und ich vielleicht bei den oberen
Bytes etwas vertauscht habe. Ich werde also mal die Reihenfolge testen,
wie ich die Register beschreibe. Kann es vielleicht sein, dass man den
LBA-Modus als erstes setzen muß, bevor man die LBA-Adresse schreibt?
Bei mir ist es so, dass ich zuerst Cyl high/low, dann das Drive Head
mit LBA Bit und zuletzt das Sektor No. Register beschreibe. Das würde
für meinen Fehler sprechen. Ich werde heute Abend also mal versuchen,
zuerst das LBA-Bit zu setzen und dann den Rest zu erledigen.

Ralf

von Matthias (Gast)


Lesenswert?

Hi

die Reihenfolge ist egal da die Register eh erst Gültigkeit bekommen
wenn man in das Command Register schreibt.

Matthias

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.