Forum: Mikrocontroller und Digitale Elektronik FAT LBA-Beginn


von Alexander (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
habe erfolgreich eine MMC mit nem AVR ansteuern können. Nun wollte ich
mit dem Dateisystem FAT anfangen und lese die Partitionstabelle im MBR
aus. Die letzten 66 Bytes habe ich mitdokummentiert, jedoch sieht das
alles nicht nach Adressen aus (Medienfehler, Taste drücken)??? Siehe
Bild Bytes 446-512 Abschluss mit 55h AAh
Was hat der Text zu bedeuten? Das kann doch nicht die Adresse sein?

Gruß Alex

von Tobias Schneider (Gast)


Lesenswert?

Hi,
die Karte wurde wohl mit windows formatiert. Ich habe hier auch ein
Projekt, bei dem eine MMC verwendet wird. Dabei habe ich fetsgestellt,
das windows bei meiner MMC garkeinen MBR an den Anfang schreibt,
sondern direkt mit der FAT Partition anfaengt. Schau dir doch mal die
restlichen Werte im ersten Sektor an. Ich wette, das du die typischen
FAT Standardwerte findest(512 Byte pro Sektor, 0x20 reservierte
Sektoren, 2FATs)

Gruß Tobias

von Hans (Gast)


Lesenswert?

nur zur info... ohne mbr und partition zeugs heisst superfloppy...
usb-sticks werden gerne so vergewaltigt um ein paar bytes mehr
rauszuholen oder weiß gott warum....

ich hab hier im forum schon gepostet wie man die dinger wieder mit
mbr/partitionen usw versieht ;)

73

von dave (Gast)


Lesenswert?

Meine MMC mit 32MB hat MBR und VBR, alles an den richtigen stellen:
0, 64, 66, 552
MBR, VBR, FAT, (data oder root, dont know)

dave

von Alexander (Gast)


Angehängte Dateien:

Lesenswert?

Aha, wieder etwas dazugelernt. Es ist genau so wie Tobi es vermutet
hat.
Danke

von Alexander (Gast)


Lesenswert?

So jetzt habe ich doch noch Fragen dazu.
Habe jetzt die ersten 62 Bytes (FAT16 Boot Record) vor mir liegen. Ich
weiß aber nicht so richtig wie es nun weitergeht.
Auf dieser Seite habe hole ich meine Informationen:
http://home.teleport.com/~brainy/fat16.htm

Bis jetzt vermute ich folgende Vorgehensweise...
Die ersten 2 Bytes ist ein Sprungcode (Adresse 0x00)
zu diesem Spruncode werden die reservierten Sektoren addiert (0x20)
dann wird die (Anzahl der Sektoren pro FAT)*2 addiert (1Word)
und das soll mein Root Directory Entry geben.

Wobei mich die Anzahl Sektoren pro FAT irritieren. Sollen das nicht
Cluster sein? So komme ich nie auf meine Speicherkarte (256MB)!

Gruß Alex

von Rufus T. Firefly (Gast)


Lesenswert?

Bei FAT16 ist ein FAT-Eintrag zwei Byte groß. Da in einen Sektor 512
Byte passen, können also 256 FAT-Einträge in einem Sektor abgelegt
werden. Da maximal 2^64 FAT-Einträge möglich sind, resultiert so eine
maximale FAT-Größe von 128 kByte, was 256 Sektoren sind. Der Wert bei
Offset 0x16 kann also nicht größer als 0x100 werden.

Bei Dir steht da ein Wert von 0x00F5, (dez. 245)
die Anzahl der Sektoren pro Cluster (Offset 0xD) beträgt 8, also 4
kByte.

Damit kann diese FAT eine Gesamtgröße von

  245  256  8 = 501760 Sektoren

  501760 Sektoren * 512 Bytes = 256901120 Bytes

adressieren.

Das korreliert mit dem Wert ab Offset 0x20 (Anzahl der Sektoren der
Partition) von

  0x7A800 (dez. 501760). <-- Kommt der Wert Dir bekannt vor?

von dave (Gast)


Lesenswert?

;#####################################################
; volumen boot record
;´der 1. partition, enthalten im mbr (0)
.equ mbr_offset             = 0x0000
.equ vbr_address_offset    = 0x01c6

