GRAS

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 18 iunie 2022; verificările necesită 2 modificări .

FAT ( în engleză  File Allocation Table "file allocation table") este o arhitectură clasică de sistem de fișiere , care, datorită simplității sale, este încă utilizată pe scară largă pentru unitățile flash . Folosit în dischete , carduri de memorie și alte medii de stocare. Anterior, era folosit și pe hard disk-uri.

Dezvoltat de Bill Gates și Mark McDonald în 1976-1977 [1] [2] . A fost folosit ca sistem de fișiere principal în sistemele de operare ale familiilor MS-DOS și Windows 9x .

Structura FAT urmează standardul ECMA-107 și este definită în detaliu de specificația oficială Microsoft cunoscută sub numele de FATGEN [3] .

Versiuni ale sistemului FAT

Există patru versiuni de FAT - FAT12 , FAT16 , FAT32 și exFAT (FAT64) . Ele diferă prin bitness al înregistrărilor din structura discului, adică numărul de biți rezervați pentru stocarea numărului clusterului. FAT12 este folosit în principal pentru dischete , FAT16 pentru discuri mici. Pe baza FAT, a fost dezvoltat un nou sistem de fișiere exFAT (FAT extins), utilizat în principal pentru unități flash .

Inițial, FAT nu a acceptat un sistem de directoare ierarhice - toate fișierele erau localizate la rădăcina discului. Acest lucru a fost făcut pentru simplitate, deoarece pe dischetele cu o singură față cu o capacitate de numai 160–180 KB, pur și simplu nu avea sens să sortați câteva fișiere în directoare. Odată cu răspândirea dischetelor de 320 sau mai mulți kiloocteți, stocarea tuturor fișierelor în rădăcină s-a dovedit a fi incomod, în plus, dimensiunea mică a directorului rădăcină a limitat numărul de fișiere de pe disc. Directoarele au fost introduse odată cu lansarea MS-DOS 2.0.

Diferite sisteme de operare au implementat și diverse extensii FAT. De exemplu, DR-DOS are atribute suplimentare de acces la fișiere; în Windows 95 , Linux  - suport pentru nume lungi de fișiere (LFN) în format Unicode (Virtual FAT - VFAT); pe OS/2  , atributele extinse ale tuturor fișierelor.

VFAT

VFAT  este o extensie FAT introdusă în Windows 95 . În FAT, numele fișierelor sunt în format 8.3 și constau numai din caractere ASCII . Suportul pentru nume de fișiere lungi (până la 255 de caractere) ( Nume lung de fișier, LFN ) în codificarea UTF-16LE a fost adăugat la VFAT ,  în timp ce LFN-urile sunt stocate simultan cu nume în format 8.3, numit retrospectiv SFN ( Nume scurt fișier în engleză ). LFN-urile nu țin cont de majuscule atunci când caută în sus, totuși, spre deosebire de SFN-urile, care sunt stocate cu majuscule, LFN-urile păstrează majusculele specificate când fișierul a fost creat [4] [5] .  

Structura sistemului FAT

În sistemul de fișiere FAT, sectoarele de disc învecinate sunt combinate în unități numite clustere . Numărul de sectoare dintr-un cluster este egal cu o putere de doi (vezi mai jos). Un număr întreg de clustere (cel puțin unul) este alocat pentru stocarea datelor fișierului, deci, de exemplu, dacă dimensiunea fișierului este de 40 de octeți și dimensiunea clusterului este de 4 KB, doar 1% din spațiul alocat pentru acesta va fi de fapt ocupat de informațiile fișierului. Pentru a evita astfel de situații, este recomandabil să reduceți dimensiunea clusterelor și invers să reduceți cantitatea de informații despre adrese și să creșteți viteza operațiunilor cu fișierele. În practică se alege un compromis. Deoarece capacitatea discului s-ar putea să nu fie exprimată într-un număr întreg de clustere, de obicei, la sfârșitul volumului există așa-numitele sectoare excedentare - un „restul” mai mic decât dimensiunea unui cluster, care nu poate fi alocat de sistemul de operare pentru stocarea informațiilor.

Spațiul de volum FAT32 este împărțit în mod logic în trei zone adiacente:

FAT12 și FAT16 au și o zonă dedicată pentru directorul rădăcină. Are o poziție fixă ​​(imediat după ultimul element al tabelului FAT) și o dimensiune fixă ​​în elemente de 32 de octeți, adică atunci când se descrie în Partition Boot Record, tocmai numărul de elemente de 32 de octeți este indicat. , fiecare dintre acestea descriind orice element al directorului rădăcină (fie el fișier sau alt subdirector).

Dacă un cluster aparține unui fișier, atunci celula corespunzătoare din tabelul FAT conține numărul următorului cluster din același fișier. Dacă celula corespunde ultimului cluster al fișierului, atunci conține o valoare specială (0xFFFF pentru FAT16). Astfel, se construiește un lanț de clustere de fișiere. Zerourile corespund clusterelor neutilizate din tabel. Clusterele „rele” (care sunt excluse de la procesare, de exemplu, deoarece zona corespunzătoare a dispozitivului este ilizibilă) au și un cod special (0xFFF7 pentru FAT16).

Când un fișier este șters, primul caracter al numelui este înlocuit cu codul special 0xE5, iar lanțul de cluster al fișierului din tabelul de alocare este resetat la zero. Deoarece informațiile despre dimensiunea fișierului (care se află în directorul de lângă numele fișierului) rămân intacte, dacă clusterele de fișiere au fost localizate secvențial pe disc și nu au fost suprascrise cu informații noi, fișierul șters poate fi restaurat.

Înregistrare de pornire

Prima structură a unui volum FAT se numește BPB ( BIOS  parameter block ) și se află într-o zonă rezervată, în sectorul zero. Această structură conține informații care identifică tipul de sistem de fișiere și caracteristicile fizice ale suportului (dischetă sau partiția hard disk).

