Skip to content
blahlt edited this page Aug 9, 2013 · 5 revisions

Turinys

FAT32 disko struktūra

* Rezervuoti sektoriai (Reserved sectors) * Įkrovos sektorius (Boot block arba Boot sector) * Kiti rezervuoti sektoriai * Failų lokacijos lentelė (File Allocation Table, gali būti kelios kopijos, dažniausiai dvi) * Šakninio katalogo pirmas klasteris (Root directory) * Failų duomenų sritis * Nepanaudota sritis

Pastaba: Baitų sekoje pirmas baitas yra mažiausias baitas (LSB, least significant byte), o paskutinis baitas - aukščiausias baitas (MSB, most significant byte). Pavyzdžiui, jei turim baitų seką 5E 49 FF 1D tai bendrą jų reikšmė reikia laikyti 0x1DFF495E, o ne 0x5E49FF1D.

Įkrovos sektoriaus (Boot block arba Boot sector) struktūra/pavyzdys

Pastaba: Nemaišyti su MBR (Master Boot Record), kuris yra panašus ir yra pačioje disko pradžioje. MBR sudaro įkrovos instrukcijos, particijų lentelė ir parašas (0x55 0xAA). Plačiau

Postūmis10 Postūmis8 Užimama vieta baitais Reikšmės pavyzdys Aprašymas
0 0x000 3 EB 58 90 Instrukcija vykdanti užkrovimo kodą
3 0x003 8 4D 53 44 4F 53 35 2E 30 OEM pavadinimas
11 0x00B 2 00 02 Baitai sektoriuje
13 0x00D 1 08 Sektoriai klasteryje
14 0x00E 2 30 03 Rezervuoti sektoriai
16 0x010 1 02 FAT lentelių kiekis
17 0x011 2 00 00 Maksimalus šakninio katalogo įrašų skaičius
19 0x013 2 00 00 Sektorių kiekis diske
21 0x015 1 F8 Įrenginio aprašas
22 0x016 2 00 00 FAT lentelės dydis sektoriais
24 0x018 2 3F 00 Sektorių kiekis takelyje
26 0x01A 2 FF 00 Galvų skaičius
28 0x01C 4 3F 00 00 00 Pasleptų sektorių skaičius
32 0x020 4 80 DF 79 00 Sektorių skaičius diske
36 0x024 4 68 1E 00 00 FAT dydis sektoriais
40 0x028 2 00 00
42 0x02A 2 00 00 Failų sistemos versija
44 0x02C 4 02 00 00 00 Šakninio katalogo pirmas klasteris
48 0x030 2 01 00 Failų sistemos informacinių sektorių skaičius
50 0x032 2 06 00 Įkrovos sektoriaus atsarginės kopijos sektoriaus numeris
52 0x034 12 00 00 00 00 00 00 00 00 00 00 00 00 Rezervuoti baitai ateičiai
64 0x040 1 80 Fizinio disko numeris
65 0x041 1 00 Rezervuotas baitas
66 0x042 1 29 Papildomas įkrovos parašas
67 0x043 4 F3 FF 2F A0 Disko serijos numeris
71 0x047 11 4E 4F 20 4E 41 4D 45 20 20 20 20 Disko pavadinimas
82 0x052 8 46 41 54 33 32 20 20 20 Failų sistemos ID
90 0x05A 420 33 C9 8E D1 BC F4 7B 8E C1 8E D9 BD 00 7C 88 4E 02 8A 56 40 B4 41 BB AA 55 CD 13 72 10 81 FB 55 AA 75 0A F6 C1 01 74 05 FE 46 02 EB 2D 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 2C 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 80 7E 02 00 0F 84 20 00 66 6A 00 66 50 06 53 66 68 10 00 01 00 B4 42 8A 56 40 8B F4 CD 13 66 58 66 58 66 58 66 58 EB 33 66 3B 46 F8 72 03 F9 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 75 FF 81 C3 00 02 66 40 49 75 94 C3 42 4F 4F 54 4D 47 52 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 00 00 00 00 00 00 00 0D 0A 52 65 6D 6F 76 65 20 64 69 73 6B 73 20 6F 72 20 6F 74 68 65 72 20 6D 65 64 69 61 2E FF 0D 0A 44 69 73 6B 20 65 72 72 6F 72 FF 0D 0A 50 72 65 73 73 20 61 6E 79 20 6B 65 79 20 74 6F 20 72 65 73 74 61 72 74 0D 0A 00 00 00 00 00 AC CB D8 00 00 Įkrovos instrukcijos,? particijų informacija ?
510 0x1FE 2 55 AA Krovimo sektoriaus pabaigos parašas
  • **Instrukcija vykdanti užkrovimo kodą** (0xEB 0x58 0x90 = JMP 0059 NOP, toliau vykdys kodą esantį 0x005A vietoje (JMP_Adresas + 2 + Sekancio_Baito_Reiksme = Kitos_Instrukcijos_Adresas, 0x0000 + 0x0002 + 0x0058 = 0x005A))

  • **OEM pavadinimas** (0x4D 0x53 0x44 0x4F 0x53 0x35 0x2E 0x30 = 'MSDOS5.0')

  • **Baitai sektoriuje** (0x0200 = 512 baitai)

  • **Sektoriai klasteryje** (Sectors per cluster, sectors per allocation unit, 0x08 = 8 sektoriai sudaro klasterį)

  • **Rezervuoti sektoriai** (Sektoriai esantys prieš pirmąją FAT lentelę (0x0330 = 816 rezervuoti sektoriai, įskaitant įkrovos sektorių))

  • **FAT lentelių kiekis** (0x02 = 2 FAT lentelės)

  • **Maksimalus šakninio katalogo įrašų skaičius** (FAT32 šakninio katalogo įrašams vieta išskiriama dinamiškai, todėl visada 00 00)

  • **Sektorių kiekis diske** (Reikšmė 00 00 (FAT32 visada) jei diskas turi daugiau nei 65.535 sektorius ir tada reikia žiurėti į 0x0020 postūmio reikšmę)

  • **Įrenginio aprašas** (0xF8 - kietasis diskas, 0xF0 - 3.5 colio diskas ir t.t.)

  • **FAT lentelės dydis sektoriais** (FAT32 visada 00 00)

  • **Sektorių kiekis takelyje** (0x003F = 63)

  • **Galvų skaičius** (Number of Heads, 0x00FF = 255)

  • **Pasleptų sektorių skaičius** (Sektoriai esantys prieš įkrovos sektorių, 0x0000003F = 63 sektoriai)

  • **Sektorių skaičius diske** (0x0079DF80 = 7.987.072)

  • **FAT dydis sektoriais** (0x00001E68 = 7.784)

  • **Šakninio katalogo pirmas klasteris** (0x00000002 = 2 - antrame klasteryje prasideda šakninis katalogas)

  • **Failų sistemos informacinių sektorių skaičius** (0x0001 = 1 sektorius skirtas informacijai apie failų sistemą)

  • **Įkrovos sektoriaus atsarginės kopijos sektoriaus numeris** (0x0006 = 6 sektoriuje yra krovimo sektoriaus atsarginė kopija)

  • **Fizinio disko numeris** (0x80 - kietasis diskas, 0x00 - diskelis ir t.t.)

  • **Disko serijos numeris** (atsitiktinis skaičius)

  • **Disko pavadinimas** (Nebenaudojamas, disko pavadinimas nurodomas specialiame faile, kuris yra šakniniame kataloge, 0x4E 0x4F 0x20 0x4E 0x41 0x4D 0x45 0x20 0x20 0x20 0x20 = 'NO NAME ')

  • **Failų sistemos ID** (0x46 0x41 0x54 0x33 0x32 0x20 0x20 0x20 = 'FAT32 ')

  • **Krovimo sektoriaus pabaigos parašas** (Visada 55 AA)

