tévék. Konzolok. Projektorok és tartozékok. Technológiák. Digitális TV

Fat fájlrendszer szerkezete. Mi a teendő, ha elvesznek az adatok. FAT32 fájlrendszer

Ezt a fájlrendszert olyan operációs rendszerek használják, mint a Windows NT/2000/XP. Az NTFS telepítésekor a lemez két egyenlőtlen részre oszlik: az első az MFT-hez (Master File Table - egy közös fájltábla) van hozzárendelve, az úgynevezett MFT zóna, és a teljes lemezméret körülbelül 12% -át foglalja el, a második rész pedig maguk az Ön adatai foglalják el. Van egy harmadik zóna is, de erről majd később. Milyen vadállat ez az MFT? Ez az NTFS alapja. Mint korábban említettük, az MFT zónában, azaz a lemez elején található. Az MFT-ben minden bejegyzés egy fájlnak felel meg, és körülbelül 1 Kb-ot foglal el. Lényegében ez a lemezen található összes fájl könyvtára. Meg kell jegyezni, hogy az NTFS-ben minden adatelem fájlnak minősül, még az MFT is. Az első 16 fájl (metafájl) az MFT zónában egy speciális kaszt. Szervizinformációkat tartalmaznak, fix helyzetűek és még az operációs rendszer számára sem elérhetők. Egyébként ebből a 16-ból az első maga az MFT fájl. Az első három bejegyzés másolata létezik. Ne feledje, a harmadik zónáról beszéltem, tehát ott van, és a helyzetével úgymond kettéosztja a lemezt. Miért tették ezt? Igen, a biztonság kedvéért az MFT fájlban lévő információ elvesztése esetén mindig visszaállíthatja az információkat, és akkor ez technológia kérdése, ahogy mondani szokás. Az MFT zónában lévő összes többi fájl tetszőlegesen megtalálható. Meg kell jegyezni, hogy elméletileg az MFT zónában nincs semmi, kivéve a szervizfájlokat. De vannak esetek, amikor nem marad hely a lemeznek azon a részén, amely a felhasználó számára van fenntartva: - (és ekkor az MFT zóna lecsökken. Ennek megfelelően a lemez második felében megjelenik a hely az adatok rögzítésére. Amikor elég szabad hely szabadul fel ebben a zónában, MFT - a zóna ismét kitágul. És itt megjelenik a probléma. A közönséges fájlok bekerülnek az MFT zónába és elkezd töredezni. Ez persze nem végzetes, de nem sok kellemes itt de térjünk vissza a birkáinkhoz, vagyis a metafájlokhoz. Mindegyik felelős bármely munkaterületért. $ névszimbólummal kezdődnek (aki programozással foglalkozik ismeri az ikont). Adok egy példa néhány közülük:

  • Az MFT nem más, mint maga az MFT
  • MFTmirr - ugyanaz a másolat, amely a lemez közepén található
  • A LogFile egy naplófájl
  • Boot – ahogy a neve is sugallja, Őfelsége a boot szektor
  • Bitmap - a partíció szabad helyének térképe

Stb. A metafájlokkal kapcsolatos információk az MFT fájlban találhatók. Nehéz? Van ilyen. De mindezt a szemetet az NTFS megbízhatóságának növelésére találták ki, és indokolt. Menjünk tovább. Az NTFS gyakorlatilag nem korlátozza a lemezméreteket (legalábbis a jelenlegi merevlemez-gyártási technológiákkal). A klaszter mérete 512 b és 64 Kb között változhat, bár a szokásos mérete 4 Kb.

Most beszéljünk a katalógusról. Ez egy metafájl $ jelöléssel. . Részekre van osztva, amelyek mindegyike tartalmazza a fájl nevét, attribútumait és az MFT fájlra mutató hivatkozást. És az összes többi információ már ott van. A könyvtár egy bináris fa. Próbáljuk kitalálni, miféle baromság ez. A könyvtárban a lemezen lévő adatokkal kapcsolatos információk úgy helyezkednek el, hogy egy fájl keresése során a könyvtár két részre oszlik, és a válasz abban rejlik, hogy melyik rész tartalmazza azt, amit keres. Ugyanez a művelet megismétlődik a kiválasztott felén. És így tovább, amíg meg nem találja a kívánt fájlt.

És most a fájlokról. Ilyenek nem léteznek. Normális, igen! Vannak úgynevezett patakok, vagy normál orosz nyelven - patakok. Vagyis bármely információegység több folyamot képvisel. Az egyik szál maga az adat, ez a fő. A többi adatfolyam fájlattribútum. Bármilyen fájlhoz bármilyen más fájlt csatolhat. Egyszerűen fogalmazva, egy teljesen új adatfolyamot csatolhat ugyanazon adatok folyamaihoz, és új adatokat írhat oda. A fájlméretre vonatkozó információkat azonban a fő adatfolyam hangereje alapján veszik. A lemezen lévő üres vagy kisméretű fájlok csak metafájlokban jelennek meg. Ez a lemezterület megtakarítása érdekében történt. Általánosságban meg kell jegyezni, hogy a fájl fogalma sokkal mélyebb és tágabb, és meglehetősen nehéz az összes tulajdonságot leírni. Kérjük, vegye figyelembe, hogy a fájlnév maximális hossza elérheti a 255 karaktert.

Ezenkívül az NTFS-fájlok olyan csodálatos tulajdonsággal rendelkeznek, mint a tömörített. Bármely fájl vagy akár könyvtár tömöríthető. Maga a tömörítési művelet észrevétlenül történik, mivel sebessége meglehetősen magas. A kupac előtt úgynevezett virtuális tömörítést alkalmaznak, azaz a fájl egyik része tömöríthető, de a másik nem. A tömörítés blokkokban történik. Minden blokk 16 klaszternek felel meg.

Az NTFS adattitkosítást használ. Így ha a rendszert lebontotta és újra telepíti, megfelelő jogosultság nélkül nem tudja majd elolvasni a titkosított fájlokat.

Most a fakitermelésről. De először definiáljuk a tranzakció fogalmát. A tranzakció olyan művelet, amelyet teljes egészében végre kell hajtani (jól kell olvasni), különben egyáltalán nem kerül végrehajtásra. Tehát ezen szemétség alapján, ha hiba történik az adatok lemezre írása közben, akkor az új fájlról nem készül feljegyzés a metafájlokban. A felvétel megkezdésének helye pedig tisztának minősül. Ez azért szükséges, hogy megvédjük :-) a különböző típusú aranyérektől. Egyszóval a végére teljesítettem az akciót - készítettem felvételt, nem sikerült - és nem kell rögzíteni. De meg kell jegyezni, hogy a naplózó funkció a fájlrendszer funkcionalitását őrzi meg, nem az Ön adatait.

És végül az NTFS-nek két további funkciója van: a Symbolic Links – virtuális könyvtárak létrehozásának képessége, valamint a Hard Links – több név támogatása ugyanannál a fájlnál.

Jelenleg ez a fájlrendszer a leggyakoribb, bár a Windows XP megjelenése után fokozatosan elveszíti pozícióját. A Windows család összes operációs rendszere a Windows 95 OSR2-től kezdve támogatja a FAT 32-t. Tehát a FAT 32 (File Allocation Table) egy táblázat a fájlkiosztáshoz. Szinte a lemez elején található. FAT lemez szerkezete:

    1. a fő és a kiegészítő partíciók rendszerindító szektorai;
    2. a logikai lemez indító szektora;
    3. gyökérkönyvtár;
    4. adatterület;
    5. henger diagnosztikai olvasási/írási műveletek végrehajtására;

A FAT 32 fő előnye a FAT 16-tal szemben, hogy 16 bites bejegyzések helyett 32 bites bejegyzéseket használnak. Ez viszont 268 435 456-ra növeli a fürtök számát a partícióban (a FAT-ban 65 536). FAT 32 használatakor a kötet mérete 2 Tb, egy fájl mérete pedig elérheti a 4 Gb-ot. Észrevehető különbség a FAT 32 és a korábbi táblák között, hogy a gyökérkönyvtár nem foglal fix lemezterületet, és bármilyen méretű lehet.

A fürtméret FAT 32 használatakor egy 2 Gb-os partícióban 5000 fájllal 4 Kb (FAT-ban 16-32 Kb), a táblázat legfeljebb 524 288 rekordot használ. Ebben az esetben maga a táblázat körülbelül 2 MB lesz.

Az NTFS és a FAT 32 összehasonlítása.

Nos, térjünk rá a két fájlrendszer összehasonlításának hálátlan feladatára.

Előnyök:

    1. Gyors hozzáférési sebesség kis fájlokhoz;
    2. A lemezterület mérete ma gyakorlatilag korlátlan;
    3. A fájlok töredezettsége magát a fájlrendszert nem érinti;
    4. Az adattárolás és maga a fájlstruktúra nagy megbízhatósága;
    5. Nagy teljesítmény, ha nagy fájlokkal dolgozik;

Hibák:

    1. Magasabb követelmények a RAM kapacitással szemben, mint a FAT 32;
    2. A közepes méretű katalógusokkal való munka a töredezettségük miatt nehézkes;
    3. Lassabb működési sebesség a FAT 32-höz képest

Előnyök:

    1. Nagy sebesség;
    2. Alacsony RAM-igény;
    3. Hatékony munka közepes és kisméretű fájlokkal;
    4. Kisebb lemezkopás a kevesebb olvasó/író fejmozgás miatt.

Hibák:

    1. Alacsony védelem a rendszerhibák ellen;
    2. Hatástalan munka nagy fájlokkal;
    3. Egy partíció és fájl maximális kötetének korlátozása;
    4. Csökkent teljesítmény a töredezettség miatt;
    5. Csökkentett teljesítmény, ha nagyszámú fájlt tartalmazó könyvtárakkal dolgozik;

Szóval néhány gondolat. Mindkét fájlrendszer 512 b méretű fürtökben tárolja az adatokat. A szokásos klaszterméret általában 4 Kb. Valószínűleg itt ér véget a hasonlóság. Valami a töredezettségről: Az NTFS teljesítménye meredeken csökken, ha a lemez 80-90%-ban megtelt. Ennek oka a szolgáltatási és munkafájlok töredezettsége. Minél többet dolgozik ilyen elfoglalt lemezzel, annál erősebb a töredezettség és annál alacsonyabb a teljesítmény. A FAT 32-ben a lemez munkaterületének töredezettsége a korábbi szakaszokban történik. A lényeg itt attól függ, hogy milyen gyakran ír/töröl adatokat. Az NTFS-hez hasonlóan a töredezettség nagymértékben csökkenti a teljesítményt. Most a RAM-ról. Maga a FAT 32 táblázat térfogata körülbelül több megabájtot foglalhat el a RAM-ban. De a gyorsítótárazás segít. Ami a gyorsítótárba van írva:

    1. A leggyakrabban használt könyvtárak;
    2. Adatok az összes jelenleg használt fájlról;
    3. Adatok a szabad lemezterületről;

Mi a helyzet az NTFS-szel? A nagy könyvtárakat nehéz gyorsítótárazni, és több tíz megabájtot is elérhetnek. Plusz MFT, plusz információ a szabad lemezterületről. Bár meg kell jegyezni, hogy az NTFS továbbra is meglehetősen gazdaságosan használja a RAM erőforrásokat. Sikeres adattárolási rendszerünk van, az MFT-ben minden rekord kb. 1 Kb. De ennek ellenére a RAM mennyiségére vonatkozó követelmények magasabbak, mint a FAT 32 esetében. Röviden, ha a memória kisebb vagy egyenlő, mint 64 Mb, akkor a FAT 32 hatékonyabb lesz a sebesség szempontjából. Ha több, akkor a A sebességkülönbség kicsi lesz, és gyakran egyáltalán nem. Most magáról a merevlemezről. Az NTFS használatához Bus Mastering szükséges. Mi ez? Ez a vezető és a vezérlő egy speciális üzemmódja. A BM használatakor a csere a processzor részvétele nélkül történik. A virtuális gép hiánya befolyásolja a rendszer teljesítményét. Ráadásul a bonyolultabb fájlrendszer alkalmazása miatt megnő az író/olvasó fejek mozgásainak száma, ami szintén befolyásolja a sebességet. A lemezgyorsítótár jelenléte egyformán pozitív hatással van az NTFS-re és a FAT 32-re is.

Sok felhasználó szembesül azzal, hogy nem ismeri a Windows fájlrendszerek alapjait. Úgy tűnik, miért egy felesleges elmélet? Valójában a különféle fájlrendszerek mély működésének ismerete lehetővé teszi, hogy helyesen válasszon ki egy vagy másik fájlrendszert egy adott adathordozóhoz. Néha egy választási hiba kritikussá válhat később, amikor megoldják az információ-helyreállítás vagy az adathordozó idő előtti elhasználódásának problémáját.

A fájlrendszer egy fájlkezelő rendszerből és egy adott típusú adathordozón (CD, DVD, FDD, HDD, Flash stb.) lévő fájlok gyűjteményéből áll. A fájlkezelő rendszer lehetővé teszi a felhasználóknak és az alkalmazásoknak, hogy hozzáférjenek a fájlokhoz, elmentsék azokat, és fenntartsák tartalmuk integritását. A modern számítástechnikai rendszerek leggyakoribb hosszú távú tárolóeszköze a merevlemez - "Winchester". Ez a kifejezés minden aerodinamikailag tervezett mágneses olvasófejjel ellátott lezárt lemezre vonatkozik.

A modern operációs rendszerek fájlrendszerei a merevlemez-partíciókra vannak telepítve.

FAT 32. Egyszerűség és megbízhatóság.