BIOS Parameter Block (BPB)

BPB a lipsit din FAT, care a servit MS-DOS 1.x, deoarece la acel moment erau presupuse doar două tipuri diferite de volume - dischete cu o singură față și două fețe de 320 KB, iar formatul de volum era determinat de primul octet al zonei FAT. BPB a fost introdus în MS-DOS 2.x la începutul anului 1983 ca o structură obligatorie a sectorului de pornire din care să se determine formatul de volum de acum înainte; vechea schemă de detectare a primului octet FAT nu mai era acceptată. Tot în MS-DOS 2.0 a fost introdusă o ierarhie de fișiere și foldere (înainte de aceasta, toate fișierele erau stocate în directorul rădăcină).

Structura BPB din MS-DOS 2.x conținea un câmp „număr total de sectoare” de 16 biți, ceea ce însemna că această versiune de FAT era fundamental inaplicabilă pentru volume mai mari de 2 16 = 65.536 de sectoare, adică mai mult de 32 MB cu o dimensiune standard a sectorului de 512 octeți. În MS-DOS 4.0 (1988), câmpul BPB a fost extins la 32 de biți, ceea ce a însemnat o creștere a dimensiunii volumului teoretic la 232 = 4.294.967.296 de sectoare, adică până la 2 TB cu un sector de 512 octeți.

Următoarea modificare a BPB a apărut cu Windows 95 OSR2, care a introdus FAT32 (în august 1996). Limita de 2 TB privind dimensiunea volumului a fost eliminată, un volum FAT32 poate avea, teoretic, o dimensiune de până la 8 TB. Cu toate acestea, dimensiunea fiecărui fișier individual nu poate depăși 4 GB. Blocul de parametri BIOS din FAT32, pentru compatibilitate cu versiunile anterioare de FAT, repetă BPB-ul FAT16 până la și inclusiv câmpul BPB_TotSec32, urmat de diferențe.

„Sectorul de pornire” FAT32 este de fapt trei sectoare de 512 octeți - sectoarele 0, 1 și 2. Fiecare dintre ele conține semnătura 0xAA55 la adresa 0x1FE, adică în ultimii doi octeți, dacă dimensiunea sectorului este de 512 octeți. Dacă dimensiunea sectorului este mai mare de 512 octeți, atunci semnătura este conținută atât la adresa 0x1FE, cât și în ultimii doi octeți ai sectorului zero, adică este duplicat.

FSInfo

Înregistrarea de pornire a unei partiții FAT32 conține o structură numită FSInfo , care este utilizată pentru a stoca valoarea numărului de cluster liber al volumului. FSInfo, de regulă, ocupă sectorul 1 (vezi câmpul BPB_FSInfo) și are următoarea structură (adrese relativ la începutul sectorului):

  • FSI_LeadSig. Semnătura de 4 octeți 0x41615252 indică faptul că sectorul este utilizat pentru structura FSInfo.
  • FSI_Rezervat1. Intervalul de la 4 la 483 de octeți ai sectorului, inclusiv, este resetat la zero.
  • FSI_StrucSig. O altă semnătură se află la 0x1E4 și conține valoarea 0x61417272.
  • FSI_Free_Count. Câmpul de 4 octeți de la adresa 0x1E8 conține ultimul număr de clustere libere de pe volumul cunoscut de sistem. Valoarea 0xFFFFFFFF înseamnă că numărul de clustere libere este necunoscut și trebuie calculat.
  • FSI_Nxt_Free. Câmpul de 4 octeți de la adresa 0x1EC conține numărul clusterului de la care ar trebui să înceapă căutarea clusterelor libere în tabelul de indicatori de index. De obicei, acest câmp conține numărul ultimului cluster FAT alocat pentru stocarea fișierelor. Valoarea 0xFFFFFFFF înseamnă că căutarea unui cluster liber trebuie efectuată chiar de la începutul tabelului FAT, adică din cel de-al doilea cluster.
  • FSI_Rezervat2. Câmp rezervat de 12 octeți la adresa 0x1F0.
  • FSI_TrailSig. Semnătura 0xAA550000 este ultimii 4 octeți ai sectorului FSInfo.

Scopul introducerii FSInfo este de a optimiza funcționarea sistemului, deoarece în FAT32 tabelul de indicatori de index poate fi foarte mare, iar căutarea sa octet cu octet poate dura considerabil. Cu toate acestea, este posibil ca valorile câmpurilor FSI_Free_Count și FSI_Nxt_Free să nu corespundă realității și ar trebui verificate pentru adecvare. În plus, acestea nu sunt nici măcar actualizate în backup-ul FSInfo, care se află de obicei în sectorul 7.

Determinarea tipului de volum FAT

Determinarea tipului FAT al unui volum (adică alegerea între FAT12, FAT16 și FAT32) este făcută de sistemul de operare pe baza numărului de clustere din volum, care, la rândul său, este determinat din câmpurile BPB. În primul rând, se calculează numărul de sectoare ale directorului rădăcină:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

În continuare, se determină care dintre câmpurile BPB_FATSz16/32 și BPB_TotSec16/32 nu sunt egale cu zero și sunt utilizate pentru determinarea numărului de sectoare ale zonei de date de volum:

DataSec = TotSec - (BPB_ResvdSecCnt + (BPB_NumFATs * FATSz) + RootDirSectors)

În cele din urmă, se determină numărul de clustere de zone de date:

CountofClusters = DataSec / BPB_SecPerClus

După numărul de clustere, există o corespondență unu-la-unu cu sistemul de fișiere:

  • CountofClusters < 4085 - FAT12
  • CountofClusters = 4085 ÷ 65524 - FAT16
  • CountofClusters > 65524 - FAT32

