FED

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 18. juni 2022; checks kræver 2 redigeringer .

FAT ( engelsk  File Allocation Table "filallokeringstabel") er en klassisk filsystemarkitektur , som på grund af sin enkelhed stadig er meget brugt til flashdrev . Bruges i disketter , hukommelseskort og nogle andre lagermedier. Tidligere blev det også brugt på harddiske.

Udviklet af Bill Gates og Mark McDonald i 1976-1977 [1] [2] . Det blev brugt som hovedfilsystemet i operativsystemerne i MS-DOS- og Windows 9x -familierne .

FAT-strukturen følger ECMA-107-standarden og er defineret i detaljer af den officielle Microsoft-specifikation kendt som FATGEN [3] .

Versioner af FAT-systemet

Der er fire versioner af FAT - FAT12 , FAT16 , FAT32 og exFAT (FAT64) . De adskiller sig i bitheden af ​​poster i diskstrukturen, det vil sige antallet af bits , der er reserveret til lagring af klyngenummeret. FAT12 bruges hovedsageligt til disketter , FAT16 til små diske. Baseret på FAT blev der udviklet et nyt exFAT (extended FAT) filsystem, der primært bruges til flashdrev .

Oprindeligt understøttede FAT ikke et hierarkisk katalogsystem - alle filer var placeret i roden af ​​disken. Dette blev gjort for nemheds skyld, da det på enkeltsidede disketter med en kapacitet på kun 160–180 KB, simpelthen ikke gav mening at sortere nogle få filer i mapper. Med spredningen af ​​disketter på 320 eller flere kilobyte viste det sig at være ubelejligt at gemme alle filer i roden, desuden begrænsede den lille størrelse af rodmappen antallet af filer på disken. Mapper blev introduceret med udgivelsen af ​​MS-DOS 2.0.

Forskellige operativsystemer har også implementeret forskellige FAT-udvidelser. For eksempel har DR-DOS yderligere filadgangsattributter; i Windows 95 , Linux  - understøttelse af lange filnavne (LFN) i Unicode-format (Virtual FAT - VFAT); på OS/2  udvidede attributter for alle filer.

VFAT

VFAT  er en FAT-udvidelse introduceret i Windows 95 . I FAT er filnavne i 8.3 -format og består kun af ASCII-tegn . Understøttelse af lange (op til 255 tegn) filnavne ( Long File Name, LFN ) i UTF-16LE- kodning blev tilføjet til VFAT ,  mens LFN'er gemmes samtidigt med navne i 8.3-format, retrospektivt kaldet SFN ( Engelsk Short File Name ). LFN'er er ufølsomme for store og små bogstaver, når de slår op, men i modsætning til SFN'er, som er gemt med store bogstaver, beholder LFN'er det angivne store og små bogstaver, da filen blev oprettet [4] [5] .  

Struktur af FAT-systemet

I FAT-filsystemet kombineres sammenhængende disksektorer til enheder kaldet klynger . Antallet af sektorer i en klynge er lig med en potens af to (se nedenfor). Et helt antal klynger (mindst én) er allokeret til lagring af fildata, så hvis f.eks. filstørrelsen er 40 bytes, og klyngestørrelsen er 4 KB, vil kun 1 % af den plads, der er allokeret til den, faktisk være optaget af filoplysningerne. For at undgå sådanne situationer er det tilrådeligt at reducere størrelsen af ​​klynger og omvendt for at reducere mængden af ​​adresseoplysninger og øge hastigheden af ​​filoperationer. I praksis er der valgt et kompromis. Da diskkapaciteten meget vel ikke kan udtrykkes i et heltal af klynger, er der normalt i slutningen af ​​volumen såkaldte overskudssektorer - en "rest" mindre end en klynge i størrelse, som ikke kan allokeres af OS til lagring af information.

FAT32-volumenrummet er logisk opdelt i tre sammenhængende områder:

FAT12 og FAT16 har også et dedikeret område til rodmappen. Den har en fast position (umiddelbart efter det sidste element i FAT-tabellen) og en fast størrelse i 32-byte-elementer, det vil sige, når man beskriver i Partition Boot Record, er det netop antallet af 32-byte-elementer, der er angivet , som hver beskriver ethvert element i rodmappen (det være sig fil eller anden undermappe).

Hvis en klynge hører til en fil, så indeholder den tilsvarende celle i FAT-tabellen nummeret på den næste klynge i den samme fil. Hvis cellen svarer til den sidste klynge i filen, så indeholder den en speciel værdi (0xFFFF for FAT16). Der er således bygget en kæde af filklynger. Nuller svarer til ubrugte klynger i tabellen. "Dårlige" klynger (som er udelukket fra behandling, for eksempel fordi det tilsvarende område af enheden er ulæseligt) har også en speciel kode (0xFFF7 for FAT16).

Når en fil slettes, erstattes det første tegn i navnet med specialkoden 0xE5, og filens klyngekæde i allokeringstabellen nulstilles. Da oplysningerne om filstørrelsen (som er placeret i mappen ved siden af ​​filnavnet) forbliver intakte, kan den slettede fil gendannes, hvis filklyngerne var placeret sekventielt på disken og ikke blev overskrevet med nye oplysninger.

Boot record

Den første struktur af en FAT-volumen kaldes BPB ( BIOS  -parameterblok ) og er placeret i et reserveret område i sektor nul. Denne struktur indeholder information, der identificerer typen af ​​filsystem og mediets fysiske karakteristika (diskette eller harddiskpartition).

BIOS Parameter Block (BPB)