Három FAT fájlrendszer létezik: FAT12 (FDD hajlékonylemezekhez), FAT16, FAT32. Különböznek a bitek számában (12, 16, 32), amelyek jelzik a fürt számát a fájlkezelő rendszerben. A FAT fájlrendszerekben bármely logikai meghajtó logikai lemezterülete rendszerterületre és adatterületre van felosztva. BR – Boot Record; RS – fenntartott szektorok; FAT1, FAT2 – 1. és 2. fájlkiosztási tábla; RDir (gyökérkönyvtár, ROOT) – gyökérkönyvtár. Az adatterület fürtökre van osztva, amelyek 1 vagy több szomszédos szektort képviselnek. Egy FAT táblában az ugyanahhoz a fájlhoz tartozó fürtök láncba vannak kapcsolva. Az adatterület térképe valójában a File Allocation Table (FAT) A FAT tábla minden eleme (12, 16 vagy 32 bit) egy-egy lemezfürtnek felel meg, és jellemzi annak állapotát: szabad, foglalt vagy rossz klaszter.. A fürtszám jelzésére a FAT16 fájlkezelő rendszerben egy 16 bites szót használnak, és 65536 fürtöket lehet megcímezni.

A fürt egy fájlhoz lefoglalt lemezmemória minimálisan címezhető egysége. Egy fájl vagy könyvtár egész számú klasztert foglal el. Az adatterület fürtökre való felosztása szektorok helyett lehetővé teszi: a FAT tábla méretének csökkentését, a fájlok töredezettségének csökkentését, a fájlláncok hosszának csökkentését, a fájlok elérésének felgyorsítását. Előfordulhat, hogy az utolsó fürt nincs teljesen kihasználva, ami észrevehető lemezterület-vesztéshez vezet, ha a fürt mérete nagy. Hajlékonylemezen a fürt 1 vagy 2 szektort foglal el. A merevlemez 4, 8, 16, 32, 64 szektort tartalmaz egy klaszterben. Minden elem a következő struktúrával rendelkezik: fájlnév, fájlattribútum, tartalék mező, létrehozási idő, létrehozás dátuma, utolsó hozzáférés dátuma, tartalék, utolsó módosítás dátuma, utolsó módosítás ideje, Kövér kezdeti klaszterszám, fájl mérete.

Ebben a példában a MyFile.txt nevű fájl a 8. fürttől kezdve kerül elhelyezésre, és 12 fürtöt foglal el. A klaszterek lánca erre az esetre: 8,9,A,B,15,16,17,19,1A,1B,1C,1D. A 18-as számú klasztert az F7 kód rosszként jelöli. Nem használható adatok tárolására. Ezt a kódot a lemezformázó és ellenőrző segédprogramok állítják be. Az 1D klaszter az FF kóddal van megjelölve, mint az ehhez a fájlhoz tartozó utolsó. A szabad fürtöket 0 kód jelöli. Új fürt lefoglalásakor a rendszer az első szabad fürtöt veszi fel a fájlba íráshoz. A lemezen lévő fájlok módosítása, törlése, áthelyezése, növekedése és zsugorodása során ez az elhelyezési szabály töredezettséghez, azaz töredezettséghez vezet. egy fájl adatai nem szomszédos klaszterekben találhatók, hanem néha nagyon távol vannak egymástól. Összetett lánc képződik. Ez lassabb munkavégzéshez vezet a fájlokkal. Mivel a zsírt nagyon intenzíven használják a lemezelérés során, a RAM-ba töltődik. A Fat32 rendszer sokkal hatékonyabban használja a lemezterületet, mert a Fat korábbi verzióihoz képest kisebb fürtöket használ. A Fat16-hoz képest ez 10-16%-os megtakarítást jelent.

Egy címtárelem attribútummezője a következő értékeket tárolhatja:

1) archívum (a fájl módosítása és eltávolítása esetén kerül telepítésre egy olyan program által, amely biztonsági másolatot készít a fájlokról egy másik adathordozóra);

2) címtár;

3) kötetcímke;

4) szisztémás;

5) rejtett;

6) csak olvasható.

A FAT32-ben a hosszú neveket több címtárbejegyzés használatával biztosítják: egy fájlhoz (egy bejegyzés egy bejegyzés a 8.3-as névhez, és 24 bejegyzés a leghosszabb névhez, amely legfeljebb 256 karakterből állhat. Ezért nem ajánlott használj hosszú neveket.

A FAT fő hátránya a fájlok lassú feldolgozása. Fájl létrehozásakor az a szabály, hogy az első szabad fürt kerül lefoglalásra. Ez a lemez töredezettségéhez és összetett fájlláncokhoz vezet. Ez lassabb fájlmunkát eredményez.

Alapvetően a FAT fájlrendszert ma kerülni kell. Ezért létfontosságú, hogy válasszon egy megfelelőt, amely lehetővé teszi, hogy elkerülje ezt a fájlrendszert.

NTFS: kényelem és nagy sebesség.

Az NTFS-szel való munka során használt egyik fő fogalom a kötet fogalma. Lehetőség van olyan hibatűrő kötet létrehozására, amely több partíciót foglal el, azaz RAID technológiát használ. Az NTFS a köteten lévő összes használható lemezterületet fürtökre osztja fel – adatblokkokra, amelyek adategységként vannak megcímezve. Az NTFS 512 bájttól 64 KB-ig támogatja a fürtméreteket; 2 vagy 4 KB lemez van lefoglalva az MFT zóna számára – ez a terület, amelyet az MFT fő szolgáltatási metafájl tud elfoglalni, és annak mérete nő. Erre a területre nem lehet adatokat írni. Az MFT zóna üres, így a szolgáltatásfájl (MFT) nem töredezett meg növekedése során.

Az MFT (közös fájltábla) a lemezen lévő összes többi fájl központi könyvtára, beleértve magát. Az MFT rögzített méretű, 1 KB-os rekordokra van felosztva, amelyek mindegyike egy fájlnak felel meg. Az első 16 fájl szolgáltatás jellegű, és nem érhető el az operációs rendszer számára – ezeket metafájloknak nevezik, a legelső metafájl pedig maga az MFT. Ez az első 16 MFT elem a lemez egyetlen olyan része, amelynek szigorúan rögzített pozíciója van. Ugyanennek a 16 bejegyzésnek a másolata a kötet közepén található a biztonság kedvéért, mivel nagyon fontosak. Az MFT fájl fennmaradó részei tetszőleges helyeken helyezkedhetnek el a lemezen - a pozícióját maga a fájl segítségével állíthatja vissza, „elkapva” az első MFT elemen. Az NTFS-ben minden fájl adatfolyammal van ábrázolva, nem tartalmaz adatokat, hanem "folyamokat". Az egyik adatfolyam a fájladatok. Egy fájlhoz több adatfolyamot is meghatározhat.

Az NTFS főbb jellemzői:

A nagy lemezeken végzett munka hatékonyan történik (sokkal hatékonyabban, mint a FAT-ban);

Vannak eszközök a fájlokhoz és könyvtárakhoz való hozzáférés korlátozására;

Az NTFS-partíciók helyi biztonságot nyújtanak mind a fájlok, mind a könyvtárak számára;

Bevezetésre került egy tranzakciós mechanizmus, amelyben a fájlműveletek naplózásra kerülnek;

A megbízhatóság jelentős növekedése;

A lemezszektorok és/vagy -fürtök maximális számára vonatkozó számos korlátozás megszűnt;

Az NTFS fájlnév a FAT és HPFS fájlrendszerekkel ellentétben bármilyen karaktert tartalmazhat, beleértve a nemzeti ábécék teljes készletét is, mivel az adatok Unicode-ban vannak ábrázolva – egy 16 bites reprezentáció, amely 65535 különböző karaktert ad. A fájlnév maximális hossza NTFS-ben 255 karakter.

Az NTFS beépített tömörítési képességekkel is rendelkezik, amelyeket egyedi fájlokra, teljes könyvtárakra, sőt kötetekre is alkalmazhat (majd tetszés szerint visszavonhatja vagy újra rendelheti őket). Az NTFS-ben lévő könyvtár egy speciális fájl, amely más fájlokra és könyvtárakra mutató hivatkozásokat tárol.

Az NTFS fájlszintű biztonságot nyújt; ez azt jelenti, hogy a kötetekhez, könyvtárakhoz és fájlokhoz való hozzáférési jogok a felhasználói fióktól és a csoportoktól függhetnek, amelyekhez a felhasználó tartozik. Minden alkalommal, amikor egy felhasználó hozzáfér egy fájlrendszer-objektumhoz, a rendszer összeveti hozzáférési jogait az adott objektum engedélylistájával. Ha a felhasználónak megfelelő jogosultságai vannak, kérését teljesítik; ellenkező esetben a kérelmet elutasítják. Ez a biztonsági modell vonatkozik mind az NT számítógépeken történő helyi felhasználói regisztrációra, mind a távoli hálózati kérésekre.

Az NTFS rendszer bizonyos öngyógyító képességekkel is rendelkezik. Az NTFS különféle mechanizmusokat támogat a rendszer integritásának ellenőrzésére, beleértve a tranzakciónaplózást, amely lehetővé teszi a fájlírási műveletek visszajátszását egy speciális rendszernaplóval.

Az NTFS fájlrendszer fő hátránya, hogy a szolgáltatási adatok sok helyet foglalnak el (például egy-egy könyvtárelem 2 KB-ot foglal el) - kis partíciók esetén a szolgáltatási adatok akár a médiamennyiség 25%-át is elfoglalhatják.

Így a fájlrendszer típusának kiválasztásakor nem valami elvont műveletet választunk, hanem olyan döntéseket hozunk, amelyek az egész rendszer egészét érintik. Miért ismerjük ilyen részletesen a fájlrendszer minden csínját-bínját? Ez szükséges az esetleges helyreállításához, amit a következő cikkek egyikében tárgyalunk =)

A FAT-ban a fájlnevek 8.3 formátumúak, és csak ASCII karakterekből állnak. A VFAT támogatja a hosszú (legfeljebb 255 karakteres) fájlneveket. Hosszú fájlnév, LFN). Rövid fájlnév). Az LFN-ek nem tesznek különbséget a kis- és nagybetűk között a keresés során, azonban a nagybetűkkel tárolt SFN-ekkel ellentétben az LFN-ek megőrzik a fájl létrehozásakor megadott kis- és nagybetűket.

FAT rendszer felépítése

A FAT fájlrendszerben a szomszédos lemezszektorokat fürtöknek nevezett egységekre egyesítik. A klaszterben lévő szektorok száma kettő hatványával egyenlő (lásd alább). Egész számú fürt (legalább egy) van lefoglalva a fájladatok tárolására, így például ha a fájl mérete 40 bájt, a fürt mérete pedig 4 KB, akkor a számára lefoglalt helynek csak 1%-a lesz ténylegesen elfoglalva. fájl információk alapján. Az ilyen helyzetek elkerülése érdekében célszerű csökkenteni a fürtök méretét, illetve csökkenteni a címinformáció mennyiségét és növelni a fájlműveletek sebességét, fordítva. A gyakorlatban valamilyen kompromisszumot választanak. Mivel a lemezkapacitás nem feltétlenül fejezhető ki egész számú klaszterben, általában a kötet végén vannak ún. többlet szektorok - egy klaszterméretnél kisebb „maradék”, amelyet az operációs rendszer nem tud lefoglalni információ tárolására.

A FAT32 kötettér logikailag három összefüggő területre oszlik:

  • Fenntartott terület. Tartalmaz olyan szolgáltatásstruktúrákat, amelyek a partíció rendszerindító rekordjához tartoznak (Partition Boot Record - PBR, hogy megkülönböztessük a Master Boot Recordtól - a lemez fő rendszerindító rekordjától; a PBR-t gyakran helytelenül rendszerindító szektornak is nevezik), és egy inicializáláskor használatosak. hangerő;
  • Egy FAT-tábla olyan területe, amely az adatterület klasztereinek megfelelő indexmutatók ("cellák") tömbjét tartalmazza. Általában a FAT-tábla két példánya van a lemezen a megbízhatóság érdekében;
  • Az adatterület, ahol rögzítésre kerül a fájlok tényleges tartalma - azaz szöveges fájlok szövege, képfájloknál a kódolt kép, hangfájloknál a digitalizált hang stb. -, valamint az ún. metaadatok – a fájlok és mappák nevére, attribútumaikra, létrehozási és módosítási idejére, méretére és lemezen való elhelyezésére vonatkozó információk.

A FAT12 és a FAT16 szintén kifejezetten lefoglalja a gyökérkönyvtár területet. Rögzített pozícióval (közvetlenül a FAT tábla utolsó eleme után) és szektorokban rögzített mérettel rendelkezik.

Ha egy fürt egy fájlhoz tartozik, akkor a megfelelő cella ugyanazon fájl következő fürtjének számát tartalmazza. Ha a cella a fájl utolsó fürtjének felel meg, akkor az egy speciális értéket tartalmaz (FFFF 16 FAT16 esetén). Ily módon fájlfürtök lánca épül fel. A táblázatban a nem használt klaszterek nulláknak felelnek meg. A „rossz” klaszterek (amelyek ki vannak zárva a feldolgozásból, például az eszköz megfelelő területének olvashatatlansága miatt) szintén egy speciális kódnak felelnek meg.

Fájl törlésekor a név első karakterét egy speciális kód E5 16 helyettesíti, és a fájlcsoportok lánca a kiosztási táblázatban nullára áll vissza. Mivel a fájlméretre vonatkozó információ (amely a fájlnév melletti könyvtárban található) érintetlen marad, ha a fájlfürtök egymás után helyezkedtek el a lemezen, és nem írták felül őket új információk, lehetőség van a törölt fájl visszaállítására.

Boot bejegyzés