Conform specificației oficiale, aceasta este singura modalitate validă de a determina tipul FAT. Crearea artificială a unui volum care încalcă regulile de mapare specificate va face ca acesta să fie gestionat incorect de Windows. Cu toate acestea, se recomandă evitarea valorilor CountofClusters care sunt apropiate de valorile critice (4085 și 65525) pentru a determina corect tipul sistemului de fișiere de către orice driver, adesea scris incorect.

FAT12 este întotdeauna creat pe o dischetă atunci când este formatat . În ceea ce privește hard disk-urile și unitățile flash , apoi cu o dimensiune a unității de până la 512 MB (cu un sector de 512 octeți), FAT16 este creat implicit, peste 512 MB - FAT32. Mărimea clusterului este determinată în timpul formatării pe baza sistemului de fișiere și a dimensiunii volumului.

Numărul de serie al volumului

Numărul de serie al volumului (câmpul BS_VolID) în Windows 98 este creat din formatul de dată și oră, astfel încât să fie imposibil să le restaurați fără informații suplimentare.

Tabel FAT

Următoarea structură importantă a unui volum FAT este tabelul FAT în sine, care ocupă o zonă logică separată. Acesta definește o listă (lanț) de clustere care găzduiesc fișierele și folderele volumului. Există o corespondență unu-la-unu între clustere și pointerii index ai tabelului - al N-lea pointer corespunde clusterului cu același număr. Primului cluster al zonei de date i se atribuie numărul 2. Valoarea pointerului index corespunde stării clusterului corespunzător. Sunt posibile următoarele stări:

  • clusterul este liber — indicatorul este pus la zero;
  • clusterul este ocupat de un fișier și nu este ultimul cluster de fișiere — indicatorul conține numărul următorului cluster de fișiere;
  • clusterul este ultimul cluster al fișierului — indicatorul conține eticheta EOC (End Of Clusterchain), a cărei valoare depinde de versiunea FAT: pentru FAT12, eticheta EOC este orice valoare mai mare sau egală cu 0x0FF8 (0x0FFF prin Mod implicit); pentru FAT16 — mai mare sau egal cu 0xFFF8 (implicit 0xFFFF); pentru FAT32, orice valoare mai mare sau egală cu 0x0FFFFFF8 (0x0FFFFFFF implicit);
  • clusterul este corupt — pointerul conține o etichetă specială, a cărei valoare este 0x0FF7 pentru FAT12, 0xFFF7 pentru FAT16 și 0x0FFFFFF7 pentru FAT32. Un cluster deteriorat nu poate fi folosit de sistemul de fișiere pentru stocarea datelor; pointerii corespunzătoare nu sunt afectați la formatarea volumului, când toate celelalte pointere sunt setate la zero;
  • clusterul este rezervat „pentru standardizare viitoare” - indicatorul conține o valoare mai mare decât CountofClusters, dar mai mică decât eticheta clusterului deteriorat (adică până la și inclusiv 0xFFF6 pentru FAT16). În acest caz, clusterul, care nu corespunde niciunei date reale, este considerat ocupat și este omis la căutarea unuia gratuit, dar nu sunt furnizate alte informații despre acesta.

Clusterele 0 și 1 sunt reflectate separat de FAT. Pointerul index corespunzător clusterului zero (primul indicator al tabelului FAT) conține valoarea BPB_Media în cei 8 biți inferiori; biții rămași sunt setați la 1. De exemplu, dacă BPB_Media = 0xF8 (hard disk), FAT[0] = 0x0FFFFFF8 pentru FAT32. Astfel, în mod formal FAT[0] = EOC, care este utilizat la procesarea fișierelor de dimensiune zero (vezi mai jos).

Al doilea indicator rezervat, FAT[1], este setat la valoarea marcajului EOC la formatare. În FAT12, nu mai este utilizat în niciun fel, iar în FAT16 și FAT32, cei doi biți superiori ai acestui indicator pot conține un semn despre necesitatea verificării volumului (așa-numitul „ bit murdar ”) și toate celelalte biții sunt setați la 1. Prezența unui bit murdar este verificată în timpul procesului de pornire Windows programului autochk.exe. Bitul murdar este generat atunci când volumul nu este demontat corespunzător sau când suportul media are o eroare hardware și, în consecință, ia două valori posibile.

Un pointer index FAT32 este, prin definiție, de 32 de biți, dar primii 4 biți sunt de fapt ignorați, deci valoarea indicatorului este, de fapt, de 28 de biți. Singura operație care operează pe primii 4 biți ai indicatorului este formatarea volumului, care resetează întregul indicator. Aceasta înseamnă că, de exemplu, valorile pointerului 0x10000000, 0xF0000000 și 0x00000000 corespund tuturor unui cluster liber, deoarece diferă doar în primii 4 biți.

Valoarea dimensiunii tabelului BPB FAT, adică BPB_FATSz16/32, poate fi mai mare decât cea reală, astfel încât pot exista sectoare la sfârșitul fiecărui tabel FAT care să nu corespundă niciunui cluster de date reale. În timpul formatării, aceste sectoare sunt resetate la zero, iar în timpul funcționării volumului, nu sunt utilizate în niciun fel. Prin urmare, adresa reală a ultimului sector al tabelului FAT, care conține pointeri către clustere de volum real, trebuie întotdeauna calculată din numărul total de clustere de zone de date, și nu din câmpul BPB_FATSz16/32. În plus, ultimul sector ocupat de tabelul FAT nu este neapărat ocupat complet de acesta - în acest caz, spațiul în exces al sectorului nu este, de asemenea, utilizat și este umplut cu zerouri la formatarea volumului.

Înregistrările fișierului

Imediat după sfârșitul ultimului tabel FAT este o zonă de date care conține fișiere și foldere. Un director FAT este un fișier obișnuit marcat cu un atribut special. Datele (conținutul) unui astfel de fișier în orice versiune FAT sunt un lanț de înregistrări de fișiere de 32 de octeți (înregistrări de director). Un director nu poate conține în mod normal două fișiere cu același nume. Dacă programul de verificare disc găsește o pereche creată artificial de fișiere cu nume identic în același director, unul dintre ele este redenumit.