Klasteris (Cluster arba Allocation unit)

Klasteris - sektorių grupė.

Failų lokacijos lentelė (File allocation table arba FAT)

FAT aprašo kiekvieną klasterį diske (arba particijoje, jei diskas suskaldytas (partitioned)) ir prasideda iškarto po rezervuotų sektorių (0x001C reikšmė nurodo sektorių kur prasideda FAT duomenys). FAT turi 32 bitų (4 baitų) (FAT32 atveju) įrašus, kurie nurodo failo pabaigą, failo duomenų tęsinio klasterį (jei failas užima daugiau nei vieną klasterį), blogus sektorius (bad sectors, ištikrųjų kaip blogas yra pažymimas visas klasteris) arba laisvą klasterį (free cluster, laisva vieta į kurią galima rašyti failo duomenis).

FAT įrašų reikšmės

Reikšmė Aprašymas
0x#0000000 laisvas klasteris
0x0001 rezervuotas klasteris
0x0002 - 0xFFF0 užimtas klasteris. Reikšmė nurodo sekantį duomenų klasterio numerį
0x#FFFFFF7 sugadintas klasteris (pažymimas, jei klasteryje yra sugadintų sektorių (bad sectors))
0x#FFFFFF8 - 0x#FFFFFFF klasterių grandinės pabaiga (EOF, End Of Clusterchain, paprastai naudojama 0x#FFFFFFF reikšmė)