BPB udeblev fra FAT, som tjente MS-DOS 1.x, da man på det tidspunkt kun antog to forskellige typer volumener - enkeltsidede og dobbeltsidede 5-tommers 320 KB disketter, og volumenformatet blev bestemt af den første byte i FAT-området. BPB blev introduceret i MS-DOS 2.x i begyndelsen af ​​1983 som en obligatorisk opstartssektorstruktur, hvorfra volumenformatet kan bestemmes fremover; det gamle FAT first byte detektionsskema blev ikke længere understøttet. Også i MS-DOS 2.0 blev et hierarki af filer og mapper introduceret (før det var alle filer gemt i rodmappen).

BPB-strukturen i MS-DOS 2.x indeholdt et 16-bit "samlet antal sektorer"-felt, hvilket betød, at denne version af FAT var fundamentalt uanvendelig for volumener større end 2 16 = 65.536 sektorer, det vil sige mere end 32 MB med en standardsektorstørrelse på 512 bytes. I MS-DOS 4.0 (1988) blev BPB-feltet udvidet til 32 bit, hvilket betød en stigning i den teoretiske volumenstørrelse til 232 = 4.294.967.296 sektorer, dvs. op til 2 TB med en 512-byte sektor.

Den næste ændring af BPB dukkede op med Windows 95 OSR2, som introducerede FAT32 (i august 1996). Grænsen på 2 TB for volumenstørrelse er blevet fjernet, en FAT32-volumen kan teoretisk være op til 8 TB i størrelse. Størrelsen af ​​hver enkelt fil må dog ikke overstige 4 GB. BIOS-parameterblokken i FAT32, for kompatibilitet med tidligere versioner af FAT, gentager BPB fra FAT16 til og med BPB_TotSec32-feltet efterfulgt af forskelle.

FAT32 "boot-sektoren" er faktisk tre 512-byte sektorer - sektorer 0, 1 og 2. Hver af dem indeholder signaturen 0xAA55 på adressen 0x1FE, det vil sige i de sidste to bytes, hvis sektorstørrelsen er 512 bytes. Hvis sektorstørrelsen er mere end 512 bytes, er signaturen indeholdt både på adressen 0x1FE og i de sidste to bytes af nulsektoren, det vil sige, at den duplikeres.

FSInfo

Opstartsrecorden for en FAT32-partition indeholder en struktur kaldet FSInfo , der bruges til at lagre værdien af ​​volumenets frie klyngeantal. FSInfo optager som regel sektor 1 (se feltet BPB_FSInfo) og har følgende struktur (adresser i forhold til begyndelsen af ​​sektoren):

  • FSI_LeadSig. 4-byte signaturen 0x41615252 angiver, at sektoren bliver brugt til FSInfo-strukturen.
  • FSI_Reserveret1. Intervallet fra 4 til 483 bytes af sektoren inklusive nulstilles.
  • FSI_StrucSig. En anden signatur er placeret på 0x1E4 og indeholder værdien 0x61417272.
  • FSI_Free_Count. 4-byte feltet på adresse 0x1E8 indeholder det sidste antal ledige klynger på volumen, som systemet kender. Værdien 0xFFFFFFFF betyder, at antallet af frie klynger er ukendt og skal beregnes.
  • FSI_Nxt_Free. 4-byte feltet på adressen 0x1EC indeholder klyngenummeret, hvorfra søgningen efter ledige klynger i indeksmarkørtabellen skal begynde. Normalt indeholder dette felt nummeret på den sidste FAT-klynge, der er allokeret til fillagring. Værdien 0xFFFFFFFF betyder, at søgningen efter en fri klynge skal udføres helt fra begyndelsen af ​​FAT-tabellen, det vil sige fra den anden klynge.
  • FSI_Reserveret2. Reserveret 12-byte felt på adressen 0x1F0.
  • FSI_TrailSig. Signaturen 0xAA550000 er de sidste 4 bytes i FSInfo-sektoren.

Pointen med at introducere FSInfo er at optimere driften af ​​systemet, da indekspointertabellen i FAT32 kan være meget stor, og dens byte-for-byte-opslag kan tage lang tid. Værdierne af felterne FSI_Free_Count og FSI_Nxt_Free svarer dog muligvis ikke til virkeligheden og bør kontrolleres for tilstrækkelighed. Derudover er de ikke engang opdateret i FSInfo backup, som normalt er placeret i sektor 7.

Bestemmelse af typen af ​​FAT-volumen

Bestemmelse af FAT-typen af ​​et volumen (det vil sige valget mellem FAT12, FAT16 og FAT32) foretages af OS baseret på antallet af klynger i volumenet, som igen bestemmes ud fra BPB-felterne. Først og fremmest beregnes antallet af sektorer i rodmappen:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

Dernæst bestemmes det, hvilke af felterne BPB_FATSz16/32 og BPB_TotSec16/32 der ikke er lig med nul, og de bruges til at bestemme antallet af sektorer i volumendataområdet:

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

Til sidst bestemmes antallet af dataområdeklynger:

CountofClusters = DataSec / BPB_SecPerClus

Ved antallet af klynger er der en en-til-en korrespondance med filsystemet:

  • Antal klynger < 4085 - FAT12
  • Antal klynger = 4085 ÷ 65524 - FAT16
  • Antal klynger > 65524 - FAT32

Ifølge den officielle specifikation er dette den eneste gyldige måde at bestemme FAT-typen på. Kunstig oprettelse af en volumen, der overtræder de angivne kortlægningsregler, vil medføre, at den bliver håndteret forkert af Windows. Det anbefales dog at undgå værdier af CountofClusters, der er tæt på de kritiske værdier (4085 og 65525) for korrekt at bestemme filsystemtypen af ​​eventuelle, ofte forkert skrevne, drivere.