Director rădăcină

Singurul director care trebuie să fie prezent este directorul rădăcină. În FAT12/FAT16, directorul rădăcină are o dimensiune fixă ​​în sectoare, care este calculată din valoarea lui BPB_RootEntCnt și urmează tabelul FAT de pe disc.

În FAT32, directorul rădăcină, ca oricare altul, are o dimensiune variabilă și este un lanț de clustere. Numărul primului cluster de director rădăcină este reflectat de BPB_RootClus. Directorul rădăcină diferă de alte directoare de pe un volum FAT în următoarele moduri:

  • nu are marcaje de dată și oră;
  • fără nume propriu (cu excepția „\”);
  • nu conține fișiere numite „.” și „..” (vezi mai jos);
  • este singurul director care poate conține în mod normal un fișier cu etichete de volum (vezi mai jos).
Structura unei înregistrări de fișier

O înregistrare de fișier FAT32 constă din următoarele structuri:

  • DIR_Nume. Câmpul de 11 octeți de la adresa relativă 0 conține numele scurt al fișierului (în conformitate cu standardul 8.3). Vedeți mai jos pentru numele fișierelor.
  • DIR_Attr. Octet la adresa 0x0B, responsabil pentru atributele fișierului.
  • DIR_NTres. Octet la adresa 0x0C, utilizat în Windows NT.
  • DIR_CrtTimeTenth. Octet la adresa 0x0D. Număr de zeci de milisecunde de timp de creare a fișierului, valorile valide sunt 0-199. Domeniul este adesea ignorat inutil.
  • DIR_CrtTime. 2 octeți la adresa 0x0E. Timpul de creare a fișierului cu precizie de 2 secunde.
  • DIR_CrtDate. 2 octeți la adresa 0x10. Data la care a fost creat fișierul.
  • DIR_LstAccDate. 2 octeți la adresa 0x12. Data ultimului acces la fișier (adică ultima citire sau scriere - în ultimul caz, este egală cu DIR_WrtDate). Nu există un câmp similar pentru timp.
  • DIR_FstClusHI. 2 octeți la adresa 0x14. Primul număr de grup al fișierului (cuvânt mare, zero pe un volum FAT12/FAT16).
  • DIR_WrtTime. 2 octeți la adresa 0x16. Ora ultimei înregistrări (modificări) a fișierului, de exemplu, crearea acestuia.
  • DIR_WrtDate. 2 octeți la adresa 0x18. Data ultimei înregistrări (modificări) a fișierului, inclusiv crearea.
  • DIR_FstClusLO. 2 octeți la adresa 0x1A. Numărul primului grup al fișierului (cuvânt scăzut).
  • DIR_FileSize. DWORD care conține valoarea dimensiunii fișierului în octeți. Limitarea fundamentală a FAT32 este că dimensiunea maximă permisă a fișierului este 0xFFFFFFFF (adică 4 GB minus 1 octet).

Dacă primul octet al unei intrări FAT (adică, DIR_Name[0]) conține 0xE5 sau 0x05, aceasta înseamnă că intrarea este liberă (fișierul corespunzător a fost șters). Zero în DIR_Name[0] înseamnă că nu numai această intrare este gratuită, ci și toate intrările ulterioare din director; Windows nu analizează restul unui director după o intrare zero.

Numele fișierului în FAT

Câmpul DIR_Name este împărțit logic în primele 8 caractere, care formează numele fișierului, și ultimele 3, care formează extensia. Perioada de separare este adăugată la nivel de sistem de operare și nu este stocată în câmpul de nume. Dacă numele și extensia fișierului nu umplu spațiul alocat pentru ele, octeții rămași din câmpul DIR_Name sunt umpluți cu spații (0x20). Numele și extensia fișierului pot conține orice combinație de litere, cifre sau caractere cu coduri ASCII mai mari de 127; caracterele speciale sunt împărțite în trei grupuri:

  • Permis: ! # $ % & () - @ ^ _ ` { } ~ '
  • Interzis: +.; =[]
  • Serviciu: * ? <: > / \ | "

Caracterele de serviciu au o semnificație specială în DOS și Windows și nu pot face parte dintr-un nume de fișier (semnele * ? sunt metacaractere , iar semnele : /\ sunt folosite ca separatori în căile de fișiere , alte caractere de serviciu și ilegale sunt caractere de control în interpretoarele de linie de comandă COMMAND. COM și cmd.exe ), în timp ce caracterele interzise pot fi încă incluse în numele fișierului cu prețul unei intrări LFN (vezi mai jos). De exemplu, un director cu un nume care începe cu un punct sau care conține mai multe puncte poate fi creat în modul linie de comandă ( mkdir .directory) sau în shell-uri precum FAR Manager , Total Commander , WinRAR . Numele fișierului nu poate începe sau se termină cu un spațiu; nu sunt permise caractere de control ASCII (adică 0x00-0x1F) în niciun octet al câmpului de nume, cu excepția cazului specificat mai sus a codului 5. Informațiile despre pagina de cod DOS curentă (la momentul creării fișierului) nu este salvate, deci accesul la fișierele ale căror nume conțin coduri naționale din ASCII extins (de exemplu, caractere chirilice din pagina de coduri 866 ), cu o pagină de coduri diferită, poate fi problematic sau imposibil (deoarece înainte de a căuta un fișier în director, acesta numele este convertit în majuscule în conformitate cu tabelul din pagina de coduri). Calea completă către fișier nu poate depăși 80 de octeți (3 este litera unității; 64 este calea; 12 este numele fișierului, inclusiv punctul de delimitare; 1 este semnul nul al terminalului).

