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
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
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
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.
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
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
@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
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.