Az első FAT kötetstruktúra neve BPB. BIOS paraméterblokk ), és egy fenntartott területen, a nulladik szektorban található. Ez a struktúra a fájlrendszer típusát és a tárolóeszköz (hajlékonylemez vagy merevlemez-partíció) fizikai jellemzőit azonosító információkat tartalmaz.

BIOS paraméterblokk

A BPB lényegében hiányzott az MS-DOS 1.x-et kiszolgáló FAT-ból, mivel akkoriban még csak kétféle kötet létezett - egyoldalas és kétoldalas 5 hüvelykes 360 KB-os hajlékonylemez, a kötetformátumot a FAT terület első bájtja. A BPB-t 1983 elején vezették be az MS-DOS 2.x-ben, mint kötelező rendszerindító szektor szerkezetet, amely ezentúl meghatározza a kötet formátumát; A FAT első bájtja alapján történő meghatározás régi sémája elvesztette támogatását. Az MS-DOS 2.0-ban is bevezették a fájlok és mappák hierarchiáját (ezelőtt minden fájl a gyökérkönyvtárban volt tárolva).

Az MS-DOS 2.x BPB-struktúrája 16 bites "szektorok teljes száma" mezőt tartalmazott, ami azt jelentette, hogy a FAT ezen verziója alapvetően nem alkalmazható 2 16 = 65 536 szektornál nagyobb, azaz 32 MB-nál nagyobb kötetekre. 512 bájt szabványos szektormérettel. Az MS-DOS 4.0-ban (1988) a fenti BPB mezőt 32 bitesre bővítették, ami azt jelentette, hogy az elméleti kötetméret 232 = 4 294 967 296 szektorra, vagyis 2 TB-ra nőtt 512 bájtos szektorral.

A BPB következő módosítása a Windows 95 OSR2-vel jelent meg, amely bevezette a FAT32-t (1996 augusztusában). A kötet méretének két gigabájtos korlátja megszűnt, egy FAT32-es kötet elméletileg akár 8 TB-os is lehet. Az egyes fájlok mérete azonban nem haladhatja meg a 4 GB-ot. A FAT32 BIOS-paraméterblokk a FAT korábbi verzióival való kompatibilitás érdekében megismétli a BPB FAT16-ot egészen a BPB_TotSec32 mezőig, amelyet a különbségek követnek.

A FAT32 "boot szektor" valójában három 512 bájtos szektor - a 0, 1 és 2 szektor. Mindegyik tartalmazza a 0xAA55 aláírást a 0x1FE címen, vagyis az utolsó két bájtban, ha a szektor mérete 512 bájt. Ha a szektor mérete meghaladja az 512 bájtot, akkor az aláírás mind a 0x1FE címen, mind a nulla szektor utolsó két bájtjában található, azaz megkettőződik.

FSIinfo

A FAT32-partíció rendszerindító rekordja egy ún. struktúrát tartalmaz FSIinfo, amely a köteten lévő szabad fürtök számának tárolására szolgál. Az FSInfo általában az 1. szektort foglalja el (lásd a BPB_FSInfo mezőt), és a következő szerkezettel rendelkezik (a szektor elejéhez viszonyított címek):

  • FSI_LeadSig. A 4 bájtos 0x41615252 aláírás azt jelzi, hogy a szektort az FSIinfo struktúra használja.
  • FSI_Reserved1. A szektor 4. és 483. bájtja közötti intervallum nullára áll vissza.
  • FSI_StrucSig. Egy másik aláírás a 0x1E4 címen található, és a 0x61417272 értéket tartalmazza.
  • FSI_Free_Count. A 0x1E8 címen található négybájtos mező a köteten lévő szabad fürtök számának utolsó értékét tartalmazza, amelyet a rendszer ismer. A 0xFFFFFFFF érték azt jelenti, hogy a szabad fürtök száma ismeretlen, és ki kell számítani.
  • FSI_Nxt_Free. A 0x1EC címen található négybájtos mező tartalmazza azt a fürtszámot, amelytől kezdve a szabad fürtök keresését el kell kezdeni az indexmutatók táblázatában. Ez a mező általában a fájl tárolására kijelölt utolsó FAT-fürt számát tartalmazza. A 0xFFFFFFFF érték azt jelenti, hogy a szabad fürt keresését a FAT tábla legelejétől, vagyis a második fürttől kell végrehajtani.
  • FSI_Reserved2. Fenntartott 12 bájtos mező a 0x1F0 címen.
  • FSI_TrailSig. Aláírás 0xAA550000 – az FSIinfo szektor utolsó 4 bájtja.

Az FSInfo bevezetésének lényege a rendszer működésének optimalizálása, hiszen a FAT32-ben az indexmutatók táblázata jelentős lehet, bájtonkénti átvizsgálása pedig jelentős időt vehet igénybe. Előfordulhat azonban, hogy az FSI_Free_Count és FSI_Nxt_Free mezők értéke nem megfelelő, ezért ellenőrizni kell a megfelelőséget. Ráadásul még az FSIinfo mentésben sem frissülnek, ami általában a 7-es szektorban található.

A FAT kötet típusának meghatározása

A kötet FAT-típusának meghatározását (vagyis a FAT12, FAT16 és FAT32 közötti választást) az operációs rendszer a kötetben lévő klaszterek száma alapján határozza meg, amit viszont a BPB mezők határoznak meg. Először is ki kell számítani a gyökérkönyvtár szektorainak számát:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

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

Végül meghatározzuk az adatterület-klaszterek számát:

CountofClusters = DataSec / BPB_SecPerClus

A fürtök száma alapján egyértelmű megfelelés van a fájlrendszerrel:

  • Clusterek száma< 4085 - FAT12
  • Clusterek száma = 4085 ÷ 65524 - FAT16
  • Clusterek száma > 65524 - FAT32

A hivatalos specifikáció szerint ez az egyetlen érvényes módja a FAT típus meghatározásának. A megadott megfelelőségi szabályokat sértő kötet mesterséges létrehozása azt eredményezi, hogy a Windows hibásan dolgozza fel azt. Javasoljuk azonban, hogy kerülje a kritikushoz közeli CountofClusters értékeket (4085 és 65525), hogy megfelelően meghatározhassa a fájlrendszer típusát bármely, gyakran hibásan megírt illesztőprogram által.

Idővel a FAT-ot széles körben kezdték használni különféle eszközökben a DOS, Windows, OS/2 és Linux közötti kompatibilitás érdekében. A Microsoft nem mutatott szándékot arra, hogy licensz kiadására kényszerítse őket [ adja meg] .

2009 februárjában a Microsoft szabadalombitorlás vádjával beperelte a TomTomot, a Linux-alapú autós navigációs rendszereket gyártó céget.

Megjegyzések

  1. http://cd.textfiles.com/megademo2/INFO/OS2_HPFS.TXT
  2. www.microsoft.com/mscorp/ip/tech/fathist.asp az archive.org címen
  3. Microsoft Extensible Firmware Initiative FAT32 fájlrendszer specifikáció 1.03. Microsoft (2000. december 6.). - Dokumentum Microsoft Word formátumban, 268 Kb. Archivált
  4. Mi a helyzet a VFAT-tal? . TechNet archívum. Microsoft (1999. október 15.). Az eredetiből archiválva: 2011. augusztus 22. Letöltve: 2010. április 5..
  5. A VFAT fájlrendszer-kiterjesztés nem tévesztendő össze az azonos nevű fájlrendszer-illesztőprogrammal, amely a Windows for Workgroups 3.11-ben jelent meg, és az MS-DOS (INT 21h) függvényhívások védett módban történő kezelésére szolgál (lásd: KB126746: Windows for Workgroups verzióelőzmények. VERZIÓ 3.11 → Nem hálózati szolgáltatások. Microsoft (2003. november 14.). Az eredetiből archiválva: 2011. augusztus 22. Letöltve: 2010. április 5..)
  6. A Szövetségi Szabadalmi Bíróság semmisnek nyilvánította a Microsoft FAT szabadalmát (angol). heise online. Heise Zeitschriften Verlag (2007. március 2.). Archivált
  7. Brian Kahin. A Microsoft felforgatja a világot a FAT szabadalmakkal. The Huffington Post (2009. március 10.). Az eredetiből archiválva: 2011. augusztus 22. Letöltve: 2009. március 10.
  8. Ryan Paul. A FAT szabadalmakkal kapcsolatos Microsoft-per megnyithatja az OSS Pandora's Box-ot (angol). Ars Technica. Condé Nast kiadványok (2009. február 25.). Archivált
  9. Glyn Moody.(Angol) . ComputerworldUK. IDG (2009. március 5.). Archiválva az eredetiből: 2011. augusztus 22. Letöltve: 2009. március 9..
  10. Steven J. Vaughan-Nichols. A Linux-cégek aláírják a Microsoft szabadalmi védelmi egyezményét (angol). Computerworld blogok. IDG (2009. március 5.). Archiválva az eredetiből: 2011. augusztus 22. Letöltve: 2009. március 9..
  11. Erica Ogg. A TomTom ellenpert indít a Microsoft ellen a szabadalmi vitában. CNet (2009. március 19.). Az eredetiből archiválva: 2011. augusztus 22. Letöltve: 2009. március 20.

Linkek

  • ECMA-107 (angol) FAT szabvány

Bárki, aki valaha is telepített operációs rendszert, találkozott azzal a ténnyel, hogy a merevlemez telepítési partíciójának formázásakor a program felkéri a FAT vagy NTFS fájlrendszer típusának kiválasztására.

És azoknak, akik véletlenül flash meghajtót vagy más külső tárolóeszközt formáztak, három fájlrendszer között kellett dönteniük: FAT32, NTFS és exFAT. A felhasználók leggyakrabban azért választják az alapértelmezett formázást, mert nem tudják, mi a különbség.

Ez a cikk azoknak szól, akik ezt a hiányt szeretnék pótolni tudásukban.

FAT fájl szerkezet: alapelvek és cél

Fájlszerkezet ill Fájlrendszer A Microsoft a múlt század 70-es éveiben fejlesztette ki, és egy bizonyos eljárást jelentett a számítógépeken és más digitális eszközökön lévő adatok tárolására és elérésére szolgáló tér megszervezésére.

A funkció célja, hogy a felhasználó számára kényelmes kezelést biztosítson a lemezen vagy külső modulon tárolt információkkal. A fájlrendszer tartalmaz fájlokat, mappákat és könyvtárakat, valamint egy sor olyan rendszereszközt, amelyek kölcsönhatásba lépnek velük az olvasás-írás, létrehozás-törlés, másolás, név stb. funkciók végrehajtásához. Ezenkívül ez a struktúra megszervezi az információkhoz való megosztott hozzáférést a felhasználók között, és védelmet nyújt a jogosulatlan műveletek ellen titkosítással, csak olvasható módban stb.

Szerkezetileg a teljes lemezterület fürtökre van osztva, mint egy kockás papírlap. Minden cella egy blokk, amelynek méretét a formázás során állítjuk be, és 2 többszörösének kell lennie. A minimális méret 512 bájt lehet (flash meghajtónál), merevlemeznél 32 KB. Egy fájl több ilyen klasztert is elfoglalhat. Képletesen elképzelhetjük a lemezterületet egy jegyzetfüzetként, ahol a fürt egy betű, a fájl egy szó, a fájlstruktúra pedig a jegyzetfüzet tartalomjegyzéke.

Egy fájl elérésekor az operációs rendszernek több fürtben kell megtalálnia, amelyek a lemez különböző helyein helyezkednek el, így fürtláncot alkotva. Minden klaszternek saját címkéje van, amely a három típus egyikeként azonosítja:

  1. Ingyenes, készen áll az adatok rögzítésére.
  2. Foglalt, amely az információk egy részét tárolja, és a címkében a lánc következő klaszterére vonatkozó adatokat tartalmazza, míg az utóbbit speciális címkével jelölik.
  3. A ROSSZ blokk egy hibákat tartalmazó fürt, amely a formázás után már nem érhető el.

A címke méretét a fájlstruktúra típusa határozza meg: FAT32 esetén 32 bájt.

A teljes fájlrendszer a következő részekből áll:

  • a lemez elején található rendszerindító szektor az OS rendszerindítása után aktiválódik, és tárolja a partíció paramétereit;
  • egy fájlallokációs táblázat („tartalomjegyzék”), amely a fürtcímkéket tárolja;
  • a fájlkiosztási táblázat másolatai az adatok helyreállításához, ha a fájlstruktúra megsérül;
  • gyökérkönyvtár;
  • adatterületek;
  • henger olvasási/írási műveletek végrehajtásához.

Háromféle FAT fájlrendszer létezik: FAT12, FAT16 és FAT32. A FAT-ot az NTFS váltotta fel, az exFAT pedig a FAT32 kiterjesztett változata, és főleg flash meghajtókhoz használják.

A FAT32, NTFS és exFAT fájlstruktúrák előnyei és hátrányai

A formázás legoptimálisabb fájlrendszerének kiválasztásához mindhárom lehetőség leírását megvizsgáljuk, mindegyik előnyeire és hátrányaira összpontosítva.

FAT32

A három vizsgált fájlstruktúra közül a FAT32 a legrégebbi. Felváltotta a FAT16-ot, és egészen a közelmúltig a legprogresszívebb volt. A FAT32 megjelenését a Windows 95 OSR2 operációs rendszer 1996-os kiadására időzítették. A fő megkülönböztető jellemzők: 32 bites fürtcímzés és méretkorlátozás: legfeljebb 4 GB-os fájl és 128 GB-os kötet.

Előnyök