Toate cele 8.3 caractere alfabetice ale numelui sunt întotdeauna traduse și stocate în câmpul DIR_Name cu litere mari. Octetul DIR_NTRes este folosit pentru a păstra majusculele originale ale unui nume Windows NT : un 1 în bitul 3 spune ca numele să fie afișat cu litere mici; Bitul 4 este responsabil pentru extensie.Dacă numele sau extensia conține caractere din ambele cazuri, se creează o înregistrare LFN pentru un astfel de fișier (vezi mai jos). Windows 9x creează întotdeauna o intrare LFN pentru a păstra majusculele non-triviale ale numelui și ignoră câmpul DIR_NTRes. În consecință, numele aceluiași fișier, lipsit de o intrare LFN asociată, poate fi afișat de Windows 9x în întregime în majuscule, dar Windows NT (parțial) în litere mici.

Atributele fișierului

În octetul de atribut, primii doi biți sunt rezervați și trebuie întotdeauna setați la zero. Biții rămași sunt distribuiți în așa fel încât valoarea 0x01 să corespundă atributului „numai citire”, 0x02 - „ascuns”, 0x04 - „sistem”, 0x20 - „arhivat”. Un set de mai multe atribute este alcătuit prin însumarea valorilor de bază. Pe lângă aceste atribute standard, se folosesc următoarele: 0x10 - indică faptul că fișierul este un director (container pentru alte fișiere); 0x08 - ATTR_VOLUME_ID, un atribut special al unui fișier unic de dimensiune zero din directorul rădăcină, al cărui nume este considerat a fi o etichetă de volum. Limita de 11 caractere a etichetei de volum FAT este legată de dimensiunea câmpului DIR_Name. Dacă fișierul are READ_ONLY | ASCUNS | SISTEM | VOLUME_ID (valoare 0x0F), aceasta indică faptul că intrarea nu corespunde unui fișier separat, ci conține o parte dintr-un nume lung al altui fișier care nu se încadrează în cadrul 8.3 (vezi mai jos).

O atribuire artificială a unei valori diferite de zero celor doi biți superiori ai DIR_Attr este utilizată pentru a forma fișiere care nu pot fi șterse sau redenumite prin mijloace standard ale sistemului de fișiere fără formatare. Acest lucru este util, de exemplu, atunci când luptați împotriva virușilor Autorun.inf (programul Panda USB și AutoRun Vaccine). Pe de altă parte, virușii înșiși pot folosi același instrument. Valoarea DIR_Attr = 0x40 este rezervată pentru uz intern (dispozitiv).

Ce se întâmplă când este creat un director

Când un director este creat, DIR_FileSize = 0 este setat pentru „pe viață.” Mărimea conținutului directorului este determinată prin simpla urmărire a lanțurilor de clustere până la marcajul End Of Chain. Dimensiunea directorului în sine este limitată de sistemul de fișiere la 65.535 intrări de 32 de octeți (adică intrările de director din tabelul FAT nu pot depăși 2 MB). Această limită este menită să accelereze operațiunile cu fișiere și să permită diverselor utilitare să utilizeze un număr întreg de 16 biți (WORD) pentru a număra numărul de intrări dintr-un director (ca urmare, există o limită teoretică a numărului de fișiere dintr-un director - 65.535, cu condiția ca toate numele fișierelor să urmeze standardul 8.3). Directorului i se atribuie un cluster de zonă de date (cu excepția cazului în care este un director rădăcină FAT12/FAT16), iar câmpurile DIR_FstClusHI / DIR_FstClusLO sunt setate la valoarea acelui număr de cluster. O etichetă EOC este plasată în tabelul FAT pentru intrarea corespunzătoare acestui cluster, iar clusterul în sine este umplut cu zerouri. În continuare, sunt create două fișiere speciale, fără de care directorul FAT este considerat deteriorat (primele două intrări de 32 de octeți din zona de date cluster) - fișiere de dimensiune zero cu numele "." (un punct, identificatorul de director) și „..” (două puncte, indicatorul către directorul părinte). Marcajele de dată și oră ale acestor fișiere sunt setate la valorile pentru directorul însuși în momentul creării și nu sunt actualizate atunci când directorul se schimbă. Câmpurile DIR_FstClusHI / DIR_FstClusLO ale "." conțin valoarea numărului clusterului care îl conține, iar fișierul „..” - numărul primului cluster al directorului care îl conține pe cel dat. Astfel, fișierul "." se referă la directorul în sine, iar fișierul „..” se referă la clusterul inițial al directorului părinte; dacă directorul părinte este directorul rădăcină, clusterul inițial este considerat zero.

Ora și data

O ștampilă de dată pe doi octeți are următorul format:

  • biții 0-4 - ziua lunii, valorile 1-31 sunt permise;
  • biții 5-8 - luna anului, valorile 1-12 sunt permise;
  • biți 9-15 - an, numărând din 1980 ("MS-DOS epoch"), sunt posibile valori de la 0 la 127 inclusiv, adică 1980-2107.

Un marcaj temporal de doi octeți are următorul format:

  • biți 0-4 - contor de secunde (două fiecare), valorile valide sunt 0-29, adică 0-58 secunde;
  • biții 5-10 sunt minute, valorile valide sunt 0-59;
  • biții 11-15 sunt ore, valorile valide sunt 0-23.

Dintre marcajele de dată și oră, doar ora ultimei modificări (adică DIR_WrtTime și DIR_WrtDate) este critică, restul poate să nu fie acceptat de multe sisteme; atunci când se operează pe un fișier pe un astfel de sistem (de exemplu, în DOS sau Windows 3.1), aceste câmpuri sunt ignorate. FAT salvează marcajele de dată și oră în funcție de fusul orar local; atunci când se modifică, marcajele nu se schimbă.

Marcajele de timp pentru directoare sunt setate atunci când sunt create și nu se modifică atunci când fișierele noi sunt scrise într-un director, redenumite sau un nou cluster îi este alocat.