FAT12 oprettes altid på en diskette, når det formateres . Hvad angår harddiske og flashdrev , så med en drevstørrelse på op til 512 MB (med en 512-byte sektor), oprettes FAT16 som standard, over 512 MB - FAT32. Klyngestørrelsen bestemmes under formatering baseret på filsystemet og volumenstørrelsen.

Bindets serienummer

Volumens serienummer (feltet BS_VolID) i Windows 98 oprettes ud fra formatet dato og klokkeslæt på en sådan måde, at det er umuligt at gendanne dem uden yderligere oplysninger.

FEDT tabel

Den næste vigtige struktur i et FAT-volumen er selve FAT-tabellen, som optager et separat logisk område. Den definerer en liste (kæde) af klynger, der er vært for diskenhedens filer og mapper. Der er en en-til-en overensstemmelse mellem klynger og indeksmarkører i tabellen - den N'te pointer svarer til klyngen med samme nummer. Den første klynge i dataområdet er tildelt nummeret 2. Indeksmarkørens værdi svarer til tilstanden for den tilsvarende klynge. Følgende tilstande er mulige:

  • klyngen er fri — markøren er nulstillet;
  • klyngen er optaget af en fil og er ikke den sidste filklynge — markøren indeholder nummeret på den næste filklynge;
  • klyngen er den sidste klynge i filen — markøren indeholder EOC (End Of Clusterchain)-etiketten, hvis værdi afhænger af FAT-versionen: for FAT12 er EOC-etiketten enhver værdi større end eller lig med 0x0FF8 (0x0FFF ved Standard); for FAT16 — større end eller lig med 0xFFF8 (standard 0xFFFF); for FAT32, enhver værdi større end eller lig med 0x0FFFFFF8 (0x0FFFFFFF som standard);
  • klyngen er beskadiget — markøren indeholder en speciel etiket, hvis værdi er 0x0FF7 for FAT12, 0xFFF7 for FAT16 og 0x0FFFFFF7 for FAT32. En beskadiget klynge kan ikke bruges af filsystemet til datalagring; de tilsvarende pointere påvirkes ikke ved formatering af lydstyrken, når alle andre pointere er sat til nul;
  • klyngen er reserveret "til fremtidig standardisering" - markøren indeholder en værdi, der er større end CountofClusters, men mindre end etiketten for den beskadigede klynge (det vil sige op til og inklusive 0xFFF6 for FAT16). I dette tilfælde anses klyngen, der ikke svarer til nogen reelle data, for optaget og springes over, når der søges efter en ledig, men der gives ingen anden information om den.

Klynger 0 og 1 afspejles separat af FAT. Indeksmarkøren svarende til klynge nul (den allerførste FAT tabel pointer) indeholder værdien af ​​BPB_Media i de nederste 8 bits; de resterende bit er sat til 1. For eksempel, hvis BPB_Media = 0xF8 (harddisk), FAT[0] = 0x0FFFFFF8 for FAT32. Således formelt FAT[0] = EOC, som bruges ved behandling af filer i nulstørrelse (se nedenfor).

Den anden reserverede markør, FAT[1], er indstillet til værdien af ​​EOC-mærket ved formatering. I FAT12 bruges den ikke længere på nogen måde, og i FAT16 og FAT32 kan de øverste to bits af denne pointer indeholde et mærke om behovet for at kontrollere lydstyrken (den såkaldte " dirty bit ") og alle andre bits er sat til 1. Tilstedeværelsen af ​​en snavset bit kontrolleres under Windows boot-processen autochk.exe-programmet. Den beskidte bit genereres, når lydstyrken ikke er korrekt afmonteret, eller når mediet har en hardwarefejl og derfor tager to mulige værdier.

En FAT32-indeksmarkør er per definition 32 bit, men de øverste 4 bits ignoreres faktisk, så værdien af ​​pointeren er faktisk 28 bit. Den eneste handling, der fungerer på de øverste 4 bits af markøren, er volumenformatering, som nulstiller hele markøren. Det betyder, at f.eks. pointerværdierne 0x10000000, 0xF0000000 og 0x00000000 alle svarer til en fri klynge, da de kun adskiller sig i de øverste 4 bits.

Værdien af ​​BPB FAT-tabelstørrelsen, dvs. BPB_FATSz16/32, kan være større end den reelle, så der kan være sektorer i slutningen af ​​hver FAT-tabel, som ikke svarer til nogen reelle dataklynger. Under formatering nulstilles disse sektorer, og under driften af ​​volumen bruges de ikke på nogen måde. Derfor skal den faktiske adresse for den sidste sektor i FAT-tabellen, som indeholder pointere til reelle volumen-klynger, altid beregnes ud fra det samlede antal dataområde-klynger og ikke fra BPB_FATSz16/32-feltet. Derudover er den sidste sektor optaget af FAT-tabellen ikke nødvendigvis helt optaget af den - i dette tilfælde bruges sektorens overskydende plads heller ikke og er fyldt med nuller ved formatering af volumen.

Filposter

Umiddelbart efter slutningen af ​​den sidste FAT-tabel er et dataområde, der indeholder filer og mapper. Et FAT- bibliotek er en almindelig fil markeret med en speciel egenskab. Dataene (indholdet) af en sådan fil i enhver FAT-version er en kæde af 32-byte filposter (mappeposter). En mappe kan normalt ikke indeholde to filer med samme navn. Hvis kontroldiskprogrammet finder et kunstigt oprettet par identisk navngivne filer i samme mappe, omdøbes en af ​​dem.

