Forum: Mikrocontroller und Digitale Elektronik FAT erklärung mit nem beispiel


von commtel (Gast)


Lesenswert?

Ich hab mir alles durch gelesen angefangen von fatgen 103 von microdoof
bis so manche mp3 projekte.
Nur ich komm echt nicht klar mit den formeln.
Ich wollte jetzt wissen wie ich die daten wieder finde
Klar ist mir wie man von bootsector zur fat kommt oder zur dir
Wäre echt mal nett wenn auch ein einfaches beispiel dabei wäre

von john (Gast)


Lesenswert?

hi commtel,

boot sector beinhaltet info über die vier partitionen.
eine partition mit fat32 hat

1. fat chain 1
2. fat chain 2
3. daten

der 1te daten sector ist immer der root ordner. ist das was du
meinteste ??

ich habe dir ne mail mit meiner icq gesendet. falls noch fragen sind
kannst du dich gerne direkt melden. ich kann dir dann auch ne kopie
meiner fat32 source zukommen lassen wenn du willst.

john

von commtel (Gast)


Lesenswert?

Hallo john

wau das ging ja schnell mit einer ant.
ich nehm mal an das du mit
Fat chain 1 die tabelle meinst in der die nächste cluster nummer zu
finden ist wo die der nächste teil der datei ist.

Mit Fat chain 2 ist wohl das wo man die daten wie um welche datei es
sich handelt also z b txt datum und start cluster

Ich hoffe das ich soweit richtig liege?

aber wie komm ich von der fat chain 2 zu den daten die ich haben möchte
also wie berechne ich da?

in microdoof steht drin es sei der cluster wo die daten anfangen oder
nicht und in der fat chain 1 wo es weiter geht.
Na ja so hab ich es verstanden

Hoffe bekomm eine ant auf meine dummen fragen g

cu
commtel

von john (Gast)


Lesenswert?

ne wenn w2k ne mmc formatiert werden da 2 identische fat chains drauf
geschrieben um fehler zu verhindern.
fat32 sieht einen ordner als datei an. in dem 1ten sector des daten
teils befindet sich der root ordner. jeder eintrag besteht aus 32 byte
die ersten 8+3 sind der msdos datei name
danach kommt ein byte welches definiert ob es sich um
datei/ordner/read-only/archiv/volumelabel/ordner/langer dateiname
handelt. der rest der 32byte gibt auskunft über grösse/anfangs
sector/datum

hier ist die funktion mit der ich die pointer lade -->
// takes a 32 byte long fat entry and opens the file contained within
void FAT_load_file_ptr(u08 *fat_entry, FILE *stream){
  // get the first sector of the file
  stream->file_first_cluster = (((u32)fat_entry[21])<<24) +
                (((u32)fat_entry[20])<<16) +
                (((u32)fat_entry[27])<<8) +
                fat_entry[26];

  stream->file_first_cluster -= 2;

  // set the curr file pos to the begining
  stream->file_current_cluster = stream->file_first_cluster;

  // get the size of the file and the size to go
  stream->file_full_size = stream->file_size =
(((u32)fat_entry[31])<<24) +
                          (((u32)fat_entry[30])<<16) +
                          (((u32)fat_entry[29])<<8) +
                          fat_entry[28];
        stream->file_offset = 0x00;
  // copy the short file name
  for(fat_u08=0; fat_u08<11; fat_u08++){
    stream->name[fat_u08] = fat_entry[fat_u08];
  };
};