Némi erkölcsi elmaradottsága ellenére a FAT32 számos előnnyel rendelkezik a többi fájlrendszerhez képest. Fő vonzereje a kompatibilitás és a sokoldalúság. A FAT32 az operációs rendszerek minden verziójával működik, beleértve a Windowst (az összes verzió összehasonlítása), a Linuxot és a MacOS-t, és minden USB-porttal rendelkező játékkonzolhoz és egyéb kütyühöz alkalmas. Ma már alapból minden külső meghajtóban (flash meghajtó, CD kártya) használják, hiszen sok régi eszköz: PC, laptop, set-top box USB bemenettel csak FAT32-vel működik.

A fájlrendszer további fontos előnyei: nagy sebességű teljesítmény, alacsony RAM-igény, produktív munka közepes és kis fájlokkal, valamint a kisebb fejmozgások miatti alacsony lemezkopás. Ugyanakkor töredezettség is fennáll, és az időszakos töredezettségmentesítés biztosan nem árt.

Hibák

Ennek a fájlrendszernek a fő hátránya a méretkorlátozás. A fürtök esetében ez nem lehet több 64 KB-nál, különben egyes alkalmazások hibásan számítják ki a lemezterületet.

A fájl mérete nem haladhatja meg a 4 GB-ot, így egy 32 KB-os fájlkiosztási tábla maximális lemezmérete körülbelül 8 TB.

A lemez formázásakor a ScanDisk programmal, amely egy 16 bites program, figyelembe véve magukat a FAT-táblákat és a maximális fürtméret 32 ​​KB, a kötet mérete 128 gigabájtra korlátozódik.

Figyelembe véve, hogy nem sok számítógépes eszköz van felszerelve 8 TB-nál nagyobb merevlemezzel, ez a hátrány a legtöbb felhasználó számára nem lesz észrevehető. Azonban az a tény, hogy a FAT32 legfeljebb 4 GB méretű fájlokkal működik, jelentős hátrány, mivel a legtöbb jó minőségű videofájl a modern 4K formátumban manapság nagyobb, mint ez a 4 GB, ezért nem kompatibilis ezzel a fájlrendszerrel.

A méretbeli korlátokon kívül a FAT32-nek más hátrányai is vannak. Nem támogatja a hosszú fájlneveket, ami nem túl kényelmes azoknak a felhasználóknak, akik logikailag szeretnék azonosítani a fájlokat tartalmuk alapján. Vannak panaszok a biztonsági rendszerre (egy további víruskereső nem ártana) és a fájlvédelemre hiba esetén (a merevlemezek jellemzői), valamint a sok fájlt tartalmazó könyvtárak alacsony sebességére.

Így a FAT32 alkalmasabb hordozható, kis kapacitású eszközökhöz és régebbi számítógépekhez. A Windows legújabb verziói már nem telepíthetők FAT32 rendszerrel formázott lemezre, újra kell formázni NTFS-re.

A FAT32 fájlrendszer fő felhasználási területe ma a hordozható flash meghajtók és SD-kártyák (szolgáltatások), amelyek kevés fájlt tartalmaznak, és számos digitális eszközzel kompatibilisek.

NTFS

Ezt a fájlrendszert a Microsoft fejlesztette ki 1993-ban, és a Windows NT 3.1 rendszerrel vezették be. Magában a címben új technológiai fájlrendszer, ami azt jelenti új technológiai fájlrendszer, progresszív lényege.

A lemez NTFS-ben történő formázása után három zónára oszlik:

  • MFT - zóna vagy általános fájltábla (Master File Table), ahol a fájlok és könyvtárak információi vannak tárolva;
  • felhasználói adat;
  • szolgáltatási információkat tartalmazó metafájlok.

Mindegyik metafájl egy adott területért felelős. Például a LogFile egy naplófájl, amelyben minden művelet rögzítésre kerül a naplóban, a Boot a rendszerindító szektor, a Bitmap a partíció szabad területét szabályozza stb. Ez a struktúra megbízhatóan megvédi a fájlokat bármilyen meghibásodástól, legyen szó operációs rendszer lefagyásáról vagy áramkimaradásról.

Előnyök

A FAT32-vel ellentétben ez a fájlstruktúra gyakorlatilag nem korlátozza a fájlok és könyvtárak méretét. A fürt mérete 512 bájttól 64 KB-ig változhat, az optimális méret pedig 4 KB.

A biztonságot javító számos jelentős fejlesztésnek köszönhetően, mint például a fájlhozzáférési jogok támogatása, a HPFS-kvóták, a titkosítás, a naplózás, a hozzáférés-vezérlés és a naplózás, a merev hivatkozások stb., az NTFS ideális a rendszerterület lemezformázására. Más merevlemez-partíciók is formázhatók ebben a rendszerben, mivel az NTFS lehetővé teszi a lemezterület optimális kihasználását, ha sok kis fájl van.

Ennek a fájlszervezésnek az előnye a kis fájlok gyors elérési sebessége, a nagy teljesítményű fájlokkal való munkavégzés, valamint a hosszú fájlnevek használatának lehetősége.

Hibák

Az NTFS rendszer fő hátránya, hogy nem kompatibilis a Windows NT alatti összes operációs rendszerrel, valamint a más operációs rendszerekkel való kompatibilitás korlátai. Tehát a Mac OS beolvassa a fájlokat az NTFS-lemezekről, de nem tudja írni őket, ugyanez a helyzet a Linux fájlkompatibilitással. A legnépszerűbb játékkonzolok, a Playstation és az Xbox 360 nem működnek NTFS-sel, csak az Xbox One tud kommunikálni vele.

Az NTFS hátrányai közé tartozik még a magas RAM-igény, a FAT32-höz képest alacsonyabb sebesség és a közepes méretű könyvtárak kezelésének nehézségei.

Így célszerűbb az NTFS fájlstruktúrát használni a Windows legújabb verzióit futtató merevlemezeken, beleértve az SSD-ket is, NT-től kezdve.

exFAT

Ez a fájlrendszer a legfrissebb, amelyet a kiadási idő tekintetében felülvizsgáltak. 2008-ban jelent meg a Windows XP rendszeres frissítéseivel, és valójában a FAT32 kiterjesztett verziója.

A fejlesztők fő célja egy produktív, kényelmes és univerzális fájlstruktúra létrehozása hordozható tárolóeszközökhöz: flash meghajtókhoz, SD-kártyákhoz és cserélhető merevlemezekhez.

Előnyök:

  • Egyszerű szervezés speciális szolgáltatások, valamint a fájl- és partícióméretre vonatkozó korlátozások nélkül.
  • Kiváló kompatibilitás minden Windows operációs rendszerrel, valamint Mac OS és Linux rendszerrel. Ez utóbbi esetben további szoftver telepítése szükséges.
  • Támogatás az összes modern Apple eszközről, valamint Xbox One és Playstation 4 játékkonzolokról.

Az exFAT fájlszervezés fő hátránya a Microsoft licencszabályzata, amely tiltja annak szabad nyilvános használatát.

A legoptimálisabb fájlstruktúra

A három népszerű fájlrendszer leírását figyelembe véve a következő következtetéseket vonhatjuk le:

  • a Windows NT-nél magasabb operációs rendszerrel rendelkező számítógépes eszközök esetében célszerűbb a merevlemez formázása az NTFS rendszerben;
  • régebbi eszközökhöz, valamint a különféle modern digitális eszközökkel való kompatibilitás érdekében a legjobb megoldás a FAT32 választása;
  • bármilyen cserélhető adathordozóhoz ideális lenne a rendszer használata

És végül: az „Általános” lapon (jobb egérgombbal a „Tulajdonságok”) talál információkat arról, hogy milyen fájlstruktúrát implementált a lemezeken.

VLADIMIR MESKOV

FAT fájlrendszer architektúra

A FAT fájlrendszer általános jellemzői. Partíciós struktúra FAT fájlrendszerrel

A FAT (File Allocation Table) fájlrendszert Bill Gates és Mark McDonald fejlesztette ki 1977-ben, és eredetileg a 86-DOS operációs rendszerben használták. A programok CP/M operációs rendszerről 86-DOS-ra való hordozhatósága érdekében megtartották a korábban elfogadott fájlnevekre vonatkozó korlátozásokat. A 86-DOS-t ezt követően a Microsoft felvásárolta, és ez lett az 1981 augusztusában kiadott MS-DOS 1.0 alapja. A FAT-ot 1 MB-nál kisebb hajlékonylemezekkel való használatra tervezték, és kezdetben nem nyújtott támogatást a merevlemezekhez.

A FAT partíció felépítése az ábrán látható.

A FAT fájlrendszerben a logikai partíció lemezterülete két részre van osztva - a rendszerterületre és az adatterületre (lásd: 1. ábra). A rendszerterület a formázás során jön létre és inicializálódik, majd frissítésre kerül, amikor a fájlszerkezetet módosítják. A FAT fájlrendszerek rendszerterülete a következő összetevőkből áll:

  • rendszerindítási rekord (BR);
  • tartalék terület;
  • Fájlkiosztási táblázatok;
  • gyökérkönyvtár terület (FAT32-ben nem létezik).

A logikai lemez adatterülete a gyökérnek alárendelt fájlokat és könyvtárakat tartalmaz, és azonos méretű szakaszokra - klaszterekre - van osztva. Egy fürt egy vagy több szektorból állhat, amelyek egymást követően helyezkednek el a lemezen. A fürtben lévő szektorok számának 2N többszörösének kell lennie, és értéke 1 és 64 között lehet. A fürt mérete a használt fájlrendszer típusától és a logikai lemez méretétől függ.

A fájlkiosztási táblázat célja, szerkezete és típusai

A FAT nevét az azonos nevű fájlallokációs tábláról kapta – Fájlallokációs tábla, FAT. A fájlkiosztási tábla információkat tárol a logikai lemez fürtjeiről. Minden fürtnek van egy megfelelő FAT-táblaeleme, amely információkat tartalmaz arról, hogy a fürt szabad-e vagy fájladatokkal van elfoglalva. Ha a klasztert egy fájl foglalja el, akkor a fájl következő részét tartalmazó fürt címét a fájlallokációs tábla megfelelő eleme jelzi. A fájl által elfoglalt kezdeti fürt száma a fájl bejegyzését tartalmazó könyvtárbejegyzésben tárolódik. A fürt lista utolsó eleme tartalmazza a fájl vége jelet (EOF – End Of File). Az első két FAT elem le van foglalva.

A FAT fájlrendszer mindig sorban tölti be a szabad lemezterületet az elejétől a végéig. Új fájl létrehozásakor vagy egy meglévő bővítésekor megkeresi a legelső szabad fürtöt a fájlkiosztási táblázatban. Ha működés közben egyes fájlok törlésre kerültek, mások mérete pedig megváltozott, akkor a keletkező üres fürtök szétszóródnak a lemezen. Ha a fájladatokat tartalmazó fürtök nincsenek egy sorban, akkor a fájl töredezetté válik.

A következő típusú FAT létezik: FAT12, FAT16, FAT32. A FAT típusok nevei az elem méretéből származnak: a FAT12 elem mérete 12 bit (1,5 bájt), FAT16 - 16 bit (2 bájt), FAT32 - 32 bit (4 bájt). A FAT32-ben a négy legfontosabb bit le van foglalva, és figyelmen kívül hagyja az operációs rendszer működése során.

Gyökérkönyvtár

A fájlkiosztási táblákat a gyökérkönyvtár követi. A gyökérkönyvtárban minden fájl és alkönyvtár rendelkezik egy 32 bájtos könyvtárbejegyzéssel, amely tartalmazza a fájl nevét, attribútumait (archivált, rejtett, rendszer és csak olvasható), valamint a létrehozásának (vagy legutóbbi módosításának) dátumát és időpontját. valamint egyéb információk. FAT12 és FAT16 fájlrendszerek esetén a gyökérkönyvtár pozíciója a partíción és mérete mereven rögzített. A FAT32-ben a gyökérkönyvtár bárhol elhelyezhető a partíció adatterületén, és tetszőleges méretű lehet.

Fájlnév formátumok

A FAT korábbi verzióinak (FAT12 és FAT16) egyik jellemzője a rövid fájlnevek használata. A rövid név két mezőből áll – egy 8 bájtos mezőből, amely tartalmazza a tényleges fájlnevet, és egy 3 bájtos mezőből, amely a kiterjesztést tartalmazza ("8.3" formátum). Ha a felhasználó által beírt fájlnév 8 karakternél rövidebb, akkor szóközökkel (0x20 kód) van kitöltve; ha a beírt kiterjesztés három bájtnál rövidebb, akkor azt is szóközökkel töltjük ki.

A rövid fájlnév könyvtárelem-struktúráját az 1. táblázat mutatja be.

A rövid név első bájtja a könyvtár foglaltsági jelzőjeként szolgál:

  • ha az első bájt 0xE5, akkor a könyvtárbejegyzés ingyenes és használható új fájl létrehozásakor;
  • ha az első bájt 0x00, akkor a címtárbejegyzés szabad, és egy tiszta könyvtárterület kezdete (utána nincsenek engedélyezett bejegyzések).

1. táblázat: Könyvtárelem-struktúra egy rövid fájlnévhez

Elfogultság

Méret (bájt) Tartalom
0x00 11 Rövid fájlnév
0x0B 1 Fájl attribútumok
0x0C 1 Windows NT-hez fenntartva.
0x0D 1 Egy mező, amely megadja a fájl létrehozásának idejét (tíz ezredmásodpercet tartalmaz). A mező feldolgozása csak FAT32-ben történik
0x0E 1 A fájl létrehozásának ideje. A mező feldolgozása csak FAT32-ben történik
0x10 2 A fájl létrehozásának dátuma. A mező feldolgozása csak FAT32-ben történik
0x12 2 A fájlhoz való utolsó hozzáférés dátuma adatok írására vagy olvasására. A mező feldolgozása csak FAT32-ben történik
0x14 2 A fájl első fürtszámának legjelentősebb szava. A mező feldolgozása csak FAT32-ben történik
0x16 2 Az utolsó írási művelet ideje a fájlba
0x18 2 A fájlba való utolsó írási művelet dátuma
0x1A 2 A fájl első fürtszámának alacsony szava
0x1C 4 A fájl mérete bájtban