Data ultimei accesări a fișierului este actualizată de fiecare dată când este accesat, cum ar fi la vizualizarea proprietăților fișierului, la mutarea la alt volum (dar nu în interiorul volumului). Când copiați un fișier în Windows 98, data ultimei accesări a fișierului original este actualizată, dar nu și în Windows XP.

Data-ora modificării fișierului se schimbă ori de câte ori este scris conținut nou în zona de date (nu în înregistrarea fișierului). Cu alte cuvinte, data-ora modificării nu se schimbă atunci când atributele sunt modificate sau când fișierul este redenumit. Mutarea sau copierea unui fișier păstrează marca de modificare originală.

Data și ora creării sunt setate atunci când o înregistrare de fișier este alocată pentru un fișier nou care nu exista înainte. Cu alte cuvinte, atunci când un fișier este redenumit sau mutat, data și ora creării nu se modifică, dar atunci când este copiat, noul fișier primește o nouă ștampilă. Astfel, atunci când copiați un fișier pe Windows, acesta poate ajunge la o dată de creare care este ulterioară datei modificării.

Înregistrări LFN

Fișierele și directoarele cu nume lung (mai mare de 8.3) sunt tratate într-un mod special de sistemul de fișiere FAT. Structura unei înregistrări de 32 de octeți pentru un fișier cu un LFN (Nume lung de fișier) este diferită de o înregistrare obișnuită (SFN):

  • LDIR_Ord. Primul octet al unei intrări este folosit pentru a numerota intrările din set.
  • LDIR_Nume1. Câmpul de 10 octeți de la adresa 0x01 conține primele cinci caractere ale numelui fișierului (sau mai degrabă, partea din numele acestuia care este reflectată în această înregistrare LFN).
  • LDIR_Attr. Octetul de atribut la adresa 0x0B este 0x0F (ATTR_LONG_NAME).
  • LDIR_Type. Octetul de la adresa 0x0C este setat la zero și indică în plus că această intrare din tabelul FAT se referă la un fișier cu un nume lung.
  • LDIR_Chksum. Octetul de la adresa 0x0D conține suma de control SFN a aliasului fișierului corespunzătoare setului de înregistrări LFN.
  • LDIR_Nume2. Un câmp de 12 octeți la adresa 0x0E care conține caracterele de la 6 la 11 ale numelui fișierului.
  • LDIR_FstClusLO. Câmpul de 2 octeți de la adresa 0x1A este lipsit de sens în contextul unei înregistrări LFN și este setat la zero.
  • LDIR_Nume3. Un câmp de 4 octeți la adresa 0x1C care conține al 12-lea și al 13-lea caracter ale numelui fișierului.

Un set de intrări LFN dintr-un director FAT trebuie să fie întotdeauna asociat cu o intrare SFN obișnuită care este precedată fizic pe disc. Un set de înregistrări LFN găsit fără o înregistrare normală corespunzătoare este numit orfan , iar înregistrarea este considerată coruptă; un astfel de fișier este complet invizibil în versiunile mai vechi de MS-DOS/Windows.

Într-o succesiune de înregistrări LFN, fiecare dintre ele are propriul său număr de serie, determinat de primul octet (LDIR_Ord). Masca 0x40 indică faptul că această intrare este ultima din rândul de intrări LFN care o urmează (adică, de exemplu, pentru a treia intrare LFN din rând, valoarea octetului LDIR_Ord va fi 0x43, pentru al 17-lea - 0x51 ). În înregistrările ulterioare, acest octet se schimbă de la N pentru a N-a înregistrare „lungă” din cont de la normala corespunzătoare la 1 pentru cea mai apropiată înregistrare normală.

Numele lungi de fișiere sunt stocate în codificare Unicode ( UTF-16 ), păstrând majusculele caracterelor alfabetice introduse. Dacă un anumit caracter de nume OEM sau Unicode nu poate fi convertit într-un caracter de pagină de cod, acesta este întotdeauna afișat ca caracter de subliniere „_”, iar caracterul real stocat pe disc nu este modificat.

Octetul sumei de control este calculat conform unui anumit algoritm bazat pe numele 8.3 al unei înregistrări obișnuite (pentru un fișier cu un nume lung, „numele” dintr-o înregistrare obișnuită se numește alias - alias) și copiat în toate „lungi”. " înregistrările corespunzătoare acestuia. Dacă oricare dintre valori este în contradicție cu numele fișierului (de exemplu, dacă fișierul a fost redenumit într-o versiune anterioară de MS-DOS/Windows), apare un orfan.

Un alias de fișier SFN cu un nume lung constă dintr-un corp și, dacă este necesar, o „coadă” digitală. Dacă fișierul are o extensie, primele trei caractere ale sale sunt stocate în alias. Numele corespunzător se formează prin traducerea caracterelor numelui lung al fișierului în codificarea OEM, toate spațiile numelui lung fiind ignorate, iar caracterele care nu pot fi traduse în OEM sau interzise în contextul numelui scurt sunt înlocuite cu o subliniere „_”. Coada cifrei „~n”, unde n = 1 ÷ 999999, este adăugată la alias dacă aliasul obținut inițial a intrat în conflict cu numele oricărui fișier din același director sau a fost mai lung decât definește standardul 8.3 sau dacă orice caracter atunci când modificarea codificării nu a găsit un omolog OEM și a fost înlocuită cu un caracter de subliniere. Astfel, se formează alias-uri precum NEWFIL~1.DJV (LFN = New file for me.djvu). Schema de alias al fișierelor este optimizată pentru viteză și, prin urmare, este imprevizibilă în detaliu.

Un nume de fișier care nu este un multiplu de 13 caractere nu completează complet câmpurile de nume ale intrărilor LFN din tabelul FAT. În acest caz, numele fișierului este terminat artificial cu un caracter NUL (0x00), iar octeții în exces sunt înfundați cu unii (adică, cu caractere 0xFF).