;#####################################################
; boot sector
.equ bs_jmpboot      = 0x00    ; char[3]
.equ bs_oemname      = 0x03    ; char[8]
.equ bpb_bytespersec  = 0x0b    ; int
.equ bpb_secperclus    = 0x0d    ; char
.equ bpb_rsvdseccnt    = 0x0e    ; int
.equ bpb_numfats    = 0x10    ; char
.equ bpb_rootentcnt    = 0x11    ; int
.equ bpb_totsec16    = 0x13    ; int
.equ bpb_media      = 0x15    ; char
.equ bpb_fatsz16    = 0x16    ; int
.equ bpb_secpertrk    = 0x18    ; int
.equ bpb_numheads    = 0x1a    ; int
.equ bpb_hiddsec    = 0x1c    ; longint
.equ bpb_totsec32    = 0x20    ; longint
; fat12 and fat16
.equ bs_drivenumber    = 0x24    ; int
.equ bs_reserved1    = 0x26    ; char
.equ bs_bootsig      = 0x27    ; longint
.equ bs_volid      = 0x2b    ; char[11]
.equ bs_vollab      = 0x36    ; char[8]
.equ bs_filsystype    = 0x3e    ; char[448]
.equ bs_exemarker    = 0x1fe    ; char[2]

;#####################################################
; ram
.equ ram_vbr_address    = 0x150  ; word
.equ ram_fat_address        = 0x152 ; word
.equ ram_root_address       = 0x154 ; word
.equ ram_data_address       = 0x156 ; word

.equ ram_sec_per_clus       = 0x158 ; byte
.equ ram_reserved_sectors   = 0x159 ; word
.equ ram_max_root_dir_ent   = 0x15b ; word


fat_load_info:
; where is the VBR?
    sts ram_address,    null
    sts ram_address+1,  null
    sts ram_address+2,  null
    rcall mmc_read_sector       ; read mbr (offset = 0)

    movi ram_vbr_address,   ram_data + vbr_address_offset
    movi ram_vbr_address+1, ram_data + vbr_address_offset+1

; where is the FAT?
    movi ram_address,   ram_vbr_address
    movi ram_address+1, ram_vbr_address+1
    sts ram_address+2,  null
    rcall mmc_read_sector       ; read vbr

    lds temp2, ram_vbr_address
    lds temp3, ram_vbr_address+1
    lds temp4, ram_data + bpb_rsvdseccnt
    lds temp5, ram_data + bpb_rsvdseccnt+1

; reserved sectors + partition's start = fat
    add temp2, temp4
    adc temp3, temp5

    sts ram_fat_address,    temp2
    sts ram_fat_address+1,  temp3

; where is the ROOT DIRECTORY?
    lds temp4,  ram_data + bpb_fatsz16
    lds temp5,  ram_data + bpb_fatsz16+1

; fat address + (sec per fat *2) = root
    lsl temp4
    rol temp5
    add temp2,  temp4
    adc temp3,  temp5

    sts ram_root_address,   temp2
    sts ram_root_address+1, temp3

; where begins the DATA?
; root + (max root dir ent * 32)/bytes per sec
; ==> root + (512*32)/512 = root + 32
    ldi temp1, 32
    add temp2, temp1
    adc temp3, null

    sts ram_data_address,   temp2
    sts ram_data_address+1, temp3

    ret


Das ist alles an die Source von Ulrich Radig angelehnt, bzw. anfangs.
Da ich nicht immer verstanden hab, wasser da (in C) macht, hab ich
nochmal neu angefangen, selbst durchdachter.

Also: MBR ist Sektor 0.
Den lad ich mir.
Dann schau ich bei Offset 1BE (Anfang Partitionsinfo Part. 0) + 8 = 1C6
= Sektors between...
Die werden bei mir direkt als VBR-Adresse abgelegt.

Dann les ich den VBR aus (mit der vorher geholten Adresse).

Die FAT fängt dann an: VBR + Reserved_Sectors. Also lad ich mit die
Reserved Sectors udn addier die. Bei meiner 32er sinds nur 2.

Dann lad ich (immernoch aus dem VBR) sec per fat, sollte ich mal
nachschaun, was das ist. Wohl so wie Rufus das meint. Die x2 und auf
die FAT-Adresse drauf, das ergibt den Root.

Dannnn noch schaun, wieviel im Root maximal drin sein kann, sind
normalerweise 512 Einträge, das rechne ich auch wärend des kompilierens
(sonst halt aussem VBR holen) und jeder Eintrag hat 32byte:
512 * 32 / 512... 512 kürzt sich raus, bleiben 32 übrig.
32Sektoren Root-Directory, wird addiert. Da fangen deine Daten an.

dave

von Alexander (Gast)


Lesenswert?

OK, Danke.
Werde mir das in einer ruhigen Stunde zu Gemüte führen.

Gruß Alex

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.