und mit dieser schreibe ich sie -->
void FAT_set_entry(u08 *data, u08 attr, u08 *name, u32 sector, u08
ntval){
  memset(data, 0, 32);
  // set date&time
  data[22] = data[14] = 0x1c; // TIMEL;
  data[23] = data[15] = 0x73; // TIMEH;
  data[18] = data[24] = data[16] = DATEL;
  data[19] = data[25] = data[17] = DATEH;
  data[13] = 0x19;
  // set attribs
  data[11] = attr;
  // set name
  // make sure that all the chars are upper
  FAT_upper_name(name);
  for(fat_u08 = 0; fat_u08 < 11; fat_u08++){
    data[fat_u08] = name[fat_u08];
  };
  // set filesize to zero
  data[31] = data[30] = data[29] = data[28] = 0x00;
  // NT reserved
  data[12] = ntval;

  if(sector) sector += 2;
  data[21] = (u08)((sector>>24)&0xff);
  data[20] = (u08)((sector>>16)&0xff);
  data[27] = (u08)((sector>>8)&0xff);
  data[26] = (u08)(sector&0xff);
};

zum berechnen des datums benutze ich diese macros
#ifdef FAT_WRITE
#define MAKE_TIME(h, m, s) ((((int)h&0x1f)<<11) + (((int)m&0x3f)<<5) +
(s&0x1f))
#define TIME MAKE_TIME(12, 2, 24)
#define TIMEH ((TIME>>8)&0xff)
#define TIMEL (TIME&0xff)

#define MAKE_DATE(y, m, d) ((((int)y&0x7f)<<9) + (((int)m&0xf)<<5) +
(d&0x1f))
#define DATE MAKE_DATE(25, 3, 2)
#define DATEH ((DATE>>8)&0xff)
#define DATEL (DATE&0xff)

gruss,
john

von commtel (Gast)


Lesenswert?

oh man das ist alles c source damit kann ich leider nicht sehr viel
anfangen weil ich will in assembler schreiben für den 8051 kern.

Also ich hab das prog WinHex mir geholt um die daten oder besser gesagt
die eigenschaften von FAT 32 besser zu verstehen

Also der Bootsector sieht so aus:

EB58904D53444F53352E300002082000
0200000000F800003F00FF003F000000
D529C100333000000000000002000000
01000600000000000000000000000000
80002979E61C544E4F204E414D452020
2020464154333220202033C98ED1BCF4
7B8EC18ED9BD007C884E028A5640B408
CD137305B9FFFF8AF1660FB6C640660F
B6D180E23FF7E286CDC0ED0641660FB7
C966F7E1668946F8837E16007538837E
2A007732668B461C6683C00CBB0080B9
0100E82B00E94803A0FA7DB47D8BF0AC
84C074173CFF7409B40EBB0700CD10EB
EEA0FB7DEBE5A0F97DEBE098CD16CD19
6660663B46F80F824A00666A00665006
53666810000100807E02000F852000B4
41BBAA558A5640CD130F821C0081FB55
AA0F851400F6C1010F840D00FE4602B4
428A56408BF4CD13B0F9665866586658
6658EB2A6633D2660FB74E1866F7F1FE
C28ACA668BD066C1EA10F7761A86D68A
56408AE8C0E4060ACCB80102CD136661
0F8254FF81C300026640490F8571FFC3
4E544C44522020202020200000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000000000000D0A4E54
4C4452206665686C74FF0D0A44617465
6E7472846765726665686C6572FF0D0A
4E65757374617274206D69742062656C
696562696765722054617374650D0A00
000000000000000000ACBACE000055AA

offset     title     value
b    Bytes per sector   512
D    Sectors per cluster  8
e    reserved sectors    32
10   number of fats       2
18   sectors per track   63
1a   heads              255
1c   hidden sectors      63
20   sectors (large volume) 12659157
24   sectors üer fat    12339
2c   root dir 1 st cluster 2

Ok die fat ist bei sector 32 (laut winhex)

F8 FF FF FF FF FF FF FF FF FF FF 0F 00 00 00 00

die fat kopie bei sector 12371 (laut winhex)

F8 FF FF FF FF FF FF FF FF FF FF 0F 00 00 00 00


die root dir bei sector 24710 (laut winhex)

so bei offset C10C20 ist die erste pfadangabe zu meiner gespeicherten
datei. Die sieht so aus