Rodmappe

Den eneste mappe, der skal være til stede, er rodmappen. I FAT12/FAT16 har rodmappen en fast størrelse i sektorer, som beregnes ud fra værdien af ​​BPB_RootEntCnt, og følger FAT-tabellen på disken.

I FAT32 har rodmappen, som enhver anden, en variabel størrelse og er en kæde af klynger. Nummeret på den første rodbiblioteksklynge afspejles af BPB_RootClus. Rodbiblioteket adskiller sig fra andre mapper på en FAT-diskenhed på følgende måder:

  • den har ingen dato- og tidsstempler;
  • intet eget navn (undtagen "\");
  • den indeholder ikke filer med navnet "." og ".." (se nedenfor);
  • er den eneste mappe, der normalt kan indeholde en volumetiketfil (se nedenfor).
Struktur af en filpost

En FAT32-filpost består af følgende strukturer:

  • DIR_Navn. 11-byte-feltet ved relativ adresse 0 indeholder det korte filnavn (under 8.3-standarden). Se nedenfor for filnavne.
  • DIR_Attr. Byte på adresse 0x0B, ansvarlig for filattributter.
  • DIR_NTRes. Byte på adresse 0x0C, brugt i Windows NT.
  • DIR_CrtTimeTenth. Byte på adresse 0x0D. Optælling af titusvis af millisekunder af filoprettelsestid, gyldige værdier er 0-199. Feltet ignoreres ofte unødigt.
  • DIR_CrtTime. 2 bytes på adressen 0x0E. Filoprettelsestid nøjagtigt til 2 sekunder.
  • DIR_CrtDate. 2 bytes på adresse 0x10. Datoen, hvor filen blev oprettet.
  • DIR_LstAccDate. 2 bytes på adressen 0x12. Datoen for sidste adgang til filen (det vil sige sidste læsning eller skrivning - i sidstnævnte tilfælde er den lig med DIR_WrtDate). Der er ikke noget lignende felt for tid.
  • DIR_FstClusHI. 2 bytes på adressen 0x14. Filens første klyngenummer (højt ord, nul på en FAT12/FAT16-diskenhed).
  • DIR_WrtTime. 2 bytes på adressen 0x16. Tidspunktet for den sidste optagelse (ændring) af filen, for eksempel dens oprettelse.
  • DIR_WrtDate. 2 bytes på adressen 0x18. Datoen for den sidste optagelse (ændring) af filen, inklusive oprettelse.
  • DIR_FstClusLO. 2 bytes på adressen 0x1A. Nummer på den første klynge af filen (lavt ord).
  • DIR_Filstørrelse. DWORD, der indeholder værdien af ​​filstørrelsen i bytes. Den grundlæggende begrænsning af FAT32 er, at den maksimalt tilladte filstørrelse er 0xFFFFFFFF (det vil sige 4 GB minus 1 byte).

Hvis den første byte af en FAT-indgang (det vil sige DIR_Name[0]) indeholder 0xE5 eller 0x05, betyder det, at posten er fri (den tilsvarende fil er blevet slettet). Nul i DIR_Name[0] betyder, at ikke kun denne post er gratis, men også alle efterfølgende katalogposter; Windows analyserer ikke resten af ​​en mappe efter en nulstillet post.

Filnavn i FAT

DIR_Name-feltet er logisk opdelt i de første 8 tegn, som danner filnavnet, og de sidste 3, som danner udvidelsen. Separatorperioden tilføjes på operativsystemniveau og gemmes ikke i navnefeltet. Hvis filnavnet og filtypenavnet ikke udfylder den plads, der er tildelt dem, bliver de resterende bytes i feltet DIR_Name fyldt med mellemrum (0x20). Filnavnet og filtypenavnet kan indeholde enhver kombination af bogstaver, tal eller tegn med ASCII - koder større end 127; specialtegn er opdelt i tre grupper:

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

Tjenestetegn har en særlig betydning i DOS og Windows og kan ikke være en del af et filnavn (tegn * ? er metategn , og tegn : / \ bruges som separatorer i filstier , andre servicetegn og ulovlige tegn er kontroltegn i kommandolinjefortolkere COMMAND. COM og cmd.exe ), mens forbudte tegn stadig kan inkluderes i filnavnet på bekostning af en LFN-indgang (se nedenfor). For eksempel kan en mappe med et navn, der starter med en prik eller indeholder flere prikker, oprettes i kommandolinjetilstand ( mkdir .directory) eller i skaller som FAR Manager , Total Commander , WinRAR . Filnavnet kan ikke starte eller slutte med et mellemrum; ingen ASCII-kontroltegn (det vil sige 0x00-0x1F) er tilladt i nogen byte i navnefeltet, bortset fra tilfældet med kode 5, der er angivet ovenfor. Oplysninger om den aktuelle (på det tidspunkt, hvor filen blev oprettet) DOS -kodetabel er ikke gemt, så adgang til filer, hvis navne indeholder nationale koder fra Extended ASCII (f.eks. kyrilliske tegn fra kodetabel 866 ), med en anden tegntabel, kan det være problematisk eller umuligt (fordi før du søger efter en fil i mappen, navn konverteres til store bogstaver i overensstemmelse med tabellen i kodebladet). Den fulde sti til filen må ikke overstige 80 bytes (3 er drevbogstavet; 64 er stien; 12 er filnavnet, inklusive afgrænsningspunktet; 1 er terminalens nultegnet).

Alle 8,3 alfabetiske tegn i navnet oversættes altid og gemmes i feltet DIR_Name med store bogstaver. DIR_NTRes-byten bruges til at bevare det oprindelige store og små bogstaver i et Windows NT - navn: 1 i bit 3 fortæller, at navnet skal vises med små bogstaver; Det er bit 4, der er ansvarlig for udvidelsen Hvis navnet eller udvidelsen indeholder tegn fra begge tilfælde, oprettes en LFN-record for en sådan fil (se nedenfor). Windows 9x opretter altid en LFN-post for at bevare navnets ikke-trivielle store og små bogstaver og ignorerer feltet DIR_NTRes. Som en konsekvens heraf kan navnet på den samme fil, uden en tilknyttet LFN-post, blive vist af Windows 9x udelukkende med store bogstaver, men Windows NT (delvis) med små bogstaver.

Filattributter

I attributbyten er de to øverste bits reserverede og skal altid sættes til nul. De resterende bits er fordelt på en sådan måde, at værdien 0x01 svarer til "read-only" attributten, 0x02 - "skjult", 0x04 - "system", 0x20 - "arkiveret". Et sæt af flere attributter er lavet ved at summere de grundlæggende værdier. Ud over disse standardattributter bruges følgende: 0x10 - angiver, at filen er en mappe (beholder til andre filer); 0x08 - ATTR_VOLUME_ID, en speciel attribut for en unik nul-størrelse fil i rodmappen, hvis navn anses for at være en volumen etiket. Grænsen på 11-tegns FAT-volumenetiketten er relateret til størrelsen af ​​feltet DIR_Name. Hvis filen har READ_ONLY | SKJULT | SYSTEM | VOLUME_ID (værdi 0x0F), dette indikerer, at indgangen ikke svarer til en separat fil, men indeholder en del af et langt navn på en anden fil, der ikke passer ind i 8.3-rammeværket (se nedenfor).

En kunstig tildeling af en værdi, der ikke er nul, til de øverste to bits af DIR_Attr bruges til at danne filer, der ikke kan slettes eller omdøbes med standardmidler i filsystemet uden formatering. Dette er f.eks. nyttigt, når du bekæmper Autorun.inf-virus (Panda USB og AutoRun Vaccine-programmet). På den anden side kan virus selv bruge det samme værktøj. Værdien af ​​DIR_Attr = 0x40 er reserveret til intern brug (enhed).

Hvad sker der, når en mappe oprettes

Når en mappe er oprettet, er DIR_FileSize = 0 sat til den "for life".Størrelsen af ​​mappens indhold bestemmes ved blot at følge kæderne af klynger op til End Of Chain-mærket. Størrelsen af ​​selve mappen er begrænset af filsystemet til 65.535 32-byte poster (det vil sige, mappeposter i FAT-tabellen må ikke overstige 2 MB). Denne grænse er beregnet til at fremskynde filoperationer og tillade forskellige hjælpeprogrammer at bruge et 16-bit heltal (WORD) til at tælle antallet af poster i en mappe (som følge heraf er der en teoretisk grænse for antallet af filer i en mappe - 65.535, forudsat at alle filnavne følger standarden 8.3). Biblioteket er tildelt én dataområde-klynge (medmindre det er en FAT12/FAT16-rodmappe), og DIR_FstClusHI / DIR_FstClusLO-felterne indstilles til værdien af ​​det klyngenummer. En EOC-label er placeret i FAT-tabellen for den post, der svarer til denne klynge, og selve klyngen er fyldt med nuller. Derefter oprettes to specielle filer, uden hvilke FAT-biblioteket anses for at være beskadiget (de første to 32-byte-indgange i klyngedataområdet) - nulstørrelsesfiler med navnene "." (én prik, mappe-id) og ".." (to prikker, pegepind til den overordnede mappe). Dato- og tidsstemplerne for disse filer er indstillet til værdierne for selve mappen på oprettelsestidspunktet og opdateres ikke, når mappen ændres. DIR_FstClusHI / DIR_FstClusLO felterne i "." indeholde værdien af ​​nummeret på den klynge, der indeholder det, og filen ".." - nummeret på den første klynge i den mappe, der indeholder den givne. Således filen "." refererer til selve mappen, og filen ".." refererer til den oprindelige klynge af den overordnede mappe; hvis det overordnede bibliotek er rodbiblioteket, anses den oprindelige klynge for at være nul.

Tid og dato

Et to-byte datostempel har følgende format:

  • bit 0-4 - dag i måneden, værdier 1-31 er tilladt;
  • bit 5-8 - måned i året, værdier 1-12 er tilladt;
  • bit 9-15 - år, tæller fra 1980 ("MS-DOS-epoke"), værdier fra 0 til 127 inklusive er mulige, det vil sige 1980-2107.

Et to-byte tidsstempel har følgende format:

  • bit 0-4 - sekundtæller (to hver), gyldige værdier er 0-29, det vil sige 0-58 sekunder;
  • bit 5-10 er minutter, gyldige værdier er 0-59;
  • bit 11-15 er timer, gyldige værdier er 0-23.

Af dato- og tidsstemplerne er kun det sidste ændringstidspunkt (det vil sige DIR_WrtTime og DIR_WrtDate) kritisk, resten understøttes muligvis ikke af mange systemer; når du opererer på en fil på et sådant system (for eksempel i DOS eller Windows 3.1), ignoreres disse felter. FAT gemmer dato- og tidsstempler i henhold til den lokale tidszone; når den ændres, ændres mærkerne ikke.

Tidsstempler for mapper indstilles, når de oprettes og ændres ikke, når nye filer skrives til en mappe, omdøbes, eller en ny klynge tildeles den.

Filens sidste adgangsdato opdateres, hver gang den tilgås, f.eks. når du ser filens egenskaber, når du flytter til en anden diskenhed (men ikke inden for diskenheden). Når du kopierer en fil i Windows 98, opdateres den sidste adgangsdato for den originale fil, men ikke i Windows XP.

Dato-klokkeslæt for filændring ændres, når nyt indhold skrives til dataområdet (ikke filposten). Med andre ord ændres ændringsdato-tid ikke, når attributter ændres, eller filen omdøbes. Flytning eller kopiering af en fil bevarer det originale ændringsmærke.

Oprettelsesdatoen og -tidspunktet indstilles, når en filpost tildeles til en ny fil, der ikke eksisterede før. Med andre ord, når en fil omdøbes eller flyttes, ændres datoen og tidspunktet for oprettelsen ikke, men når den kopieres, får den nye fil et nyt stempel. Når en fil kopieres på Windows, kan den således ende med en oprettelsesdato, der er senere end ændringsdatoen.

LFN poster

Filer og mapper med et langt navn (større end 8.3) behandles på en særlig måde af FAT-filsystemet. Strukturen af ​​en 32-byte record for en fil med et LFN (Long File Name) er forskellig fra en almindelig (SFN) record:

  • LDIR_Ord. Den første byte af en post bruges til at nummerere posterne i sættet.
  • LDIR_Name1. 10-byte-feltet på adresse 0x01 indeholder de første fem tegn i filnavnet (eller rettere, den del af dets navn, der afspejles i denne LFN-post).
  • LDIR_Attr. Attributbyten på adressen 0x0B er 0x0F (ATTR_LONG_NAME).
  • LDIR_Type. Byten på adressen 0x0C er sat til nul og angiver desuden, at denne post i FAT-tabellen refererer til en fil med et langt navn.
  • LDIR_Chksum. Byten på adressen 0x0D indeholder SFN-kontrolsummen af ​​filaliaset svarende til sættet af LFN-poster.
  • LDIR_Name2. Et 12-byte felt på adressen 0x0E, der indeholder tegnene 6 til 11 i filnavnet.
  • LDIR_FstClusLO. 2-byte-feltet ved adresse 0x1A er meningsløst i sammenhæng med en LFN-record og er sat til nul.
  • LDIR_Name3. Et 4-byte felt på adressen 0x1C, der indeholder det 12. og 13. tegn i filnavnet.

Et sæt LFN-poster i en FAT-mappe skal altid være knyttet til en almindelig SFN-post, der er fysisk foran på disken. Et sæt LFN-poster fundet uden en tilsvarende normal post kaldes en forældreløs , og posten betragtes som korrupt; sådan en fil er fuldstændig usynlig i ældre versioner af MS-DOS/Windows.

I en sekvens af LFN-poster har hver af dem sit eget serienummer, bestemt af den første byte (LDIR_Ord). 0x40-masken angiver, at denne post er den sidste i rækken af ​​LFN-poster efter den (det vil sige, for eksempel, for den tredje LFN-post i rækken, vil værdien af ​​LDIR_Ord-byten være 0x43, for den 17. - 0x51 ). I efterfølgende poster ændres denne byte fra N for den N-te "lange" post i kontoen fra den tilsvarende normal til 1 for den, der er tættest på den normale post.

Lange filnavne gemmes i Unicode ( UTF-16 )-kodning, hvilket bevarer store og små bogstaver i de indtastede alfabetiske tegn. Hvis et bestemt OEM- eller Unicode-navntegn ikke kan konverteres til et tegntabel, vises det altid som understregningstegnet "_", og det faktiske tegn, der er gemt på disken, ændres ikke.

Kontrolsumbyten beregnes i henhold til en bestemt algoritme baseret på 8.3-navnet på en almindelig post (for en fil med et langt navn kaldes "navnet" fra en almindelig post et alias - alias) og kopieres til alle "lange" " optegnelser, der svarer til det. Hvis nogen af ​​værdierne ikke stemmer overens med filnavnet (for eksempel hvis filen blev omdøbt under en tidlig version af MS-DOS/Windows), opstår en forældreløs.

Et SFN-filalias med et langt navn består af en krop og om nødvendigt en digital "hale". Hvis filen har en filtypenavn, gemmes dens første tre tegn i aliaset. Det tilsvarende navn dannes ved at oversætte tegnene i det lange filnavn til OEM-kodningen, hvor alle mellemrum i det lange navn ignoreres, og tegn, der ikke kan oversættes i OEM eller forbudte i forbindelse med det korte navn, erstattes med en understregning "_". Cifferets hale "~n", hvor n = 1 ÷ 999999, føjes til aliasset, hvis det oprindeligt opnåede alias var i konflikt med navnet på en fil i samme mappe eller var længere end 8.3-standarden definerer, eller hvis et tegn, når ændring af kodning fandt ikke en OEM-modstykke og blev erstattet af en understregning. Således dannes aliaser som NEWFIL~1.DJV (LFN = New file for me.djvu). Filaliasing-skemaet er optimeret til hastighed og er derfor uforudsigeligt i detaljer.

Et filnavn, der ikke er et multiplum af 13 tegn, udfylder ikke fuldstændigt navnefelterne for LFN-poster i FAT-tabellen. I dette tilfælde afsluttes filnavnet kunstigt med et NUL-tegn (0x00), og overskydende bytes tilstoppes med enere (det vil sige med 0xFF-tegn).

For lange navne er længden af ​​navnet begrænset til 255 tegn, NUL-separatoren ikke medregnet, og den fulde sti er begrænset til 260 tegn, inklusive NUL. Det lange navn tillader også brugen af ​​seks specialtegn, der er forbudt i korte navne: +,; =[]

Hvis du forsøger at oprette en fil eller et bibliotek på en FAT32-diskenhed med et navn, der indeholder et sådant tegn, genereres der automatisk en LFN-post, uanset længden af ​​filnavnet. En lignende proces opstår, når du opretter en fil/mappe med et navn, der indeholder ikke-ASCII-tegn.

Det er muligt, at bindetiketfilen ikke fysisk går forud for alle poster i bindet med lange navne (når bindet ikke har en etiket, eller etiketten blev tildelt efter en fil med et langt navn blev skrevet). Så vil volumenetiketten i FAT12/FAT16 ikke blive vist korrekt, da den vil blive taget fra den nærmeste LFN-record (fordi den også har VOLUME_ID attributten), og hvis du forsøger at ændre volumenetiketten, navnet på den tilsvarende fil faktisk vil blive overtrådt. Når du sletter en fil, der har tilknyttet LFN-poster, påvirkes sidstnævnte ikke og bliver forældreløse. Under den videre oprettelse af en ny fil kan den nævnte forældreløse fil fejlagtigt associeres med den, hvis kontrolsummerne for navnene på de gamle og nye filer stemmer overens med den anvendte kontrolsumberegningsalgoritme (ASCII-koden for det første tegn i filen alias forskydes cyklisk en smule til højre og koden for det næste tegn tilføjes osv. d) gør denne sandsynlighed ubetydelig.

Betydning af filoperationer i FAT

Volumenformatering  - indeksmarkørtabellen nulstilles, undtagen de tre første (FAT[0] og FAT[1], er reserveret, og FAT[2] indeholder en indgang, der svarer til volumenetiketten, eller, hvis den mangler, EOC-mærket) og registreringer af beskadigede klynger; rodbiblioteksposterne er sat til nul (undtagen volumenetikettefilen, hvis nogen), ellers påvirkes dataområdet ikke.

Filsletning  - det første tegn i filposten og alle tilknyttede LFN-poster erstattes af koden 0xE5; de klynger, der er optaget af filen, er markeret som ledige i FAT-tabellen, men klyngerne i dataområdet påvirkes ikke.

Oprettelse af en fil eller et bibliotek med kommandoen "Ny" i kontekstmenuen - en filpost oprettes for en ny "tom" fil med et standardnavn (for eksempel "Ny mappe") og en størrelse bestemt af filtypen; selve filen, hvis den har en størrelse, der ikke er nul (hvilket er sandt for næsten alle "tomme" filer, undtagen mapper og tekstdokumenter), skrives til dataområdet i de klynger, der er allokeret til den; den tilsvarende klyngekæde oprettes i FAT-tabellen. Efter at have givet filen et gyldigt navn (ikke standard), markeres den oprindeligt oprettede filpost som slettet, og en ny oprettes.

Omdøbning af en fil  - en ny post oprettes med et opdateret navn; den gamle post er markeret som slettet.

Lagring af en fil fra applikationen (ikke fra kommandolinjen) - der oprettes en post indeholdende alle felter undtagen størrelsen og indledende klynge af filen; efter at filen er gemt, oprettes en ny post, der indeholder alle felterne, og den gamle post slettes.

Kopiering af en fil  - en identisk filpost oprettes på den nye placering (evt. bortset fra nogle tidsstempler, se ovenfor), den første ledige klynge allokeres til filen og indholdet af filen kopieres til den nye placering, mens der kopieres nuværende klynge, søger efter den næste ledige og udfylder FAT-tabellen .

Flytning af en fil (mellem forskellige volumener) - kopiering og sletning af filen fra dens oprindelige placering.

Filflytning (inden for volumen) - klyngekæden påvirkes ikke, filposten kopieres uændret til den nye mappe og slettes derefter fra den gamle.

Søgningen efter en ledig klynge i tabellen over indeksmarkører til tildeling til en ny fil starter generelt ikke fra begyndelsen af ​​dataområdet (det vil sige fra klynge 2), men fra den sidste klynge, der er allokeret til en fil, antallet af som er gemt i FSInfo strukturen. Med andre ord, hvis fil 1 blev tildelt klynge 30, og fil 2 blev tildelt klynge 31, og derefter fil 1 blev slettet, så når en ny fil 3 er oprettet, vil den højst sandsynligt være fysisk placeret fra klynge 32.

Systemfejltolerance

Da FAT-systemet gemmer data om filer og data om ledig diskplads i den samme tabel, vil filskrivningsoperationen, som traditionelt består af to trin (tilføje den besatte blok til listen over optaget og slette den samme blok fra listen over frie), forekommer i FAT i én handling. På grund af dette har FAT-systemet en iboende fejltolerance, det vil sige, at en fejl (for eksempel strøm) på tidspunktet for en læse- eller skriveoperation i de fleste tilfælde ikke vil føre til ødelæggelse af filsystemet. Men i dette tilfælde taler vi om filsystemets integritet og ikke selve filerne.

Karakteristika [3]

FAT12 FAT16 FAT32
Udvikler Microsoft
Fuld titel Filfordelingstabel
(12 bit version) (16-bit version) (32-bit version)
Fremlagde 1980 ( Microsoft Disk BASIC ) August 1984 ( MS-DOS 3.00, afkortet)
fuld - juli 1988, MS-DOS 4.0 [6]
august 1996 (Windows 95 OSR 2)
Bind ID 0x01 ( MBR ) 0x04, 0x06, 0x0E (MBR) 0x0B, 0x0C (MBR)
EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 ( GPT )
strukturer
Katalogindhold Bord
Filplacering Lineær liste
Dårlige blokke Cluster tagging
Begrænsninger
filstørrelse 32 MB _ 2 GB _ 4 GB
Antal klynger 4084 65 524 268 435 445 (2 28 -12)
Filnavnets længde 8,3 eller 255 tegn ved brug af LFN
Volumen størrelse 2 MB (512 bytes pr. sektor)

32 MB (64 KB pr. klynge)

2 GB
4 GB (64 KB pr. klynge, understøttes ikke overalt)
2 TB
8 TB (32 KB pr. sektor)
Evner
Gemte datoer Oprettelse, ændring, adgang
Datointerval 1. januar 1980 - 31. december 2107
Yderligere Information Oprindeligt ikke understøttet
Fil attributter Skrivebeskyttet, skjult, system, volumetiket, undermappe, arkiv
Differentiering af adgangsrettigheder Ikke
Transparent kompression Standalone hjælpeprogrammer ( Stacker , DoubleSpace , DriveSpace )
Transparent kryptering Tredjepartsværktøjer eller DOS-kloner

Licensering

Nogle algoritmer til at arbejde med FAT og VFAT er patenteret af Microsoft.

I USA om genovervejelse[ hvornår? ] blev det besluttet at annullere nogle af patenterne, men så blev det annulleret.

I oktober 2006 blev et patent på VFAT udstedt af European Patent Office [7] annulleret i Tyskland for åbenbarhedens skyld .

Med tiden blev FAT meget brugt i forskellige enheder for kompatibilitet mellem DOS, Windows, OS/2, Linux. Microsoft har ikke vist nogen hensigt om at tvinge dem til at licensere[ præciser ] [8] .

I februar 2009 sagsøgte Microsoft TomTom , en producent af Linux -baserede bilnavigationssystemer , for patentkrænkelse [9] .

Ifølge Jeremy Ellison[ præciser ] Microsofts mål er at præsentere forskellige virksomheder for et valg: indgå en patentbeskyttelsesaftale med Microsoft (som f.eks. Novell indgik med det i november 2006), og derved overtræde GNU GPL og gøre det umuligt for dem selv at bruge Linux , eller ikke indgå en sådan aftale og blive anklaget for at krænke patenter, hvis beskyttelse ydes ved indgåelsen af ​​dem på betingelse af hemmeligholdelse [10] [11] .

I marts 2009 indgav TomTom et modkrav for patentkrænkelse [12] .

Se også

Noter

  1. Arkiveret kopi . Hentet 9. juni 2009. Arkiveret fra originalen 16. juli 2011.
  2. www.microsoft.com/mscorp/ip/tech/fathist.asparchive.org
  3. 1 2 Microsoft Extensible Firmware Initiative FAT32 filsystemspecifikation 1.03 (link ikke tilgængeligt) . Microsoft (6. december 2000). — Dokument i Microsoft Word-format, 268 Kb. Hentet 5. april 2010. Arkiveret fra originalen 22. august 2011. 
  4. Hvad med VFAT? (utilgængeligt link) . TechNet Arkiv . Microsoft (15. oktober 1999). Hentet 5. april 2010. Arkiveret fra originalen 22. august 2011. 
  5. Forveksle ikke VFAT-filsystemudvidelsen med filsystemdriveren af ​​samme navn, som dukkede op i Windows for Workgroups 3.11 og er designet til at behandle MS-DOS-funktionskald (INT 21h) i beskyttet tilstand (se: KB126746: Windows for Workgroups Versionshistorik (ikke tilgængelig (link) VERSION 3.11 → Ikke-netværksfunktioner Microsoft (14. november 2003) Hentet 5. april 2010. Arkiveret fra originalen den 22. august 2011.  )
  6. MS-DOS-partitioneringsoversigt (downlink) . microsoft.com . Hentet 23. oktober 2012. Arkiveret fra originalen 23. oktober 2012. 
  7. Federal Patent Court erklærer Microsofts FAT-patent for ugyldigt  (engelsk)  (link ikke tilgængeligt) . heise online . Heise Zeitschriften Verlag (2. marts 2007). Hentet 10. marts 2009. Arkiveret fra originalen 22. august 2011.
  8. Brian Kahin. Microsoft Roils the World med FAT-patenter  (engelsk)  (link ikke tilgængeligt) . The Huffington Post (10. marts 2009). Hentet 10. marts 2009. Arkiveret fra originalen 22. august 2011.
  9. Ryan Paul. Microsoft-sag over FAT-patenter kunne åbne OSS Pandora's Box  (eng.)  (utilgængeligt link) . Ars Technica . Condé Nast Publications (25. februar 2009). Hentet 9. marts 2009. Arkiveret fra originalen 22. august 2011.
  10. Glyn Moody. Den virkelige årsag til Microsofts TomTom-retssag  (engelsk)  (link ikke tilgængeligt) . computerverden UK . IDG (5. marts 2009). Hentet 9. marts 2009. Arkiveret fra originalen 22. august 2011.
  11. Steven J. Vaughan-Nichols. Linux-virksomheder underskriver Microsofts patentbeskyttelsespagter  (eng.)  (utilgængeligt link) . Computerworld Blogs . IDG (5. marts 2009). Hentet 9. marts 2009. Arkiveret fra originalen 22. august 2011.
  12. Erica Ogg. TomTom anklager Microsoft i patenttvist  (eng.)  (utilgængeligt link) . CNet (19. marts 2009). Hentet 20. marts 2009. Arkiveret fra originalen 22. august 2011.

Links