FAT struktūra/pavyzdys

Postūmis10 Postūmis8 Užimama vieta baitais Reikšmės pavyzdys Aprašymas
0 0x00 4 F8 FF FF 0F Rezervuota
4 0x04 4 FF FF FF FF Rezervuota
8 0x08 4 FF FF FF 0F Įrašas apie 2 klasterį (konkrečiu atveju 0x0FFFFFFF reiškia šakninio katalogo klasterio pabaiga)
12 0x0C 4 04 00 00 00 Įrašas apie 3 klasterį, kurio reikšmė yra nuoroda į 4 klasterio įrašą (0x00000004 = 4)
16 0x10 4 FF FF FF 0F Įrašas apie 4 klasterį, kurio reikšmė - 0x0FFFFFFF yra klasterio grandinės pabaiga
20 0x14 4 00 00 00 00 Laisvas klasteris
# 0x## 4 ## ## ## ## Irašas apie # klasterį

Šakninis katalogas (Root directory)

Šakniniame kataloge aprašomi failai (katalogai irgi yra failai tik turintys katalogo žymenį) nesantys jokiame kataloge (esantys auksčiausiame (top level) failų sistemos kataloge, kuris atvaizduojamas kaip diskas).

Failo įrašo struktūra

Failus (katalogus) aprašo 32 baitų įrašai.
Postūmis10 Postūmis8 Užimama vieta baitais Aprašymas
0 0x00 8 Failo pavadinimas (Pirmas baitas aprašo failo būseną: 0x00 - failo pavadinimas nenaudojamas, 0xE5 - failo pavadinimas buvo naudojamas, bet failas pašalintas, 0x05 - pirmas failo pavadinimo simbolis yra 0xE5, 0x2E - esamo katalogo žymuo (jei antras baitas irgi 0x2E tai įrašas apie tėvinį (parent) katalogą. Jei tėvinis katalogas yra šakninis katalogas) tai pirmo katalogo klasterio numerio reikšmė bus 00 00, bet koks kitas simbolis yra realus failo pavadinimo simbolis). Jei failo pavadinimas trumpesnis nei 8 simboliai - tuščia vieta užpildoma tarpo simboliais (0x20).
8 0x08 3 Failo pavadinimo išplėtimas (taško simbolis nėra saugomas). Jei išplėtimas trumpesnis nei 3 simboliai tai tuščia vieta užpildoma tarpo simboliais (0x20)
11 0x0B 1 Failo atributai
12 0x0C 1 Rezervuotas baitas WindowsNT (visada 0)
13 0x0D 1 Sukūrimo laikas (dešimtosios sekundės dalys, 0 - jei nenaudojama)
14 0x0E 2 Sukūrimo laikas (valandos, minutes ir minutės, 0 - jei nenaudojama)
16 0x10 2 Sukūrimo data
18 0x12 2 Paskutinio kreipimosi data (Last accessed date, 0 - jei nenaudojama)
20 0x14 2 Išplėstiniai atributai (rezervuoti OS/2, visada 0), kur aukštestnieji žodžio (Hight word) bitai kartu su 0x001A nurodo pirmąjį failo klasterį
22 0x16 2 Paskutinio rašymo į failą laikas
24 0x18 2 Paskutinio rašymo į failą data
26 0x1A 2 Failo duomenų pirmo klasterio numeris
28 0x1C 4 Failo dydis bitais
*

Failo atributai

