FAT Unklarheiten im Betreff auf Linux

#1
Hallo Community!

Vorweg:
Sollte das Thema nicht in dieses Unterforum hineinpassen, dann bitte verschieben.

Zum Thema:
Ich will einen FAT Treiber für einen AVR Mikrocontroller schreiben. Einen Treiber für
die SD Karte habe ich bereits geschrieben. Dieser ist zwar noch instabil, vermutlich ein
Timingproblem, soll jetzt aber nicht das Thema sein. Als erster Meilenstein vom FAT
Treiber ist das richtige Auslesen der Verzeichnisse und Dateien. Ich habe eine Imagedatei
über das Loop Device mit FAT32 formatiert und anschließend gemountet um das Dateisystem
auf den Zahn zu fühlen. Habe jetzt allerdings diverse Fragen, für die ich aber noch keine Antwort
habe.

Hier ist der hexdump des Dateisystems. Ich habe hier lediglich eine Textdatei angelegt.
Habe die Bereiche dementsprechend kommentiert. Wäre toll, wenn jemand hier
auf die eine und andere Frage eine Antwort hat:
Code:
00000000  eb 58 90 6d 6b 66 73 2e  66 61 74 00 02 08 20 00  |.X.mkfs.fat... .|
00000010  02 00 00 00 00 f8 00 00  3f 00 ff 00 00 00 00 00  |........?.......|
00000020  00 00 20 00 00 08 00 00  00 00 00 00 02 00 00 00  |.. .............|
00000030  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  80 00 29 57 51 3c 70 4e  4f 20 4e 41 4d 45 20 20  |..)WQ<pNO NAME  |
00000050  20 20 46 41 54 33 32 20  20 20 0e 1f be 77 7c ac  |  FAT32   ...w|.|
00000060  22 c0 74 0b 56 b4 0e bb  07 00 cd 10 5e eb f0 32  |".t.V.......^..2|
00000070  e4 cd 16 cd 19 eb fe 54  68 69 73 20 69 73 20 6e  |.......This is n|
00000080  6f 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 64 69  |ot a bootable di|
00000090  73 6b 2e 20 20 50 6c 65  61 73 65 20 69 6e 73 65  |sk.  Please inse|
000000a0  72 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 66 6c  |rt a bootable fl|
000000b0  6f 70 70 79 20 61 6e 64  0d 0a 70 72 65 73 73 20  |oppy and..press |
000000c0  61 6e 79 20 6b 65 79 20  74 6f 20 74 72 79 20 61  |any key to try a|
000000d0  67 61 69 6e 20 2e 2e 2e  20 0d 0a 00 00 00 00 00  |gain ... .......|
000000e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000001f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000200  52 52 61 41 00 00 00 00  00 00 00 00 00 00 00 00  |RRaA............|
00000210  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
000003e0  00 00 00 00 72 72 41 61  fa fd 03 00 06 00 00 00  |....rrAa........|
000003f0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000400  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000c00  eb 58 90 6d 6b 66 73 2e  66 61 74 00 02 08 20 00  |.X.mkfs.fat... .|
00000c10  02 00 00 00 00 f8 00 00  3f 00 ff 00 00 00 00 00  |........?.......|
00000c20  00 00 20 00 00 08 00 00  00 00 00 00 02 00 00 00  |.. .............|
00000c30  01 00 06 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000c40  80 00 29 57 51 3c 70 4e  4f 20 4e 41 4d 45 20 20  |..)WQ<pNO NAME  |
00000c50  20 20 46 41 54 33 32 20  20 20 0e 1f be 77 7c ac  |  FAT32   ...w|.|
00000c60  22 c0 74 0b 56 b4 0e bb  07 00 cd 10 5e eb f0 32  |".t.V.......^..2|
00000c70  e4 cd 16 cd 19 eb fe 54  68 69 73 20 69 73 20 6e  |.......This is n|
00000c80  6f 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 64 69  |ot a bootable di|
00000c90  73 6b 2e 20 20 50 6c 65  61 73 65 20 69 6e 73 65  |sk.  Please inse|
00000ca0  72 74 20 61 20 62 6f 6f  74 61 62 6c 65 20 66 6c  |rt a bootable fl|
00000cb0  6f 70 70 79 20 61 6e 64  0d 0a 70 72 65 73 73 20  |oppy and..press |
00000cc0  61 6e 79 20 6b 65 79 20  74 6f 20 74 72 79 20 61  |any key to try a|
00000cd0  67 61 69 6e 20 2e 2e 2e  20 0d 0a 00 00 00 00 00  |gain ... .......|
00000ce0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000df0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 55 aa  |..............U.|
00000e00  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Bis hierhin ist mir klar was Sache ist (Boot Record, FAT32 Filesysteminfo und Backup Boot Record) .
Code:
00004000  f8 ff ff 0f ff ff ff 0f  f8 ff ff 0f 00 00 00 00  |................|
00004010  00 00 00 00 00 00 00 00  ff ff ff 0f 00 00 00 00  |................|
00004020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
FAT 0
Code:
00104000  f8 ff ff 0f ff ff ff 0f  f8 ff ff 0f 00 00 00 00  |................|
00104010  00 00 00 00 00 00 00 00  ff ff ff 0f 00 00 00 00  |................|
00104020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
FAT 1 (Kopie von FAT 0)
Code:
00204000  e5 2e 00 74 00 65 00 73  00 74 00 0f 00 c8 2e 00  |...t.e.s.t......|
00204010  63 00 70 00 70 00 2e 00  73 00 00 00 77 00 70 00  |c.p.p...s...w.p.|
VFAT Eintrag (Kennung: 0x0F) -> VIM Swap Datei?
Code:
00204020  e5 45 53 54 43 50 7e 31  53 57 50 20 00 6a 36 23  |.ESTCP~1SWP .j6#|
00204030  a6 4e a6 4e 00 00 36 23  a6 4e 03 00 00 30 00 00  |.N.N..6#.N...0..|
VIM Swap Datei?
Code:
00204040  41 74 00 65 00 73 00 74  00 2e 00 0f 00 42 63 00  |At.e.s.t.....Bc.|
00204050  70 00 70 00 00 00 ff ff  ff ff 00 00 ff ff ff ff  |p.p.............|
VFAT Eintrag (Kennung: 0x0F) -> Die echte Datei.
Code:
00204060  54 45 53 54 20 20 20 20  43 50 50 20 00 49 39 23  |TEST    CPP .I9#|
00204070  a6 4e a6 4e 00 00 39 23  a6 4e 06 00 0d 00 00 00  |.N.N..9#.N......|
Die echte Datei. Größe 13 Bytes. Startadresse 0x208000 (Cluster 6)
Code:
00204080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Müll.
Code:
00205000  62 30 56 49 4d 20 38 2e  30 00 00 00 00 10 00 00  |b0VIM 8.0.......|
00205010  00 00 00 00 00 00 00 00  74 4e 00 00 72 6f 6f 74  |........tN..root|
Interessant, dass hier Linux den Programmnamen auch speichert. Warum?
Code:
00205020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Müll.
Code:
00205040  00 00 00 00 6d 61 74 72  69 78 34 32 00 00 00 00  |....matrix42....|
00205050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
Warum speichert Linux hier den Hostnamen?
Code:
00205060  00 00 00 00 00 00 00 00  00 00 00 00 2f 6d 6e 74  |............/mnt|
00205070  2f 74 65 73 74 2e 63 70  70 00 00 00 00 00 00 00  |/test.cpp.......|
Warum speichert Linux hier den absoluten Pfad der Datei?
Code:
00205080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Müll.
Code:
002053e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 0d 55  |...............U|
002053f0  33 32 31 30 00 00 00 00  23 22 21 20 13 12 55 00  |3210....#"! ..U.|
Was ist das für eine Eintrag? UNIX Dateiattribute?
Code:
00205400  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Müll.
Code:
00206000  74 70 01 00 7f 00 00 00  02 00 00 00 00 00 00 00  |tp..............|
00206010  01 00 00 00 00 00 00 00  01 00 00 00 00 00 00 00  |................|
00206020  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00206030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00207000  61 64 00 00 d3 0f 00 00  f3 0f 00 00 00 10 00 00  |ad..............|
00207010  01 00 00 00 00 00 00 00  f3 0f 00 00 00 00 00 00  |................|
00207020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
Was sind diese Einträge?
Code:
00207ff0  00 00 00 48 65 6c 6c 6f  20 57 6f 72 6c 64 21 00  |...Hello World!.|
Reste von der Swap Datei?
Code:
00208000  48 65 6c 6c 6f 20 57 6f  72 6c 64 21 0a 00 00 00  |Hello World!....|
Die echte Datei. Eine Größe von 13 Bytes.
Code:
00208010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
40000000
Müll.