53494D3531202020444F432000A2D76A
5632563201006EA5C21A0200BDB20100

bei offset c10c34 ist der wert 01 00
bei offset c10c3a ist der wert 02 00

die daten fangen bei bei cluster 65538 an und gehen bis cluster 65565
in sectoren ausgedrückt 548998 (offset 10c10c00) bis einschliesich
sector 549214 (offset 10c2be00).

Wer kann mir jetzt die formeln sagen oder mal GENAU erklären wie das
ganze abläuft.

Bitte nicht schreiben "nimm doch das fatgen103 document von
microdoof"
weil seit dem versteh ich noch weniger als das was ich bei google
gefunden hab.

von commtel (Gast)


Lesenswert?

also mit c source kann ich leider nicht viel anfangen.
Ich schreibe das ganze in assembler für den 8051.

Ich hab das prog Winhex für die festplatte auslesen
und im bootsector steht folgendes drin:

EB58904D53444F53352E300002082000
0200000000F800003F00FF003F000000
D529C100333000000000000002000000
01000600000000000000000000000000
80002979E61C544E4F204E414D452020
2020464154333220202033C98ED1BCF4
7B8EC18ED9BD007C884E028A5640B408
CD137305B9FFFF8AF1660FB6C640660F
B6D180E23FF7E286CDC0ED0641660FB7
C966F7E1668946F8837E16007538837E
2A007732668B461C6683C00CBB0080B9
0100E82B00E94803A0FA7DB47D8BF0AC
84C074173CFF7409B40EBB0700CD10EB
EEA0FB7DEBE5A0F97DEBE098CD16CD19
6660663B46F80F824A00666A00665006
53666810000100807E02000F852000B4
41BBAA558A5640CD130F821C0081FB55
AA0F851400F6C1010F840D00FE4602B4
428A56408BF4CD13B0F9665866586658
6658EB2A6633D2660FB74E1866F7F1FE
C28ACA668BD066C1EA10F7761A86D68A
56408AE8C0E4060ACCB80102CD136661
0F8254FF81C300026640490F8571FFC3
4E544C44522020202020200000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000000000000D0A4E54
4C4452206665686C74FF0D0A44617465
6E7472846765726665686C6572FF0D0A
4E65757374617274206D69742062656C
696562696765722054617374650D0A00
000000000000000000ACBACE000055AA

b   bytes per sector 512
d   sectors per cluster 8
e   reversed sectors 32
10  number of fats 2
15  media f8
18  sectors per track 63
1a  heads  255
1c  hidden sectors  63
20  setors (large volume) 12659157
24  sector per fat 12339
2c  root dir 1st cluster 2


Die fat ist zu finden bei setor 32 (offset 4000)

F8 FF FF FF FF FF FF FF FF FF FF 0F 00 00 00 00

die kopie ist bei sector 12371 (offset 60 a6 00 )


Die root dir finde ich bei sector 24710 (offset c10c00)
Die pfadangabe für meine datei ist bei offset c10c20 und die sieht so
aus:

53494D3531202020444F432000A2D76A
5632563201006EA5C21A0200BDB20100

offset c10c34 :high word ist 1 (hexwert 01 00 oder 00 01??)
offset c10c3a :32 bit cluster # 65538 (hexwert 02 00 oder 00 02 ??)


und die datei fängt an bei cluster 65538 bis  65565

kann mir jetzt jemand GENAU erklären wie das ganze abläuft oder die
formeln dazu sind???????????
Also z.b wie brechne ich die adresse oder den sector der zweiten fat
oder wie komm ich in die root dir und von da die rechnung zur datei
usw???????
BITTE nicht schreiben  "nimm doch einfach das fatgen.doc von
microdoof" weil seit dem versteh ich noch weniger als ich bei google
gefunden hab

von commtel (Gast)


Lesenswert?

ich frag mich gerade warum das posting nicht durch kommt???

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.