Számos korlátozás vonatkozik az ASCII-karakterek rövid névben való használatára:

  • nem használhat 0x20-nál kisebb kódú karaktereket (kivéve a rövid név első bájtjában található 0x05 kódot);
  • nem használhat 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x7D kódú karaktereket;
  • Nem használhat szóközt (0x20) a név első bájtjában.

A FAT32 és VFAT (virtuális FAT, FAT16 kiterjesztésű) fájlrendszer támogatja a hosszú fájlneveket (LFN). A hosszú név tárolásához a fő elem melletti könyvtárelemeket használjuk. A fájlnév nem ASCII karakterekkel van írva, hanem Unicode-ban. Egy címtárbejegyzésben legfeljebb 13 Unicode karakterből álló töredéket tárolhat. Az utolsó töredék fel nem használt része 0xFFFF kódokkal van feltöltve. A hosszú fájlnév könyvtárelem-struktúrája a 2. táblázatban látható.

2. táblázat: Könyvtárelem-struktúra hosszú fájlnévhez

Elfogultság Méret (bájt) Tartalom
0x00 1 Töredékszám
0x01 10 A fájlnév 1-5 karakterei Unicode-ban
0x0B 1 Fájl attribútumok
0x0C 1 Flags byte
0x0D 1 Rövid név ellenőrző összeg
0x0E 12 A fájlnév 6-11 karakterei Unicode-ban
0x1A 2 Az első klaszter száma (nullákkal töltve)
0x1C 4 A fájlnév 12-13 karakterei Unicode-ban

Boot szektor

A FAT rendszerű logikai lemez első szektora tartalmazza a rendszerindító szektort és a BIOS paraméterek blokkját. Ennek a blokknak a kezdeti része azonos minden típusú FAT esetében (3. táblázat). A különböző FAT-típusok rendszerindító szektorainak szerkezetében mutatkozó különbségek a 0x24 eltolásnál kezdődnek. FAT12 és FAT16 esetén a struktúra a 4. táblázatban, a FAT32 esetében az 5. táblázatban látható.

3. táblázat: A rendszerindító szektor kezdeti szakasza

Elfogultság Méret, bájt Leírás
0x00 3 Feltétel nélküli ugrás (jmp) a rendszerindító kódra
0x03 8 Gyártói azonosító
0x0B 2 Bájtok száma a szektorban (512)
0x0D 1 Szektorok száma egy fürtben
0x0E 2 A tartalék szektorok száma a partíció tartalék területén, a partíció első szektorától kezdve
0x10 1 Táblázatok száma (példányok) FAT
0x11 2 FAT12/FAT16 esetén – a 32 bájtos fájlleírók száma a gyökérkönyvtárban; FAT32 esetén ennek a mezőnek az értéke 0
0x13 2 A partíció szektorainak teljes száma; ha ez a mező 0-t tartalmaz, akkor a szektorok számát a 0x20 eltolású mező adja meg
0x15 1 Média típus. Merevlemez esetén az érték 0xF8; hajlékonylemezhez (2 oldal, sávonként 18 szektor) – 0xF0
0x16 2 FAT12/FAT16 esetén ez a mező a szektorok számát tartalmazza a FAT egy példánya foglalja el; FAT32 esetén ennek a mezőnek az értéke 0
0x18 2 Szektorok száma sávonként (0x13 megszakításhoz)
0x1A 2 Munkafelületek száma (0x13 megszakításhoz)
0x1C 4 Rejtett szektorok száma a partíció előtt
0x20 4 A partíció szektorainak teljes száma. A mező akkor használatos, ha a szakasz 65535 szektor felett, ellenkező esetben a mező 0-t tartalmaz.

4. táblázat: A FAT12/FAT16 rendszerindító szektor felépítése

Elfogultság Méret, bájt Leírás 0x24 1 Meghajtószám a megszakításhoz 0x13 0x25 1 0x26 1 Kiterjesztett rendszerindítási rekord jelző (0x29) 0x27 4 Logikai meghajtószám 0x2B 11 Lemezcímke 0x36 8 Szövegkarakter fájlrendszertípus-rövidítéssel

5. táblázat: FAT32 rendszerindító szektor szerkezete

Méret, bájt Leírás 4 A FAT egy példányával elfoglalt szektorok száma 2 Aktív FAT szám 2 FAT32 verziószám: magas bájt - verziószám,junior – revíziószám. Jelenleg az érték 0:0 4 A gyökérkönyvtár első fürtjének fürt száma 2 Az FSINFO struktúra szektorszáma a logikai lemez tartalék területén 2 Használt szektorszám (a logikai lemez tartalék területén).a rendszerindító szektor biztonsági másolatának tárolására 12 Fenntartva (0-t tartalmaz)

Elfogultság
0x24
0x28
0x2A
0x2С
0x30
0x32
0x34

A táblázatokban felsorolt ​​2. és 3. mezőn kívül a logikai lemez nulla szektorának a 0x1FE eltolásnál lévő bájtban a 0x55 kódot, a következő bájtban pedig a 0xAA kódot (offset 0x1FF) kell tartalmaznia. A jelzett két bájt a rendszerindító lemez jele.

A rendszerindító szektor tehát két fontos funkciót lát el: leírja a lemezen lévő adatok szerkezetét, és lehetővé teszi az operációs rendszer indítását is.

A FAT32 szervezettel rendelkező logikai lemez emellett tartalmaz egy FSIinfo struktúrát, amely a tartalék terület első szektorában található. Ez a struktúra információkat tartalmaz a lemezen lévő szabad fürtök számáról és a FAT tábla első szabad fürtjének számáról. A szerkezet formátumát a 6. táblázat írja le.

6. táblázat: Az FSInfo szektor és a FAT32 biztonsági mentési rendszerindító szektor felépítése

Méret, bájt Leírás 4 A 0x41615252 érték egy aláírás, amely azt jelzi, hogy ez a szektor tartalmazza az FSIinfo struktúrát 480 Fenntartva (0-t tartalmaz) 4 Érték 0x61417272 (aláírás) 4 A lemezen lévő szabad fürtök jelenlegi számát tartalmazza. Ha a mező a 0xFFFFFFFF értéket tartalmazza, akkor a szabad klaszterek száma ismeretlen, és ki kell számítani 4 Tartalmazza azt a fürtszámot, amelytől kezdve a lemez-illesztőprogramnak el kell kezdenie a szabad fürtök keresését. Ha a mező a 0xFFFFFFFF értéket tartalmazza, akkor a szabad fürtök keresését a 2-es számú klaszterrel kell kezdeni. 12 Fenntartva (0-t tartalmaz) 4 Aláírás 0xAA550000 – az FSIinfo struktúra végét jelzi

Elfogultság
0x000
0x004
0x1E4
0x1E8
0x1EC
0x1F0
0x1FC

A FAT fájlrendszerrel rendelkező partíción található fájl tartalmának eléréséhez meg kell szereznie a fájl első fürtjének számát. Ez a szám, mint már megállapítottuk, a fájl bejegyzést tartalmazó könyvtárbejegyzés része. Az első fürtszám a FAT táblaelemnek felel meg, amely a fájl következő részét tartalmazó fürt címét tárolja. A lánc utolsó fürtjének megfelelő FAT elem tartalmazza a fájlvégi aláírást. FAT12 esetén ez az érték 0xFFF, FAT16 esetén – 0xFFFF, FAT32 esetén – 0xFFFFFFFF.

Nézzük meg az olvasási algoritmusok szoftveres megvalósítását az egyes FAT típusokhoz, és kezdjük a FAT16-tal.

A cikkben tárgyalt összes forrásszöveg elérhető a folyóirat honlapján.

Az algoritmus szoftveres megvalósítása logikai partícióról FAT16 fájlrendszerrel történő olvasáshoz

Fejlesszünk ki egy modult, amely beolvassa a FAT16 fájlrendszerű partíción létrehozott fájl első N fürtjét. Az N paraméter (az olvasandó klaszterek száma) egy változó érték, és a felhasználó határozza meg. A fájlnév megfelel a „8.3” formátumnak, azaz. rövid. A modul Linux operációs rendszer alatt működik.

Határozzuk meg a szükséges fejléc fájlokat:

#beleértve

#beleértve

#beleértve

#beleértve

#beleértve

#include "split.h"

A split.h fejléc a következő tartalommal rendelkezik:

#beleértve

#define SHORT_NAME 13 // egy rövid fájlnév maximális hossza