Pentru numele lungi, lungimea numelui este limitată la 255 de caractere, fără a lua în calcul separatorul NUL, iar calea completă este limitată la 260 de caractere, inclusiv NUL. Numele lung permite, de asemenea, utilizarea a șase caractere speciale care sunt interzise în numele scurte: +,; =[]

Dacă încercați să creați un fișier sau un director pe un volum FAT32 cu un nume care conține un astfel de caracter, o intrare LFN este generată automat, indiferent de lungimea numelui fișierului. Un proces similar are loc la crearea unui fișier/dosar cu un nume care conține caractere non-ASCII.

Este posibil ca fișierul de etichetă al volumului să nu preceadă fizic toate intrările din volum cu nume lungi (când volumul nu are o etichetă sau eticheta a fost atribuită după ce a fost scris un fișier cu un nume lung). Atunci eticheta de volum în FAT12/FAT16 nu va fi afișată corect, deoarece va fi luată din cea mai apropiată înregistrare LFN (deoarece are și atributul VOLUME_ID), iar dacă încercați să schimbați eticheta de volum, numele fișierului corespunzător va fi de fapt încălcat. La ștergerea unui fișier care are asociate înregistrări LFN, acestea din urmă nu sunt afectate și devin orfane. În timpul creării ulterioare a unui fișier nou, orfanul menționat poate fi asociat în mod eronat cu acesta, dacă sumele de control ale numelor fișierelor vechi și noi se potrivesc, totuși, cu algoritmul de calcul al sumei de control utilizat (codul ASCII al primului caracter al fișierului). alias este deplasat ciclic cu un bit spre dreapta și se adaugă codul următorului caracter etc. d) face ca această probabilitate să fie neglijabilă.

Semnificația operațiunilor cu fișiere în FAT

Formatarea volumului  - tabelul indicatorului de index este resetat la zero, cu excepția primelor trei (FAT[0] și FAT[1], sunt rezervate, iar FAT[2] conține o intrare corespunzătoare fișierului de etichetă de volum sau, dacă acesta lipsește, eticheta EOC) și înregistrările clusterelor deteriorate; intrările din directorul rădăcină sunt setate la zero (cu excepția fișierului cu etichetă de volum, dacă există), altfel zona de date nu este afectată.

Ștergerea fișierului  - primul caracter al înregistrării fișierului și toate înregistrările LFN asociate sunt înlocuite cu codul 0xE5; clusterele ocupate de fișier sunt marcate ca libere în tabelul FAT, dar clusterele din zona de date nu sunt afectate.

Crearea unui fișier sau director cu comanda „Nou” a meniului contextual - este creată o intrare de fișier pentru un fișier „gol” nou cu un nume implicit (de exemplu, „Folder nou”) și o dimensiune determinată de tipul fișierului; fișierul în sine, dacă are o dimensiune diferită de zero (ceea ce este adevărat pentru aproape toate fișierele „vide”, cu excepția directoarelor și documentelor text), este scris în zona de date din clusterele alocate acestuia; lanțul de clustere corespunzător este creat în tabelul FAT. După ce ați dat fișierului un nume valid (nu cel implicit), intrarea de fișier creată inițial este marcată ca ștearsă și este creată una nouă.

Redenumirea unui fișier  - este creată o nouă intrare cu un nume actualizat; vechea intrare este marcată ca ștearsă.

Salvarea unui fișier din aplicație (nu din linia de comandă) - se creează o înregistrare care conține toate câmpurile, cu excepția dimensiunii și a clusterului inițial al fișierului; după ce fișierul este salvat, este creată o nouă înregistrare care conține toate câmpurile și vechea înregistrare este ștearsă.

Copierea unui fișier  - o înregistrare de fișier identică este creată în noua locație (posibil cu excepția unor marcaje temporale, vezi mai sus), primul cluster gratuit este alocat fișierului și conținutul fișierului este copiat în noua locație, în timp ce se copiază fișierul cluster curent, căutând următorul cel liber și completând tabelul FAT .

Mutarea unui fișier (între volume diferite) - copierea și apoi ștergerea fișierului din locația sa inițială.

Relocarea fișierului (în cadrul volumului) - lanțul de cluster nu este afectat, înregistrarea fișierului este copiată neschimbată în noul director și apoi ștearsă din cel vechi.

Căutarea unui cluster liber în tabelul de pointeri de index pentru alocarea unui fișier nou începe în general nu de la începutul zonei de date (adică de la clusterul 2), ci de la ultimul cluster alocat oricărui fișier, numărul de care este stocat în structura FSInfo. Cu alte cuvinte, dacă fișierului 1 i s-a atribuit clusterul 30 și fișierului 2 i s-a atribuit clusterul 31, iar apoi fișierul 1 a fost șters, atunci când este creat un nou fișier 3, cel mai probabil va fi localizat fizic începând de la clusterul 32.

Toleranța la erori de sistem

Deoarece sistemul FAT stochează date despre fișiere și date despre spațiul liber pe disc în același tabel, operația de scriere a fișierelor, care constă în mod tradițional din două etape (adăugarea blocului ocupat la lista celor ocupați și ștergerea aceluiași bloc din lista de libere), apare în FAT într-o singură acțiune. Din acest motiv, sistemul FAT are o toleranță inerentă la erori, adică o defecțiune (de exemplu, alimentarea) la momentul unei operațiuni de citire sau scriere, în majoritatea cazurilor, nu va duce la distrugerea sistemului de fișiere. Cu toate acestea, în acest caz, vorbim despre integritatea sistemului de fișiere și nu despre fișierele în sine.

Caracteristici [3]

