-
Notifications
You must be signed in to change notification settings - Fork 2
FAT32
- FAT32 disko struktūra
- Įkrovos sektoriaus (Boot block arba Boot sector) struktūra/pavyzdys
- Klasteris (Cluster arba Allocation unit)
- Failų lokacijos lentelė (File allocation table arba FAT)
- Šakninis katalogas (Root directory)
- Failo įrašo struktūra
- Ilgų failo pavadinimų (Long File Name, LFN) įrašai
- Nuorodos
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.
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, |
| 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)
| 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ė) |
| 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į |
| 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
tai to failo pirmas duomenų įrašas yra 0x08BB2D=572.205 klasteryje 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ą 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 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.# 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
* 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/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)