struct split_name(

U8 név; // fájl név

U8 ext; // fájlkiterjesztés

Int név_len, // fájlnév hossza

Ext_len; // fájl kiterjesztésének hossza

A split_name struktúra egy rövid fájlnév összetevőit (név és kiterjesztés) és azok hosszát tárolja.

A fejlécfájl olyan szerkezeti típusokat határoz meg, amelyek leírják a FAT fájlrendszer fő összetevőit - a rendszerindító szektort, az FSIinfo szektort, valamint a rövid és hosszú fájlnevek könyvtárelem-struktúráit.

Tekintsük röviden azokat a mezőket, amelyeket ezek a struktúrák tartalmaznak.

    1. Indító szektor szerkezete struct fat_boot_sector:
      • __s8 rendszer_azonosítója– rendszerazonosító;
      • __u8 szektor_méret – szektorméret bájtokban;
      • __u8 cluster_size– klaszterméret szektorokban;
      • __u16 fenntartva– a tartalék szektorok száma a partíció tartalék területén;
      • __u8 zsírok– FAT másolatok száma;
      • __u8 dir_entries– a 32 bájtos fájlleírók száma a gyökérkönyvtárban;
      • __u8 szektorok– szektorok száma a partíción; ha ez a mező 0, akkor a total_sect mező kerül felhasználásra;
      • __u8 média– az adathordozó típusa, amelyen a fájlrendszer létrejött;
      • __u16 kövér_hossz– FAT mérete szektorokban;
      • __u32 total_sect– a FAT partíció mérete szektorokban (ha a szektorok mező == 0).
      • __u32 zsír32_hossz– FAT32 méret szektorokban;
      • __u32 root_cluster– a gyökérkönyvtár első klaszterének száma;
      • __u16 info_sector– az FSInfo struktúrát tartalmazó szektor száma.

Ennek a szerkezetnek a következő mezőit csak a FAT32 használja:

  1. Szektorstruktúra FSIinfo struct fat_boot_fsinfo:
    • __u32 aláírás1– aláírás 0x41615252;
    • __u32 aláírás2– aláírás 0x61417272;
    • __u32 free_cluster– a szabad klaszterek száma. Ha a mező -1-et tartalmaz, akkor a szabad klaszterek keresését a 2-es számú klaszterrel kell kezdeni.
  2. Rövid név könyvtárelem szerkezete struct msdos_dir_entry:
    • __s8 név, mellék– fájlnév és kiterjesztés;
    • __u8 attr– fájl attribútumok;
    • __u8 ctime_ms– ez a mező megadja a fájl létrehozásának idejét ms-ban (csak FAT32 használatos);
    • __u16 ctime– a fájl létrehozásának ideje (csak FAT32 használatos);
    • __u16 dátum– a fájl létrehozásának dátuma (csak FAT32 használatos);
    • __u16 dátum– a fájlhoz való utolsó hozzáférés dátuma (csak FAT32 használatos);
    • __u16 starthi– a fájl első klaszterszámának legjelentősebb 16 bitje (csak FAT32 használatos);
    • __u16 idő, dátum, kezdés– a fájl létrehozásának időpontja és dátuma, a fájl első klaszterének száma;
    • __u32-es méret– fájlméret (byte-ban).
  3. Hosszú név könyvtárelem szerkezete:
    • __u8 id– elemszám;
    • __u8 név0_4– a név 1 – 5 karakterei;
    • __u8 attr– fájl attribútumok;
    • __u8 alias_checksum– rövid név ellenőrzőösszeg;
    • __u8 név5_10– a név 6 – 11 jelei;
    • __u8 név11_12– a név 12 – 13 jelképei.

Folytatjuk az algoritmus szoftveres megvalósításának mérlegelését, és határozzuk meg annak a partíciónak a nevét, amelyen a FAT16 fájlrendszer létrejött:

#ifndef FAT16_PART_NAME

#define FAT16_PART_NAME "/dev/hda1"

#endif

Globális struktúrák:

struct fat_boot_sector fbs; // rendszerindító szektor szerkezete

struct msdos_dir_entry dentry; // könyvtárelem szerkezet

Globális változók:

U16 *zsír16; // másolja ide a FAT16 táblát

U16 szektor_méret; // szektor mérete (FAT16-ból)

U16 dir_entries; // 32 bájtos leírók száma

// a gyökérkönyvtárban (0 FAT32 esetén)

U16-os szektorok; // szektorok teljes száma a partícióban

U32 fat16_size; // FAT16 méret

U32 root_size; // gyökérkönyvtár mérete

U16 byte_per_cluster; // a fürt mérete bájtban

U16 next_cluster; // következő klaszter a láncban

zsírban;

Kezdjük a fő funkcióval:

int main()

Int num;

Megadjuk annak a fájlnak a teljes nevét, amelynek tartalmát olvasni szeretnénk. Hadd emlékeztesselek arra, hogy csak rövid fájlnevekkel dolgozunk. Ez a cikk nem tárgyalja a hosszú nevekkel való munkavégzés folyamatát.

U8 *teljes_útvonal = "/Mappa1/Mappa2/szöveg.txt";

Nyissa meg az eszközfájlt:

Kemény = nyitott (FAT16_PART_NAME, O_RDONLY);

Ha (nehéz< 0) {

Hibás(FAT16_PART_NAME);

Kilépés(-1);

Elolvastuk a fájl első 10 klaszterét. Az olvasást a fat16_read_file() függvény hajtja végre. A függvény paraméterei a teljes fájlnév és az olvasandó fürtök száma. A függvény visszaadja az olvasott klaszterek számát vagy -1-et, ha hiba történt olvasás közben:

Num = fat16_read_file(teljes_elérési út, 10);

If(num< 0) perror("fat16_read_file");

Else printf("%d klaszter olvasása ", szám);

Zárja be az eszközfájlt, és lépjen ki:

Bezár (kemény);

Return 0;

A fájlfürtök olvasására szolgáló függvény a következő formájú:

int fat16_read_file(__u8 *teljes_útvonal, int szám)

Struktúra split_name sn; // fájlösszetevők tárolására szolgáló szerkezet

U8 tmp_name_buff; // puffer a teljes fájlútvonal összetevőinek ideiglenes tárolására

Statikus int i = 1;

Int n;

U8 *tmp_buff;

U16 start_cluster, next_cluster;

A fő funkció figyelembe vételekor felsoroltuk a függvényparamétereket.

Előkészítő műveletek - állítsa vissza a tmp_name_buff puffert és a struct split_name sn struktúrát:

A fájl abszolút elérési útjában az első karakternek perjelnek (/) kell lennie. Ellenőrizzük ezt:

Olvassa be a rendszerindító szektort a partícióról:

If(read_fbs()< 0) return -1;

Az olvasási rendszerindító szektor most a struct fat_boot_sector fbs globális struktúrában található. Másoljuk ki ebből a struktúrából a szektor méretét, a gyökérkönyvtár bejegyzéseinek számát és a partíció összes szektorának számát:

Határozzuk meg a fürt méretét bájtokban:

Byte_per_cluster = fbs.cluster_size * 512

Jelenítsük meg a rendszerindító szektorban található információkat:

Printf("Rendszerazonosító - %s ", fbs.rendszer_azonosítója);

Printf("Szektor mérete - %d ", szektor_méret);

Printf("Cluster mérete - %d ", fbs.cluster_size);

Printf("Fenntartva - %d ", fbs.reserved);

Printf("FAT-ok száma - %d ",fbs.fats);

Printf("Könyvtár bejegyzések - %d ", könyvtár_bejegyzések);

Printf("Szektorok - %d ", szektorok);

Printf("Média - 0x%X", fbs.media);

Printf("FAT16 hossz - %u ", fbs.fat_length);

Printf("Total szekt - %u ", fbs.total_sect);

Printf("Bájt fürtönként - %d ", byte_per_cluster);

Kiszámoljuk a FAT16 méretét bájtban, és kiolvassuk:

Fat16_size = fbs.fat_length * 512;

If(read_fat16()< 0) return -1;

A gyökérkönyvtár olvasása:

If(read_root_dentry()< 0) return -1;

A dir_entry mutató ekkor a gyökérkönyvtár bejegyzéseit tartalmazó memóriahelyre kerül. Ennek a memóriaterületnek a mérete megegyezik a gyökérkönyvtár méretével (root_size).

Mentsük el (vezérlés céljából) a gyökérkönyvtár tartalmát egy külön fájlba:

#ifdef DEBUG

Közeli (zsír);

#endif

Kiszámoljuk az adatterület elejét:

Data_start = 512 * fbs.reserved + fat16_size * fbs.fats + root_size;

Ha az összes bejegyzés a gyökérkönyvtárban van, akkor eljuthatunk a test.txt fájl tartalmához. Ebből a célból ciklust szervezünk. A ciklus törzsében elemezzük a teljes fájlnevet, kiemelve annak elemeit - alkönyvtárakat (kettő van, Mappa1 és Mappa2) és a keresett fájl nevét (test.txt).

Míg(1) (

Memset(tmp_name_buff, 0, SHORT_NAME);

Memset((void *)&sn, 0, sizeof(struct split_name));

For(n = 0 ; n< SHORT_NAME; n++, i++) {

If((tmp_name_buff[n] == "/") || (tmp_name_buff[n] == "?")) (

I++;

Szünet;

Tmp_name_buff[n] = "?";

A struct split_name sn struktúrát kitöltjük a megfelelő információkkal. A split_name függvény elvégzi a kitöltést, és ellenőrzi, hogy a fájlnév megfelel-e a „8.3” formátumnak:

< 0) {

Printf("nem érvényes név");

Return -1;

A teljes fájlnév minden eleméhez meghatározunk egy kezdeti klasztert. Ehhez keresünk a könyvtárelemekben (a gyökértől kezdve) a teljes név elemnek megfelelő bejegyzést, és ezt a bejegyzést olvassuk be. A keresési eljárást a get_dentry() függvény hajtja végre:

If(get_dentry(&sn)< 0) {

Printf("Nincs ilyen fájl!");

Return -1;

A fájl attribútumainak ellenőrzése. Ha ez egy könyvtár, olvassa el a tartalmát, és folytassa a ciklust:

If(dentry.attr & 0x10) (

If(read_directory(dentry.start)< 0) return -1;

Folytatni;

Ha ez egy fájl, akkor az első num klasztereket olvassuk be. Az ellenőrzéshez az olvasott információkat külön fájlba mentjük:

If(dentry.attr & 0x20) (

Start_cluster = dentry.start;

Tmp_buff = (__u8 *)malloc(byte_per_cluster); // a fürt tartalma itt olvasható

N = open("fürt", O_CREAT|O_RDWR, 0600); // mentse az olvasott információkat ebbe a fájlba

If(n< 0) {

Perror("nyitott");

Return -1;

A fájlfürtök olvasásához ciklust szervezünk:

For(i = 0; i< num; i++) {

A fürt tartalmát beolvassuk a tmp_buff pufferbe, és elmentjük egy külön fájlba:

< 0) return -1;

< 0) {

Perror("írni");

Bezár(n);

Return -1;

A FAT16-ból kiolvastuk a fájl által elfoglalt következő fürt számát. Ha ez az utolsó klaszter, megszakítjuk a ciklust, és visszatérünk a fő függvényhez:

#ifdef DEBUG

Printf("OK. Olvasva");

Printf("a fájl következő fürtje - 0x%X .. ", next_cluster);

#endif

If(next_cluster == EOF_FAT16) (

#ifdef DEBUG

Printf("utolsó fürt.");

#endif

Free(tmp_buff);

Bezár(n);

Return ++i;

#ifdef DEBUG

Printf("olvasás leállítása");

#endif

Return i;

A FAT16 rendszerindító szektor beolvasását a read_fbs() függvény hajtja végre. Az eredmény a globális fbs-struktúrába kerül:

int read_fbs()

If(read(hard,(__u8 *)&fbs, sizeof(fbs))< 0) return -1;

Return 0;

A FAT16 fájlrendszer fájlallokációs táblázatának beolvasását a read_fat16() függvény hajtja végre:

int read_fat16()

U64 seek = (__u64)(fbs.reserved) * 512; // eltolás FAT16-ra a partíció elejétől

Fat16 = (void *)malloc(fat16_size);

If(pread64(hard, (__u8 *)fat16, fat16_size, seek)< 0) return -1;

Return 0;

A read_root_dentry() függvény beolvassa a gyökérkönyvtárat:

int read_root_dentry()

U64 seek = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; // eltolja a gyökérkönyvtárat a partíció elejétől

Root_size = 32 * könyvtár_bejegyzések; // kiszámítja a gyökérkönyvtár méretét

Dir_entry = (__u8 *)malloc(root_size);

If(!dir_entry) return -1;

Memset(könyvtár_bejegyzés, 0, gyökér_méret);

If(pread64(kemény, könyvtár_bejegyzés, gyökérméret, keresés)< 0) return -1;

Return 0;

Egy fájlhoz tartozó fürt beolvasását a read_cluster() függvény hajtja végre. A függvény bemeneti paraméterei a cluster_num fürt száma és egy mutató a __u8 *tmp_buff pufferre, ahol az olvasási eredményt el kell helyezni. A partíción lévő fürt eltolása a következő képlettel kerül kiszámításra (lásd:):

SEEK = DATA_START + (CLUSTER_NUM - 2) * BYTE_PER_CLUSTER,

  • KERESÉS– eltolás a partíció fürtjéhez
  • DATA_START– az adatterület kezdete
  • CLUSTER_NUM– a klaszter sorozatszáma
  • BYTE_PER_CLUSTER– a klaszter mérete bájtban

int read_cluster(__u16 cluster_num, __u8 *tmp_buff)

U64 seek = (__u64)(byte_per_cluster) * (fürt_száma - 2) + data_start; // kiszámítja az eltolást a klaszterhez

< 0) return -1;

Return 0;

A read_directory függvény beolvassa a bejegyzéseket egy könyvtárból (nem a gyökérkönyvtárból), és az eredményt arra a memóriahelyre helyezi, amelyre a dir_entry mutató be van állítva:

int read_directory(__u16 start_cluster)

Int i = 1;

U16 next_cluster;

For(; ;i++) (

Memóriát foglalunk le a könyvtár tartalmának tárolására, kiolvassuk a kezdő fürt tartalmát, és megkapjuk a következő fürt értékét a FAT16 táblából:

If(!dir_entry) return -1;

< 0) return -1;

Következő_fürt = zsír16;

Mentsük el a könyvtár tartalmát egy külön fájlba (vezérlés céljából):

#ifdef DEBUG

Printf("Következő fürt - 0x%X ", következő_fürt);

Kövér = open("dir16", O_CREAT|O_WRONLY, 0600);

Write(zsír, könyvtár_bejegyzés, gyökér_méret);

Közeli (zsír);

#endif

Ha az utolsó klasztert elérjük, kilépünk a ciklusból, ellenkező esetben folytatjuk a könyvtár olvasását, növelve a dir_entry puffer méretét további fürttel:

If(next_cluster & EOF_FAT16) break;

Kezdő_fürt = következő_fürt;

Return 0;

A get_dentry() függvény a keresett fájlnak megfelelő elemet keres a könyvtár tartalmában. Ennek a függvénynek a bemeneti paraméterei egy mutató a struct split_name *sn szerkezetre, amely a rövid fájlnév elemeit tartalmazza:

Int i = 0;

A dir_entry globális puffer könyvtárbejegyzések tömbjét tartalmazza, amelyben fájl- (vagy könyvtár-) bejegyzést fogunk keresni. A kereséshez ciklust szervezünk. A hurok törzsében átmásoljuk a könyvtárelemeket a globális dentry struktúrába, és összehasonlítjuk a struktúra név és ext mezőinek értékeit a struct split_name *sn struktúra megfelelő mezőivel. A mezők egyezése azt jelenti, hogy a keresett fájlhoz egy bejegyzést találtunk a könyvtárelemek tömbjében:

for(; ; i++) (

If(!(memcmp(dentry.name, sn->name, sn->name_len)) &&

!(memcmp(dentry.ext, sn->ext, sn->ext_len)))

Szünet;

If(!dentry.name) return -1;

#ifdef DEBUG

Printf("név - %s ", dentry.name);

Printf("fürt indítása - 0x%X ", dentry.start);

Printf("fájl mérete - %u ", dentry.size);

Printf("fájl attribútum - 0x%X ", dentry.attr);

#endif

Return 0;

Az összes fenti kód a FAT16 könyvtárban található, a fat16.c fájlban. Futtatható modul beszerzéséhez hozzon létre egy Makefile-t a következő tartalommal:

INCDIR = /usr/src/linux/include

FÓNY = tiszta

Zsír16: zsír16.o split.o

Gcc -I$(INCDIR) $^ -g -o $@

%.o: %.c

Gcc -I$(INCDIR) -DDEBUG -c $^

Tiszta:

Rm -f *.o

Rm -f ./zsír16

Az algoritmus szoftveres megvalósítása logikai partícióról FAT12 fájlrendszerrel történő olvasáshoz

Általánosságban elmondható, hogy a fájl FAT12 partícióról történő olvasására szolgáló algoritmus megegyezik a FAT16 partícióról történő fájlolvasás algoritmusával. A különbség a FAT12 tábla elemeinek kiolvasási eljárásában rejlik. A FAT16 táblát 16 bites elemek egyszerű tömbjének tekintettük. A FAT12 táblázat elemeinek olvasásához a következő algoritmust javasoljuk:

  • szorozzuk meg az elem számát 1,5-tel;
  • kivonat egy 16 bites szót a FAT-ból, az előző művelet eredményét használva eltolásként;
  • ha az elemszám páros, hajtsa végre az ÉS műveletet az olvasott szón és a 0x0FFF maszkon. Ha a szám páratlan, tolja el a táblázatból kiolvasott szót 4 bittel az alsó számjegyek felé.

Ezen algoritmus alapján megvalósítjuk a FAT12 tábla elemeinek beolvasásának funkcióját:

int get_cluster(__u16 cluster_num)

U16 kereső;

U16 klaszt;

Kiszámoljuk az eltolást a FAT12 táblázatban, és kiolvasunk egy 16 bites szót a táblázatból:

Keresés = (fürt_szám * 3) / 2;

Memcpy((__u8 *)&clust, (__u8 *)(fat12 + seek), 2);

Ha a klaszter kezdőszáma páros szám, akkor a táblázatból kiolvasott értéket 4 bittel eltoljuk az alacsony rendű bitek felé, ha páratlan, akkor 0x0FFF-el összegezzük:

If(fürt_szám % 2) clust >>= 4;

Else clust &= 0x0FFF;

Ez a töredék az assemblerben is megvalósítható:

" xorw %%ax, %%ax "

" btw $0, %%cx "

"jnc 1f"

" Shrw $4, %%dx "

"jmp 2f"

"1: andw $0x0FFF, %%dx"

"2: movw %%dx, %%ax"

:"=a" (következő)

:"d" (klaszter), "c" (klaszter_száma));

Az eredményt visszaküldjük:

Returnclust;

Nézzük meg közelebbről magát az algoritmust. Tegyük fel, hogy létrejött egy fájl egy FAT12 partíción, amely a 9. és 10. fürtöt foglalja el. Minden FAT12 elem 12 bitet foglal el. Mert táblázatból 16 bites elemeket olvasunk ki, ekkor az eltolás a 9. elemhez 13 bájt lesz (9 * 1,5 = 13, a többit eldobjuk), míg az alsó 4 bit a 8. FAT elemhez fog tartozni. Ezeket el kell dobni, ehhez elég az olvasási elemet 4 bittel az alsó számjegyek felé tolni, amit az algoritmus biztosít. A 10. elem eltolása 15 bájt lesz, a legjelentősebb 4 bit pedig a 11. FAT elemhez tartozik. Elvetésükhöz a 10. elemen és a 0x0FFF maszkon egy ÉS műveletet kell végrehajtani, ami szintén megfelel a fenti algoritmusnak.

A FAT12 partícióról fájlok olvasására szolgáló modul forrásszövegei a FAT12 könyvtárban, a fat12.c fájlban találhatók.

A FAT32 fájlrendszerrel rendelkező logikai partícióról fájl olvasására szolgáló algoritmus szoftveres megvalósítása

A FAT32 fájlrendszerű partícióról egy fájl olvasásának algoritmusa gyakorlatilag nem különbözik a FAT16 algoritmusától, kivéve, hogy a FAT32-ben a gyökérkönyvtár bárhol elhelyezhető a partíción, és tetszőleges méretű lehet. Ezért, hogy érdekesebb legyen, bonyolítsuk a feladatot - tegyük fel, hogy csak a FAT32 fájlrendszerű partíció számát ismerjük. A partíció információinak olvasásához először meg kell határoznia a koordinátáit - a partíció eltolását a lemez elejétől. Ehhez pedig ismernie kell a merevlemez logikai szerkezetét.

A merevlemez logikai felépítése

Tekintsük a Microsoft szabványnak megfelelő merevlemez logikai felépítését - „fő partíció – kiterjesztett partíció – nem DOS partíciók”.

A merevlemez-terület egy vagy több partícióba szervezhető, és a partíciók tartalmazhatnak egy vagy több logikai meghajtót.

A Master Boot Record (MBR) a merevlemezen található a 0-0-1 fizikai címen. Az MBR struktúra a következő elemeket tartalmazza:

  • nem rendszerindítási rendszer (NSB);
  • lemezpartíciókat leíró táblázat (partíciós tábla, PT). Az MBR-ben található 0x1BE eltolásnál, és 64 bájtot foglal el;
  • MBR aláírás. Az MBR utolsó két bájtjának a 0xAA55 számot kell tartalmaznia.

A partíciós táblázat leírja a merevlemezen elérhető partíciók elhelyezkedését és jellemzőit. A lemezpartíciók két típusúak lehetnek - elsődleges (elsődleges, fő) és kiterjesztett (bővített). Az elsődleges partíciók maximális száma négy. Legalább egy elsődleges partíció jelenléte kötelező a lemezen. A kiterjesztett partíció számos alpartícióra osztható - logikai meghajtókra. Az MBR egyszerűsített struktúrája a 7. táblázatban látható. A partíciós tábla az MBR végén található, 16 bájt van lefoglalva a partíció leírására a táblában.

7. táblázat: MBR szerkezet

Elfogultság Méret, bájt 0 446 0x1BE 16 0x1CE 16 0x1DE 16 0x1EE 16 0x1FE 2

A partíciós tábla bejegyzési struktúrája a 8. táblázatban látható.

8. táblázat: Partíciós tábla bejegyzési szerkezete

Elfogultság Méret, bájt Tartalom
0x00 1 Aktivitás jele (0 - a partíció nem aktív, 0x80 - a partíció aktív)
0x01 1 A lemezfej száma, ahonnan a partíció kezdődik
0x02 2 Hengerszám és szektorszám, amelytől a szakasz kezdődik
0x04 1 Rendszerazonosító partíciótípus kódja
0x05 1 A lemezfej száma, ahol a partíció véget ér
0x06 2 A szakaszt lezáró hengerszám és szektorszám
0x08 4 A partíció kezdő szektorának abszolút (logikai) száma
0x0C 4 Partíció mérete (szektorok száma)

A szakaszelem első bájtja a szakaszaktivitás jelzője (0 – inaktív, 0x80 – aktív). Arra szolgál, hogy megállapítsa, hogy a partíció rendszerindítás-e, és hogy a számítógép indításakor be kell-e tölteni róla az operációs rendszert. Csak egy szakasz lehet aktív. A partíció tevékenység jelzőjét a partíció kezdetének koordinátái követik - három bájt jelzi a fej számát, a szektor számát és a hengerszámot. A henger- és szektorszámok az Int 0x13 megszakítási formátumban vannak megadva, azaz. a 0-5 bitek a szektorszámot, a 6-7 bitek – a 10 bites hengerszám legjelentősebb két bitje, a 8-15 bitek – a hengerszám legkisebb jelentőségű nyolc bitjei. Ezt egy rendszerazonosító kód követi, jelezve, hogy ez a szakasz egy adott operációs rendszerhez tartozik. Az azonosító egy bájtot foglal el. A rendszerazonosító mögött a szakasz végének koordinátái találhatók - három bájt, amelyek a fej, szektor és henger számát tartalmazzák. A következő négy bájt a partíció előtti szektorok száma, az utolsó négy bájt pedig a partíció szektorokban lévő mérete.

Így egy partíciós tábla elem a következő struktúrával írható le:

struct pt_struct (

U8 indítható; // szakasz tevékenység jelzője

U8 start_part; // a szakasz elejének koordinátái

U8 típus_alkatrész; // rendszerazonosító

U8 vég_rész; // a szakasz végének koordinátái

U32 szekta_előtte; // szektorok száma a partíció előtt

U32 szekt_összesen; // partíció mérete szektorokban (szektorok száma a partícióban)

Az elsődleges partíció elem közvetlenül a logikai lemez rendszerindító szektorára mutat (az elsődleges partícióban mindig csak egy logikai lemez van), a kiterjesztett partícióelem pedig közvetlenül a logikai lemezek listájára mutat, amely másodlagos MBR (Secondary) nevű struktúrákból áll. MBR, SMBR).

A kiterjesztett partíció minden lemeze saját SMBR blokkkal rendelkezik. Az SMBR felépítése hasonló az MBR-hez, de nincs rendszerindítási rekordja (nullákkal töltve), és a négy partícióleíró mezőből csak kettőt használnak. A szakasz első eleme a logikai lemezre, a második elem a listában a következő SMBR-struktúrára mutat. A lista utolsó SMBR-je a második elemében nulla partíciókódot tartalmaz.

Térjünk vissza a FAT32 partícióról való fájlolvasás moduljához.

Fejléc fájlok:

#beleértve

#beleértve

#beleértve

#beleértve

#beleértve

MBR aláírás:

#define SIGNATURE 0xAA55

Eszközfájl, amelyből a partícióinformációk kiolvashatók:

#define DEVICE "/dev/hda"

Partíciós tábla elem mérete (16 bájt):

#define PT_SIZE 0x10

A következő struktúrák tömbje egy szakasz típuskódját képezi le a szimbolikus megjelenítésére:

struct rendszertípusok (

U8 alkatrésztípus;

U8 *alkatrésznév;

struct systypes i386_sys_types = (

(0x00, "Üres"),

(0x01, "FAT12"),

(0x04, "FAT16<32M"},

(0x05, "Bővített"),

(0x06, "FAT16"),

(0x0b, "Win95 FAT32"),

(0x0c, "Win95 FAT32 (LBA)"),

(0x0e, "Win95 FAT16 (LBA)"),

(0x0f, "Win95 Ext"d (LBA)"),

(0x82, "Linux csere"),

(0x83, "Linux"),

(0x85, "Linux kiterjesztve"),

(0x07, "HPFS/NTFS")

Határozzuk meg az i386_sys_types tömb elemeinek számát a PART_NUM makró segítségével:

#define PART_NUM (sizeof(i386_sys_types) / sizeof(i386_sys_types))

Határozzuk meg a logikai meghajtók számát:

#define MAX_PART 20

A következő szerkezeti tömb információkat tartalmaz az eszközön (merevlemezen) lévő logikai meghajtókról:

struct pt_struct (

U8 indítható;

U8 start_part;

U8 típus_alkatrész;

U8 vég_rész;

U32 szekta_előtte;

U32 szekt_összesen;

) pt_t;

int kemény; // eszköz fájlleíró

U8 mbr; // itt számolja az MBR-t

Annak a partíciónak a száma, amelyen a FAT32 fájlrendszer létrejött:

#define FAT32_PART_NUM 5

A rendszerindító szektor, az FSIinfo szektor és a könyvtárbejegyzés struktúrái (a fájlban definiálva ):

struct fat_boot_sector fbs;

struct fat_boot_fsinfo fsinfo;

struct msdos_dir_entry dentry;

U32 *fat32 = NULL; // másolja ide a FAT32 táblát

U16 szektor_méret; // szektor mérete (FAT32-ből)

U16 dir_entries; // 0 FAT32 esetén

U16-os szektorok; // szektorok száma a partíción

U32 fat32_size; // FAT32 méret

U32 data_start; // az adatterület kezdete

U16 byte_per_cluster; // hány bájt van a fürtben (a klaszter mérete bájtban)

U32 next_cluster; // következő klaszter a láncban

U32 gyökérfürt; // ROOT cluster - a gyökérkönyvtár kezdeti fürtje

U8 *könyvtárbejegyzés = NULL; // mutat a címtárbejegyzésekre

U64 start_seek = 0; // kezdő eltolás a partícióhoz (byte-ban)

Fő funkció:

int main()

Int szám = 0;

Int fürt_szám = 5; // hány fürtöt kell kiolvasni a fájlból

U8 *teljes_útvonal = "/Folder1/Folder2/readme"; // olvasandó fájl

Megnyitjuk az eszközt, információkat kapunk az eszköz partíciós táblájáról, és megjelenítjük a partíciókra vonatkozó információkat:

Kemény = nyitott (DEV_NAME, O_RDONLY);

Ha (nehéz< 0) {

Hiba (DEV_NAME);

Kilépés(-1);

If(get_pt_info(hard)< 0) {

Perror("get_pt_info");

Kilépés(-1);

Show_pt_info();

Kiszámoljuk a partíció kezdő eltolását:

Start_seek = (__u64)(pt_t.sect_before) * 512;

Olvassa el a fájlhoz tartozó klasztereket:

Num = fat32_read_file(teljes_elérési út, fürt_száma);

If(num< 0) perror("fat32_read_file");

Else printf("%d klaszter olvasása\n", szám);

Bezár (kemény);

Return 0;

A partíciós táblával kapcsolatos információkat a get_pt_info() függvény olvassa be:

int get_pt_info(int hard)

Int i = 0;

U64 kereső;

Kiolvassuk a partíciós táblát az MBR-ből, és ellenőrizzük az aláírást:

Read_main_ptable(hard);

If(check_sign()< 0) {

Printf("Nem érvényes aláírás!\n");

Return -1;

Keressük a kiterjesztett szakaszazonosítót. Ha van ilyen, kiszámítjuk a kiterjesztett partíció eltolását, és kiolvassuk a logikai meghajtókról szóló információkat:

for(; i< 4; i++) {

If((pt_t[i].típus_rész == 0xF) || \

(pt_t[i].type_part == 0x5) || \

(pt_t[i].type_part == 0x0C)) (

Seek = (__u64)pt_t[i].sect_before * 512;

Read_ext_ptable(hard, seek);

Szünet;

Return 0;

Partíciós tábla olvasási függvénye read_main_ptable():

void read_main_ptable(int hard)

If(read(hard, mbr, 512)< 0) {

Perror("olvasni");

Bezár (kemény);

Kilépés(-1);

Memset((void *)pt_t, 0, (PT_SIZE * 4));

Memcpy((void *)pt_t, mbr + 0x1BE, (PT_SIZE * 4));

Visszatérés;

Aláírás-ellenőrző függvény check_sign():

int check_sign()

U16 jel = 0;

Memcpy((void *)&sign, (void *)(mbr + 0x1FE), 2);

#ifdef DEBUG

Printf("Aláírás - 0x%X\n", jel);

#endif

If(jel != ALÁÍRÁS) return -1;

Return 0;

Kibővített partíciós tábla olvasási funkciója:

void read_ext_ptable(int hard, __u64 seek)

Int szám = 4; // ebből a pozícióból kiindulva a pt_t struktúrák tömbje meg lesz töltve a logikai meghajtókkal kapcsolatos információkkal

U8 smbr;

Beviteli adat:

  • kemény– eszközfájl-leíró;
  • keresni– eltolás a kiterjesztett partícióhoz a lemez elejétől (byte-ban).

A logikai meghajtókkal kapcsolatos információk megszerzéséhez egy hurkot szervezünk:

For(;;szám++) (

Olvassuk az SMBR-t, amely a keresési eltolásnál található a lemez elejétől:

Memset((void *)smbr, 0, 512);

Pread64(kemény, smbr, 512, seek);

A pt_t tábla két elemét a num pozícióból kiindulva kitöltjük. Az első elem a logikai meghajtóra, a második pedig a következő SMBR-struktúrára mutat:

Memset((void *)&pt_t, 0, PT_SIZE * 2);

Memcpy((void *)&pt_t, smbr + 0x1BE, PT_SIZE * 2);

Módosítjuk a „Start szektor száma” mezőt - a számolás a lemez elejétől történik:

Pt_t.sect_before += (keresés / 512);

Ha a partíció típuskódja nulla, akkor nincs több logikai meghajtó:

If(!(pt_t.type_part)) break;

Kiszámítjuk az eltolást a következő SMBR-hez:

Keresés = ((__u64)(pt_t.sect_before + pt_t.sect_total)) * 512;

Visszatérés;

A show_pt_info() függvény információkat jelenít meg az eszközön talált logikai meghajtókról:

érvénytelen show_pt_info()

Int i = 0, n;

#ifdef DEBUG

Printf("A lemezen lévő partíciók száma %d\n", PART_NUM);

#endif

For(; i< MAX_PART; i++) {

If(!pt_t[i].type_part) break;

Printf("\nPartíció típusa %d - ", i);

For(n = 0; n< PART_NUM; n++) {

If(pt_t[i].type_part == i386_sys_types[n].part_type) (

Printf("%s\n", i386_sys_types[n].alkatrésznév);

Szünet;

If(n == RÉSZ_NUM.) printf("ismeretlen típus\n");

Printf("Indítójel - 0x%X\n", pt_t[i].bootolható);

Printf("Szektorok a %d partícióban - %d\n", i, pt_t[i].sect_total);

Printf("Szektorok a %d partíció előtt - %d\n\n", i, pt_t[i].sect_before);

Visszatérés;

A fájlfürtök FAT32 partícióról való beolvasását a fat32_read_file() függvény hajtja végre. Ez a függvény sok hasonlóságot mutat a fat16_read_file() függvénnyel, ezért kérjük, olvassa el a 6. pontot a részletes megjegyzésekért:

int fat32_read_file(__u8 *teljes_útvonal, int szám)

Struktúra split_name sn;

U8 tmp_name_buff;

Int i = 1, n;

U32 start_cluster, next_cluster;

U8 *tmp_buff;

Előkészítő műveletek - megtisztítjuk a puffert, a szerkezetet és ellenőrizzük az első perjelet:

Memset(tmp_name_buff, 0, SHORT_NAME);

Memset((void *)&sn, 0, sizeof(struct split_name));

If(teljes_útvonal != "/") return -1;

A rendszerindító szektor olvasása:

If(read_fbs()< 0) return -1;

Memcpy((void *)§or_size, (void *)fbs.sector_size, 2);

Memcpy((void *)&dir_entries, (void *)fbs.dir_entries, 2);

Memcpy((void *)§ors, (void *)fbs.sectors, 2);

Beolvassuk az FSIinfo szerkezetet, és megjelenítjük a benne található aláírást:

If(read_fs_info()< 0) return -1;

Printf("Aláírás1 - 0x%X\n", fsinfo.signature1);

Printf("Aláírás2 - 0x%X\n", fsinfo.signature2);

Fat32_size = fbs.fat32_length * 512; // FAT32 méret bájtban

Data_start = 512 * fbs.reserved + fat32_size * 2; // az adatmező kezdete

Byte_per_cluster = fbs.cluster_size * 512; // a fürt mérete bájtban

Root_cluster = fbs.root_cluster; // a gyökérkönyvtár fürtszáma

FAT32 olvasása:

If(read_fat32()< 0) return -1;

Memória lefoglalása a címtárbejegyzésekhez:

Dir_entry = (__u8 *)malloc(byte_per_cluster);

If(!dir_entry) return -1;

A gyökérkönyvtár olvasása:

If(read_directory(root_cluster)< 0) return -1;

Elemezzük a fájl teljes elérési útját, és minden elemet felosztunk összetevőire:

Míg(1) (

Memset(tmp_name_buff, 0, SHORT_NAME);

Memset((void *)&sn, 0, sizeof(struct split_name));

For(n = 0 ; n< SHORT_NAME; n++, i++) {

Tmp_name_buff[n] = teljes_útvonal[i];

If((tmp_name_buff[n] == "/") || (tmp_name_buff[n] == "\0")) (

I++;

Szünet;

Tmp_name_buff[n] = "\0";

If(split_name(tmp_name_buff, &sn)< 0) {

Printf("nem érvényes név\n");

Return -1;

If(get_dentry(&sn)< 0) {

Printf("Nincs ilyen fájl!\n");

Return -1;

A FAT32 fájlrendszerben egy fürt kezdőszámának megszerzéséhez a fájl első fürtjének számának legmagasabb szavát kell használni - a denry szerkezet starthi mezőjét:

Start_cluster = (((__u32)dentry.starthi<< 16) | dentry.start);

Az attribútum byte ellenőrzése:

If(dentry.attr & 0x10) ( // ez a könyvtár

If(read_directory(start_cluster)< 0) return -1;

Folytatni;

If(dentry.attr & 0x20) ( // és ez egy fájl

Tmp_buff = (__u8 *)malloc(byte_per_cluster);

N = open("fürt", O_CREAT|O_RDWR, 0600);

If(n< 0) {

Perror("nyitott");

Return -1;

Printf("a fájl első fürtje - 0x%X .. ", start_cluster);

For(i = 0; i< num; i++) {

Memset(tmp_buff, 0, byte_per_cluster);

If(read_cluster(start_cluster, tmp_buff)< 0) return -1;

If(write(n, tmp_buff, byte_per_cluster)< 0) {

Perror("írni");

Return -1;

If(next_cluster == EOF_FAT32) (

Free(tmp_buff);

Bezár(n);

Return ++i;

Kezdő_fürt = következő_fürt;

Return i;

A következő három függvény célja a rendszerterület tartalmának megszerzése, azaz. rendszerindító szektor, FSIinfo szerkezet és FAT32 tábla:

1) a read_fbs() függvény beolvassa a rendszerindító szektort:

int read_fbs()

If(pread64(hard, (__u8 *)&fbs, sizeof(fbs), start_seek)< 0) return -1;

Return 0;

2) a read_fs_info() függvény beolvassa az FSIinfo struktúrát:

int read_fs_info()

U64 seek = (__u64)fbs.info_sector * 512 + start_seek;

If(pread64(hard, (__u8 *)&fsinfo, sizeof(fsinfo), seek)< 0) return -1;

Return 0;

3) a read_fat32() függvény beolvassa a FAT32 táblázatot:

int read_fat32()

U64 seek = (__u64)fbs.reserved * 512 + start_seek;

Fat32 = (void *)malloc(fat32_size);

If(!fat32) return -1;

If(pread64(hard, (__u8 *)fat32, fat32_size, seek)< 0) return -1;

Return 0;

A read_cluster() függvény beolvassa a megadott számú klasztert:

int read_cluster(__u32 cluster_num, __u8 *tmp_buff)

U64 keresés = (__u64)(byte_per_cluster) * (fürt_száma - 2) + data_start + start_seek;

If(pread64(hard, tmp_buff, byte_per_cluster, seek)< 0) return -1;

Return 0;

A read_directory() függvény a könyvtárak olvasására szolgál (beleértve a gyökérkönyvtárat is):

int read_directory(__u32 start_cluster)

Int i = 2;

U32 next_cluster;

A függvényparaméterek a könyvtár kezdő fürtjei. A könyvtár tartalmát beolvassuk a dir_entry globális pufferbe:

If(read_cluster(start_cluster, dir_entry)< 0) return -1;

Következő_fürt = zsír32;

Ha a könyvtár egy fürtöt foglal el, lépjen ki; ha nem, növelje meg a memória méretét, és folytassa az olvasást:

For(; ;i++) (

Kezdő_fürt = következő_fürt;

Dir_entry = (__u8 *)realloc(dir_entry, i * byte_per_cluster);

If(!dir_entry) return -1;

If(read_cluster(start_cluster, (dir_entry + (i - 1) * byte_per_cluster))< 0) return -1;

Következő_fürt = zsír32;

If((next_cluster == EOF_FAT32) || (next_cluster == 0xFFFFFF8)) 0;

Return 0;

Az utolsó függvény, amelyet megvizsgálunk, egy könyvtár tartalmában keres egy olyan elemet, amely megfelel a keresett fájlnak:

int get_dentry(struct split_name *sn)

Int i = 0;

A dir_entry mutató egy olyan memóriaterületre van állítva, amely egy könyvtárbejegyzések tömbjét tartalmazza, amelyben meg fogjuk keresni a fájlt (vagy könyvtárat). A kereséshez ciklust szervezünk, és a talált rekordot elhelyezzük a globális denry struktúrában:

For(;;i++) (

Memcpy((void *)&dentry, dir_entry + i * sizeof(dentry), sizeof(dentry));

If(!(memcmp(dentry.name, sn->name, sn->name_len)) &&

!(memcmp(dentry.ext, sn->ext, sn->ext_len)))

Szünet;

If(!dentry.name) return -1;

Return 0;

Ezzel befejeztük a FAT32-partícióról fájlok olvasására szolgáló modul áttekintését.

A modul forráskódja a FAT32 könyvtárban, a fat32.c fájlban található.

Különbségek a FAT és EXT2 fájlrendszerek fájlrekordjainak könyvtárakban való tárolásának megszervezésében

Néhány szó a fájlrekordok FAT és EXT2 fájlrendszerek könyvtáraiban való tárolásának megszervezésében tapasztalható különbségekről. Az EXT2 fájlrendszer felépítéséről ban volt szó.

Most ismerkedtünk meg a FAT-tal - benne minden könyvtárelemnek fix értéke van. A fájl létrehozásakor a fájlrendszer-illesztőprogram megkeresi az első szabad helyet, és kitölti a fájlra vonatkozó információkkal. Ha a címtár hossza nem fér bele egy klaszterbe, akkor egy másik klasztert rendelnek hozzá stb.

Nézzük meg, hogy állnak a dolgok az EXT2-ben.

Tegyük fel, hogy van egy EXT2 fájlrendszerű partíciónk, a blokk mérete 4096 bájt. Ebben a részben létrehozunk egy könyvtárat. A könyvtár mérete megegyezik a blokk méretével - 4096 bájt. Egy könyvtárban az operációs rendszer azonnal létrehoz két bejegyzést – egy bejegyzést az aktuális könyvtárhoz és egy bejegyzést a szülőkönyvtárhoz. Az aktuális címtár bejegyzése 12 bájt, míg a szülő bejegyzése 4084 bájt hosszúságú lesz. Hozzunk létre egy fájlt ebben a könyvtárban. Ezt követően három bejegyzés lesz a könyvtárban - az aktuális könyvtár bejegyzése 12 bájt hosszúsággal, a szülőkönyvtár bejegyzése 12 bájt hosszúsággal és a létrehozott fájl bejegyzése, ahogy valószínűleg sejtette, 4072 bájt. Ha töröljük a létrehozott fájlt, a szülőkönyvtár bejegyzés hossza ismét 4084 bájtra nő.

Így egy fájl létrehozásakor az EXT2 fájlrendszer-illesztőprogram megkeresi a maximális hosszúságú bejegyzést a könyvtárban, és felosztja azt, így helyet ad egy új bejegyzésnek. Nos, ha még mindig nincs elég hely, egy másik blokk kerül lefoglalásra a könyvtár számára, és a könyvtár hossza 8192 bájt lesz.

Végezetül egy kis szerkesztés az „EXT2 fájlrendszer felépítése” című cikkhez.

Ez a változás a get_i_num() függvényre vonatkozik, amely az inode számát fájlnév alapján határozza meg. A függvény régi verziója így nézett ki:

int get_i_num(char *name)

Int i = 0, rec_len = 0;

Struct ext2_dir_entry_2 dent;

For(; i< 700; i++) {

If(!memcmp(dent.name, name, dent.name_len)) break;

Rec_len += dent.rec_len;

Return dent.inode;

Javított verzió:

int get_i_num(char *name)

* A függvény paramétere a fájl neve. A visszatérési érték a fájl inode száma.

Int rec_len = 0;

Struct ext2_dir_entry_2 dent; // ez a struktúra írja le a gyökérkönyvtár bejegyzés formátumát:

* A globális puffer buff egy sor címtárbejegyzést tartalmaz. Az inode fájl sorozatszámának meghatározásához meg kell találnia

* ebben a tömbben van egy bejegyzés ennek a fájlnak a nevével. Ehhez egy hurkot szervezünk:

Mert(;;) (

/* Könyvtárbejegyzések másolása a dent szerkezetbe: */

Memcpy((void *)&dent, (buff + rec_len), sizeof(dent));

* Ha a fájlnév hossza nulla, az azt jelenti, hogy az összes könyvtárbejegyzést megismételtük

* és nem található bejegyzés a mi fájlnevünkkel. Szóval ideje visszamenni:

If(!dent.name_len) return -1;

/* A keresés a fájlnevek összehasonlításával történik. Ha a nevek egyeznek, kilépünk a ciklusból: */

If(!memcmp(dent.name, name, strlen(name))) break;

/* Ha a nevek nem egyeznek, lépjen a következő bejegyzésre: */

Rec_len += dent.rec_len;

/* Ha sikeres, adja vissza a fájl inódszámát: */

Return dent.inode;

Irodalom:

  1. V. Kulakov. Programozás hardver szinten: speciális kézikönyv. 2. kiadás / – Szentpétervár: Péter, 2003 – 848 p.
  2. A.V.Gordejev, A.Ju.Molcsanov. Rendszerszoftver / – Szentpétervár: Péter – 2002
  3. Meshkov V. Az ext2 fájlrendszer felépítése. – „Rendszeradminisztrátor” Magazin, 11(12), 2003. november – 26-32 p.

Kapcsolatban áll



Kapcsolódó kiadványok