FAT12 FAT16 FAT32
Dezvoltator Microsoft
Titlul complet Tabelul de alocare a fișierelor
(versiunea pe 12 biți) (versiunea pe 16 biți) (versiunea pe 32 de biți)
Prezentat 1980 ( Microsoft Disk BASIC ) August 1984 ( MS-DOS 3.00, trunchiat)
complet - iulie 1988, MS-DOS 4.0 [6]
august 1996 (Windows 95 OSR 2)
ID volum 0x01 ( MBR ) 0x04, 0x06, 0x0E (MBR) 0x0B, 0x0C (MBR)
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ( GPT )
structurilor
Conținutul directorului Masa
Plasarea fișierului Lista liniară
Blocuri proaste Etichetarea clusterului
Restricții
mărime fișier 32 MB _ 2 GB _ 4 GB
Numărul de clustere 4084 65 524 268 435 445 (2 28 −12)
Lungimea numelui fișierului 8,3 sau 255 de caractere când utilizați LFN
Dimensiunea volumului 2 MB (512 octeți pe sector)

32 MB (64 KB per cluster)

2 GB
4 GB (64 KB per cluster, nu este acceptat peste tot)
2 TB
8 TB (32 KB pe sector)
Capabilități
Datele stocate Creare, modificare, acces
Interval de date 1 ianuarie 1980 - 31 decembrie 2107
Informații suplimentare Inițial nu este acceptat
Atributele fișierului Numai citire, ascuns, sistem, etichetă de volum, subdirector, arhivă
Diferențierea drepturilor de acces Nu
Compresie transparentă Utilități autonome ( Stacker , DoubleSpace , DriveSpace )
Criptare transparentă Utilități terțe sau clone DOS

Licențiere

Unii algoritmi pentru lucrul cu FAT și VFAT sunt brevetați de Microsoft.

În SUA în reexaminare[ când? ] s-a decis anularea unor brevete, dar apoi a fost anulată.

În octombrie 2006, un brevet pentru VFAT eliberat de Oficiul European de Brevete [7] a fost anulat în Germania pentru evident .

De-a lungul timpului, FAT a devenit utilizat pe scară largă în diverse dispozitive pentru compatibilitate între DOS, Windows, OS/2, Linux. Microsoft nu a arătat intenția de a-i forța să obțină licență[ clarifica ] [8] .

În februarie 2009, Microsoft a dat în judecată TomTom , un producător de sisteme de navigație auto bazate pe Linux , pentru încălcarea brevetelor [9] .

Potrivit lui Jeremy Ellison[ clarificați ] Scopul Microsoft este de a prezenta diferitelor companii o alegere: să încheie un acord de protecție a brevetului cu Microsoft (cum ar fi Novell a încheiat cu acesta în noiembrie 2006), încălcând astfel GNU GPL și făcându-le imposibil să utilizeze Linux. , sau să nu încheie un astfel de acord și să fie acuzat de încălcarea brevetelor, a căror protecție este asigurată la încheierea sa sub condiția nedezvăluirii [10] [11] .

În martie 2009, TomTom a depus o cerere reconvențională pentru încălcarea brevetelor [12] .

Vezi și

Note

  1. Copie arhivată . Consultat la 9 iunie 2009. Arhivat din original pe 16 iulie 2011.
  2. www.microsoft.com/mscorp/ip/tech/fathist.asp la archive.org
  3. 1 2 Microsoft Extensible Firmware Initiative FAT32 File System Specification 1.03 (link nu este disponibil) . Microsoft (6 decembrie 2000). — Document în format Microsoft Word, 268 Kb. Consultat la 5 aprilie 2010. Arhivat din original pe 22 august 2011. 
  4. Dar VFAT? (link indisponibil) . Arhiva TechNet . Microsoft (15 octombrie 1999). Consultat la 5 aprilie 2010. Arhivat din original pe 22 august 2011. 
  5. Nu confundați extensia sistemului de fișiere VFAT cu driverul de sistem de fișiere cu același nume, care a apărut în Windows for Workgroups 3.11 și este conceput pentru a procesa apelurile de funcții MS-DOS (INT 21h) în modul protejat (vezi: KB126746: Windows pentru Istoricul versiunilor grupurilor de lucru (indisponibil (link) VERSIUNEA 3.11 → Caracteristici non-rețea Microsoft (14 noiembrie 2003) Preluat la 5 aprilie 2010. Arhivat din original pe 22 august 2011.  )
  6. Rezumatul partiționării MS-DOS (link descendent) . microsoft.com . Consultat la 23 octombrie 2012. Arhivat din original pe 23 octombrie 2012. 
  7. Tribunalul Federal de Brevete declară brevetul FAT al Microsoft nul și neavenit  (în engleză)  (link nu este disponibil) . heise online . Heise Zeitschriften Verlag (2 martie 2007). Preluat la 10 martie 2009. Arhivat din original la 22 august 2011.
  8. Brian Kahin. Microsoft Roils the World with FAT Patents  (engleză)  (link nu este disponibil) . The Huffington Post (10 martie 2009). Preluat la 10 martie 2009. Arhivat din original la 22 august 2011.
  9. Ryan Paul. Procesul Microsoft pentru brevetele FAT ar putea deschide OSS Pandora's Box  (ing.)  (link indisponibil) . Ars Technica . Publicaţii Condé Nast (25 februarie 2009). Preluat la 9 martie 2009. Arhivat din original la 22 august 2011.
  10. Glyn Moody. Motivul real al procesului TomTom de la Microsoft  (în engleză)  (link nu este disponibil) . lumea computerelor Marea Britanie . IDG (5 martie 2009). Preluat la 9 martie 2009. Arhivat din original la 22 august 2011.
  11. Steven J. Vaughan-Nichols. Companiile Linux semnează pacte de protecție a brevetelor Microsoft  (ing.)  (link indisponibil) . Bloguri Computerworld . IDG (5 martie 2009). Preluat la 9 martie 2009. Arhivat din original la 22 august 2011.
  12. Erica Ogg. TomTom dă în judecată Microsoft în disputa privind brevetele  (ing.)  (link indisponibil) . CNet (19 martie 2009). Preluat la 20 martie 2009. Arhivat din original la 22 august 2011.

Link -uri