Vorweg vielen Dank!

Edit:
Okay, habe die Datei hier mit VIM angelegt. Jetzt habe ich einfach eine Datei mit
Code:
$ echo "Hello World! > test.txt
erstellt.

Schaut schon anders aus. Trotzdem möchte ich gerne Wissen, was hier VIM eigentlich alles speichert.
Es geht hauptsächlich darum, dass die ich Metadaten ignorieren kann, damit es nicht zu einen Fehler in meinem
FS-Treiber kommt. Deswegen möchte ich gerne wissen ob die unbekannten Einträge was besonderes haben, damit
ich sie erkenne und somit ausblenden kann.
 
Zuletzt bearbeitet:

Chromatin

Moderator
Mitarbeiter
#2
#3
Okay, danke für die Information.

Hab aber mittlerweile herausgefunden, dass diese von mir beanstanden Daten nur mehr Datenmüll ist.
Das Verständnis mit den FAT Einträgen war etwas unzureichend.

Die Erklärung:
Die Clustergröße ist 4096 Bytes, laut Boot Record. Die ersten drei FAT Einträge sind soweit ich es verstehe
die reservierten Cluster. Wobei der erste reservierte Cluster bei der Adresse 0x1000 beginnt. Ab Adresse 0x2000
beginnt der zweite und ab 0x3000 der dritte reservierte Cluster. Davor ist der Bootsektor (0x0000 bis 0x01FF), die FAT32 Fileinfo Struktur
(0x0200 bis 0x03FF), dann bis 0x0BFF Nullen und noch eine Kopie vom Bootsektor (0x0C00 bis 0x0DFF). Der Rest bis zu 0x1000 wieder Nullen.
Wobei die Nullen wahrscheinlich irgend einen Wert haben können. Habe nämlich mit dd das Image erstellt und mit Nullen aufgefüllt.

Die ersten beiden Verzeichniseinträge (VFAT und normaler Eintrag) kann man ignorieren, da das erste Byte den Wert 0xE5 hat. Was
bedeutet, dass die Datei gelöscht wurde. Das war einmal eine Swap Datei. Die nächsten zwei Einträge sind die vorhande Datei.

Ab Adresse 0x205000 kann man bis Adresse 0x207FFF alles getrost ignorieren, da in der FAT diese drei Cluster als frei (0x00000000) markiert
sind. Somit enthalten sie nur Datenmüll.

Ab 0x208000 beginnt die Datei die natürlich noch nicht gelöscht wurde.

Ich hoffe ich habe das jetzt richtig interpretiert.
 
Oben