Bitas Bito kaukė (Bitmask) Aprašymas
0 0x01 Tik skaitymui (ReadOnly)
1 0x02 Paslėptas (Hidden)
2 0x04 Sistemonis (System)
3 0x08 Disko žymuo (Volume Label)
4 0x10 Katalogas (Subdirectory)
5 0x20 Suarchyvuotas (Archive)
6 0x40 Įrenginys (Device)
7 0x80 Rezervuotas bitas, nekeičiamas
  • Failo duomenų pirmo klasterio apskaičiavimas: jei failo įrašas atrodo taip

    # 0 1 2 3 4 5 6 7 8 9 A B C D E F
    0x00 41 20 20 20 20 20 20 20 54 58 54 20 18 97 D2 8D
    0x10 8E 42 8E 42 08 00 B8 8D 8E 42 2D BB 01 00 00 00
    tai to failo pirmas duomenų įrašas yra 0x08BB2D=572.205 klasteryje

    Failo sukūrimo algoritmas

    1. Surandam pirmą laisvą įrašą kataloge ir įrašom failo pavadinimą 2. Failų lokacijos lentelėje surandamas laisvas klasteris ir nustatoma failo pabaiga (EOF, reikšmė - 0x0FFFFFFF) 3. Į failo įrašą kataloge įrašom klasterio numerį 4. Jei failas netilpo į vieną klasterį * Surandam laisvą vietą failų lokacijos lentelėje * Nustatom reikšmę į 0x0FFFFFFF (failo pabaiga) * Pakeičiam ankstesnio įrašo reikšmę naujo klasterio numeriu * Kartojam 4. žingsnį kol įrašom visą failą

    Failo naikinimo algoritmas

    1. Kataloge surandam naikinamo failo įrašą 2. Pradedant pirmuoja klasterio reikšme FAT lentelėje nustatome nulius visai klasteriu grandinei 3. Atlaisvinam įrašą kataloge pakeičiant pirmąjį baitą 0xE5 reikšme

    Ilgų failo pavadinimų (Long File Name, LFN) įrašai

    Ilgi (daugiau nei 8 simboliai failo pavadinimui ir/ar daugiau nei 3 simboliai failo išplėtimui) failų pavadinimų irašai saugomi kaip ir paprastų failų irašai, 32 baitų įrašais kataloguose, tik skiriasi jų struktūra. Sukuriant failą su ilgu pavadinimu pirmiausia kataloge yra sukuriami ilgų pavadinimų failų įrašai ir po to paprastai failo įrašas.

    Ilgų failo pavadinimų įrašo struktūra

    Postūmis10 Postūmis8 Užimama vieta baitais Aprašymas
    0 0x00 1 Sekos numeris ir statusas
    1 0x01 10 Failo pavadinimo simboliai (5 unicode simboliai)
    11 0x0B 1 Failo atributai
    12 0x0C 1 Rezervuotas baitas (visada - 0x00)
    13 0x0D 1 Kontrolinė suma
    14 0x0E 12 Failo pavadinimo simboliai (6 unicode simboliai)
    26 0x1A 2 Rezervuoti baitai (visada - 0x0000)
    28 0x1E 4 Failo pavadinimo simboliai (2 unicode simboliai)
    * http://en.wikipedia.org/wiki/File_Allocation_Table * http://technet.microsoft.com/en-us/library/cc776720%28v=ws.10%29.aspx * http://technet.microsoft.com/en-us/library/cc938438.aspx * http://www.tavi.co.uk/phobos/fat.html * http://cs.nyu.edu/courses/spring13/CSCI-UA.0202-002/kholodov-fat.html * http://www.codeguru.com/cpp/cpp/cpp_mfc/files/article.php/c13809/Extract-Floppy-Disk-Geometry-from-the-Boot-Sector.htm * http://www.codeguru.com/cpp/cpp/cpp_mfc/files/article.php/c13831/FAT-Root-Directory-Structure-on-Floppy-Disk-and-File-Information.htm * http://www.codeguru.com/cpp/cpp/cpp_mfc/files/article.php/c13907/Long-File-Name-LFN-Entries-in-the-FAT-Root-Directory-of-Floppy-Disks.htm * http://www.maverick-os.dk/FileSystemFormats/VFAT_LongFileNames.html * http://www.pjrc.com/tech/8051/ide/fat32.html * http://web.archive.org/web/20090105222122/http://www.teleport.com/~brainy/fat32.htm * http://web.archive.org/web/20080830051327/http://www.teleport.com/~brainy/diskaccess.htm * http://www.embedded-code.com/manuals/secure-digital-card-driver/category/layout-of-a-mmc-or-sd-card-with-fat * http://codeandlife.com/2012/04/25/simple-fat-and-sd-tutorial-part-3/

Clone this wiki locally