Kako postaviti pametne telefone i računala. Informativni portal

Vrste datotečnog sustava - koja je razlika između FAT32, NTFS i exFAT. Što učiniti ako podaci nedostaju

VLADIMIR MEŠKOV

FAT arhitektura datotečnog sustava

Opće karakteristike datotečnog sustava FAT. FAT particijska struktura

Datotečni sustav FAT (File Allocation Table) razvili su Bill Gates i Mark MacDonald 1977. godine i izvorno se koristio u operativnom sustavu 86-DOS. Kako bi se postigla prenosivost programa s CP/M operativnog sustava na 86-DOS, u njemu su zadržana prethodno usvojena ograničenja naziva datoteka. Kasnije je 86-DOS preuzeo Microsoft i postao je osnova za MS-DOS 1.0, objavljen u kolovozu 1981. FAT je dizajniran za rad s disketama manjim od 1MB i u početku nije podržavao tvrde diskove.

Struktura FAT particije prikazana je na slici.

U datotečnom sustavu FAT, prostor na disku logičke particije podijeljen je na dva područja - područje sustava i područje podataka (vidi sliku 1). Područje sustava kreira se i inicijalizira nakon formatiranja, a zatim se ažurira kako se manipulira strukturom datoteke. Područje sustava datotečnih sustava FAT sastoji se od sljedećih komponenti:

  • zapis o pokretanju (BR);
  • rezervno područje;
  • tablice dodjele datoteka;
  • područje korijenskog direktorija (ne postoji u FAT32).

Područje podataka logičkog diska sadrži datoteke i direktorije podređene korijenu, a podijeljeno je na odjeljke iste veličine - klastere. Klaster se može sastojati od jednog ili više sektora koji se uzastopno nalaze na disku. Broj sektora u klasteru mora biti višekratnik 2N i može imati vrijednosti od 1 do 64. Veličina klastera ovisi o vrsti datotečnog sustava koji se koristi i veličini logičkog diska.

Svrha, struktura i vrste tablice dodjele datoteka

FAT je ime dobio po istoimenoj tablici dodjele datoteka – File Allocation Table, FAT. Tablica dodjele datoteka pohranjuje informacije o klasterima logičkog diska. Svaki klaster odgovara elementu FAT tablice, koja sadrži informacije o tome je li ovaj klaster slobodan ili zauzet podacima datoteke. Ako je klaster okupiran datotekom, tada je adresa klastera koji sadrži sljedeći dio datoteke naznačena u odgovarajućem elementu tablice dodjele datoteka. Početni broj klastera koji zauzima datoteka pohranjen je u unosu direktorija koji sadrži unos datoteke. Posljednji element popisa klastera sadrži kraj datoteke (EOF - End Of File). Prva dva FAT elementa su rezervirana.

FAT datotečni sustav uvijek ispunjava slobodni prostor na disku uzastopno od početka do kraja. Prilikom stvaranja nove datoteke ili povećanja postojeće, traži prvi slobodni klaster u tablici dodjele datoteka. Ako su tijekom rada neke datoteke izbrisane, a druge promijenjene u veličini, rezultirajući prazni klasteri bit će razbacani po disku. Ako klasteri koji sadrže podatke datoteke nisu poredani u red, datoteka je fragmentirana.

Postoje sljedeće vrste FAT-a - FAT12, FAT16, FAT32. Nazivi tipa FAT proizlaze iz veličine elementa: FAT12 je 12 bita (1,5 bajta), FAT16 je 16 bita (2 bajta), FAT32 je 32 bita (4 bajta). U FAT32, četiri najznačajnija bita su rezervirana i zanemarena od strane operativnog sustava.

Korijenski direktorij

Nakon tablica dodjele datoteka slijedi korijenski direktorij. Svaka datoteka i poddirektorij u korijenskom direktoriju ima 32-bajtni unos direktorija koji sadrži naziv datoteke, atribute datoteke (arhivirana, skrivena, sistemska i samo za čitanje), datum i vrijeme kreiranja (ili zadnje izmjene), kao i druge informacije . Za datotečne sustave FAT12 i FAT16, položaj korijenskog direktorija na particiji i njegova veličina su čvrsto fiksirani. U FAT32, korijenski direktorij se može nalaziti bilo gdje u podatkovnom području particije i biti proizvoljne veličine.

Formati naziva datoteka

Jedna od karakteristika ranih verzija FAT-a (FAT12 i FAT16) je korištenje kratkih naziva datoteka. Kratki naziv sastoji se od dva polja - polja od 8 bajta koje sadrži stvarni naziv datoteke i polja od 3 bajta koje sadrži ekstenziju (format "8.3"). Ako je naziv datoteke koji je unio korisnik kraći od 8 znakova, tada se puni razmacima (kod 0x20); ako je unesena ekstenzija kraća od tri bajta, tada se također puni razmacima.

Struktura unosa imenika za kratki naziv datoteke prikazana je u tablici 1.

Prvi bajt kratkog naziva služi kao znak da je imenik zauzet:

  • ako je prvi bajt 0xE5, tada je unos u direktorij slobodan i može se koristiti pri stvaranju nove datoteke;
  • ako je prvi bajt 0x00, tada je unos u imenik slobodan i predstavlja početak čistog područja imenika (poslije njega nema unosa).

Tablica 1. Struktura unosa imenika za kratki naziv datoteke

Pristranost

Veličina (bajtovi) Sadržaj
0x00 11 Kratki naziv datoteke
0x0B 1 Atributi datoteke
0x0C 1 Rezervirano za Windows NT.
0x0D 1 Polje u kojem se navodi vrijeme stvaranja datoteke (sadrži desetke milisekundi). Polje se obrađuje samo u FAT32
0x0E 1 Vrijeme stvaranja datoteke. Polje se obrađuje samo u FAT32
0x10 2 Datum kreiranja datoteke. Polje se obrađuje samo u FAT32
0x12 2 Datum posljednjeg pristupa datoteci za pisanje ili čitanje podataka. Polje se obrađuje samo u FAT32
0x14 2 Riječ visokog reda prvog broja klastera u datoteci. Polje se obrađuje samo u FAT32
0x16 2 Vrijeme posljednjeg upisivanja u datoteku
0x18 2 Datum posljednjeg upisivanja u datoteku
0x1A 2 Najmanja značajna riječ broja prvog klastera datoteke
0x1C 4 Veličina datoteke u bajtovima

Brojna ograničenja nametnuta su upotrebi ASCII znakova u kratkom nazivu:

  • ne možete koristiti znakove s kodovima manjim od 0x20 (osim koda 0x05 u prvom bajtu kratkog naziva);
  • ne možete koristiti simbole s kodovima 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x7D;
  • ne možete koristiti razmak (0x20) u prvom bajtu imena.

FAT32 i VFAT (virtualni FAT, ekstenzija FAT16) datotečni sustavi podržavaju duge nazive datoteka (LFN). Za pohranjivanje dugog imena koriste se elementi direktorija koji su susjedni glavnom elementu. Naziv datoteke nije napisan u ASCII znakovima, već u Unicodeu. Komad od do 13 Unicode znakova može se pohraniti u jedan unos u katalog. Neiskorišteni dio posljednjeg fragmenta ispunjen je kodovima 0xFFFF. Struktura unosa imenika za dugi naziv datoteke prikazana je u tablici 2.

Tablica 2. Struktura unosa imenika za dugi naziv datoteke

Pristranost Veličina (bajtovi) Sadržaj
0x00 1 Broj ulomka
0x01 10 Unicode znakovi naziva datoteke 1-5
0x0B 1 Atributi datoteke
0x0C 1 Bajt zastavice
0x0D 1 Kontrolni zbroj kratkog naziva
0x0E 12 Znakovi 6-11 Unicode naziva datoteke
0x1A 2 Broj prvog klastera (ispunjen nulama)
0x1C 4 Znakovi 12-13 Unicode naziva datoteke

Sektor za pokretanje

Prvi sektor FAT logičkog diska sadrži sektor za pokretanje i blok parametara BIOS-a. Početni dio ovog bloka je identičan za sve tipove FAT-a (tablica 3). Razlike u strukturi sektora za pokretanje za različite tipove FAT-a počinju od pomaka 0x24. Za FAT12 i FAT16 struktura je prikazana u tablici 4, za FAT32 - u tablici 5.

Tablica 3. Početni dio sektora za pokretanje

Pristranost Veličina, bajtovi Opis
0x00 3 Bezuvjetni skok (jmp) na kod za pokretanje
0x03 8 ID proizvođača
0x0B 2 Sektorski bajtovi (512)
0x0D 1 Broj sektora u klasteru
0x0E 2 Broj rezervnih sektora u slobodnom području particije, počevši od prvog sektora particije
0x10 1 Broj tablica (kopija) FAT
0x11 2 Za FAT12 / FAT16, broj 32-bajtnih deskriptora datoteke u korijenskom imeniku; za FAT32 ovo polje ima vrijednost 0
0x13 2 Ukupan broj sektora u particiji; ako ovo polje sadrži 0, tada je broj sektora postavljen poljem na pomak 0x20
0x15 1 Vrsta medija. Za tvrdi disk, vrijednost je 0xF8; za disketu (2 strane, 18 sektora po stazi) - 0xF0
0x16 2 Za FAT12 / FAT16 ovo polje sadrži broj sektora, zauzima jedan primjerak FAT-a; za FAT32 ovo polje ima vrijednost 0
0x18 2 Broj sektora po stazi (za prekid 0x13)
0x1A 2 Broj radnih površina (za prekid 0x13)
0x1C 4 Broj skrivenih sektora prije particije
0x20 4 Ukupan broj sektora u particiji. Polje se koristi ako je odjeljak preko 65535 sektora, inače polje sadrži 0.

Tablica 4. Struktura FAT12 / FAT16 sektora za podizanje sustava

Pristranost Veličina, bajtovi Opis 0x24 1 Prekinuti pogon broj 0x13 0x25 1 0x26 1 Proširena oznaka za snimanje pokretanja (0x29) 0x27 4 Logički broj diska 0x2B 11 Oznaka diska 0x36 8 Tekstualni niz sa skraćenicom za vrstu datotečnog sustava

Tablica 5. Struktura FAT32 sektora za pokretanje

Veličina, bajt Opis 4 Broj sektora koje zauzima jedna kopija FAT-a 2 Aktivni FAT broj 2 Broj verzije FAT32: visoki bajt - broj verzije,junior - broj revizije. Trenutno korištena vrijednost je 0:0 4 Broj klastera za prvi klaster korijenskog direktorija 2 Broj sektora FSINFO strukture u slobodnom području logičkog diska 2 Koristi se broj sektora (u slobodnom području logičkog diska).za pohranu sigurnosne kopije sektora za pokretanje 12 Rezervirano (sadrži 0)

Pristranost
0x24
0x28
0x2A
0x2C
0x30
0x32
0x34

Osim polja navedenih u tablicama 2 i 3, nulti sektor logičkog diska mora sadržavati kod 0x55 u bajtu s pomakom 0x1FE i kod 0xAA u sljedećem bajtu (offset 0x1FF). Dva navedena bajta su identifikator diska za pokretanje.

Dakle, sektor za pokretanje obavlja dvije važne funkcije: opisuje strukturu podataka na disku, a također vam omogućuje pokretanje operativnog sustava.

Na logičkom disku s organizacijom FAT32 dodatno se nalazi FSInfo struktura smještena u prvom sektoru rezervnog područja. Ova struktura sadrži informacije o broju slobodnih klastera na disku i broju prvog slobodnog klastera u FAT tablici. Format strukture opisan je u tablici 6.

Tablica 6. Struktura FSInfo sektora i FAT32 backup sektora za pokretanje

Veličina, bajt Opis 4 Vrijednost 0x41615252 je potpis koji označava da ovaj sektor sadrži strukturu FSInfo 480 Rezervirano (sadrži 0) 4 Vrijednost 0x61417272 (potpis) 4 Sadrži trenutni broj slobodnih klastera na disku. Ako polje sadrži vrijednost 0xFFFFFFFF, tada je broj slobodnih klastera nepoznat i mora se izračunati 4 Sadrži broj klastera s kojeg bi upravljački program diska trebao početi tražiti slobodne klastere. Ako polje sadrži vrijednost 0xFFFFFFFF, tada potragu za slobodnim klasterima treba započeti od klastera broj 2 12 Rezervirano (sadrži 0) 4 Potpis 0xAA550000 - znak kraja FSInfo strukture

Pristranost
0x000
0x004
0x1E4
0x1E8
0x1EC
0x1F0
0x1FC

Za pristup sadržaju datoteke koja se nalazi na particiji s datotečnim sustavom FAT, potrebno je dobiti broj prvog klastera datoteke. Ovaj broj, kao što smo već utvrdili, dio je unosa u imeniku koji sadrži unos datoteke. Prvi broj klastera odgovara unosu u tablici FAT, koja pohranjuje adresu klastera koji sadrži sljedeći dio datoteke. FAT element koji odgovara posljednjem klasteru u lancu sadrži potpis na kraju datoteke. Za FAT12 ova vrijednost je 0xFFF, za FAT16 je 0xFFFF, za FAT32 je 0xFFFFFFFF.

Pogledajmo softversku implementaciju algoritma čitanja za svaku vrstu FAT-a i počnimo s FAT16.

Svi izvorni tekstovi razmatrani u članku dostupni su na web stranici časopisa.

Programska implementacija algoritma za čitanje datoteke s logičke particije s datotečnim sustavom FAT16

Razvijmo modul koji čita prvih N klastera datoteke stvorene na particiji s datotečnim sustavom FAT16. Parametar N (broj klastera za čitanje) je varijabilan i definiran je od strane korisnika. Naziv datoteke odgovara formatu "8.3", tj. kratko je. Modul radi pod Linux OS-om.

Definirajmo potrebne datoteke zaglavlja:

#uključiti

#uključiti

#uključiti

#uključiti

#uključiti

#include "split.h"

Datoteka zaglavlja split.h ima sljedeći sadržaj:

#uključiti

#define SHORT_NAME 13 // maksimalna duljina kratkog naziva datoteke

struct split_name (

U8 ime; // Naziv datoteke

U8 ekst; // ekstenzija datoteke

Int name_len, // duljina naziva datoteke

Ext_len; // duljina ekstenzije datoteke

Struktura split_name namijenjena je za pohranu sastavnih dijelova kratkog naziva datoteke (naziv i ekstenzija) i njihove duljine.

Datoteka zaglavlja definira strukturne tipove koji opisuju glavne komponente datotečnog sustava FAT - boot sektor, FSInfo sektor, strukture elemenata direktorija za kratke i dugačke nazive datoteka.

Razmotrimo ukratko polja koja su uključena u svaku od ovih struktura.

    1. Struktura sektora za podizanje sustava fat_boot_sector:
      • __s8 system_id- identifikator sustava;
      • __u8 veličina_sektora - veličina sektora u bajtovima;
      • __u8 cluster_size- veličina klastera u sektorima;
      • __u16 rezervirano- broj rezervnih sektora u slobodnom području particije;
      • __u8 masti- broj FAT kopija;
      • __u8 dir_entries- broj 32-bajtnih deskriptora datoteke u korijenskom direktoriju;
      • __u8 sektora- broj sektora po particiji; ako je ovo polje 0, koristi se polje total_sect;
      • __u8 medija- vrstu medija na kojem je kreiran datotečni sustav;
      • __u16 debljine_duljine- veličina FAT-a u sektorima;
      • __u32 ukupno_sect- veličina FAT particije u sektorima (ako su sektori polja == 0).
      • __u32 mast32_duljina- FAT32 veličina u sektorima;
      • __u32 root_cluster- broj prvog klastera korijenskog imenika;
      • __u16 info_sektor- broj sektora koji sadrži strukturu FSInfo.

Sljedeća polja u ovoj strukturi koristi samo FAT32:

  1. Struktura sektora FSInfo struct fat_boot_fsinfo:
    • __u32 potpis1- potpis 0x41615252;
    • __u32 potpis2- potpis 0x61417272;
    • __u32 slobodna_klastera- broj slobodnih klastera. Ako polje sadrži -1, traženje slobodnih klastera treba započeti od klastera broj 2.
  2. Struktura unosa u imenik kratkog naziva struct msdos_dir_entry:
    • __s8 ime, lok- naziv datoteke i ekstenzija;
    • __u8 attr- atributi datoteke;
    • __u8 ctime_ms- ovo polje navodi vrijeme kreiranja datoteke do ms (koristi se samo FAT32);
    • __u16 ctime- vrijeme kreiranja datoteke (koristi se samo FAT32);
    • __u16 cdate- datum kreiranja datoteke (koristi se samo FAT32);
    • __u16 adate- datum posljednjeg pristupa datoteci (koristi se samo FAT32);
    • __u16 starthi- visokih 16 bitova broja prvog klastera datoteke (koristi se samo FAT32);
    • __u16 vrijeme, datum, početak- vrijeme i datum kreiranja datoteke, broj prvog klastera datoteke;
    • __u32 veličina- veličina datoteke (u bajtovima).
  3. Struktura stavke imenika dugog imena:
    • __u8 id- broj predmeta;
    • __u8 ime0_4- znakovi 1 - 5 imena;
    • __u8 attr- atributi datoteke;
    • __u8 alias_checksum- kontrolni zbroj kratkog naziva;
    • __u8 ime5_10- znakovi 6 - 11 imena;
    • __u8 ime11_12- znakovi 12 - 13 imena.

Nastavimo s pregledom softverske implementacije algoritma i definiramo naziv particije na kojoj je kreiran datotečni sustav FAT16:

#ifndef FAT16_PART_NAME

#define FAT16_PART_NAME "/ dev / hda1"

#završi ako

Globalne strukture:

struct fat_boot_sector fbs; // struktura sektora za pokretanje

struct msdos_dir_entry dentry; // struktura stavke imenika

Globalne varijable:

U16 * mast16; // ovdje kopirajte tablicu FAT16

U16 veličina_sektora; // veličina sektora (od FAT16)

U16 dir_entries; // broj deskriptora od 32 bajta

// u korijenskom direktoriju (0 za FAT32)

U16 sektori; // ukupan broj sektora u odjeljku

U32 mast16_veličina; // Veličina FAT16

U32 root_size; // veličina korijenskog direktorija

U16 byte_per_cluster; // veličina klastera u bajtovima

U16 sljedeći_cluster; // sljedeći klaster u lancu

int mast;

Počnimo s glavnom funkcijom:

int main ()

Int broj;

Postavljamo puni naziv datoteke čiji sadržaj želimo pročitati. Dopustite mi da vas podsjetim da radimo samo s kratkim nazivima datoteka. Postupak za rad s dugim imenima nije pokriven u ovom članku.

U8 * full_path = "/Folder1/Folder2/text.txt";

Otvorite datoteku uređaja:

Tvrdo = otvoreno (FAT16_PART_NAME, O_RDONLY);

Ako (teško< 0) {

Pogreška (FAT16_PART_NAME);

Izlaz (-1);

Čitamo prvih 10 klastera datoteke. Čitanje se obavlja funkcijom fat16_read_file (). Parametri funkcije su puni naziv datoteke i broj klastera za čitanje. Funkcija vraća broj pročitanih klastera ili -1 ako je došlo do pogreške tijekom čitanja:

Broj = fat16_read_file (pun_put, 10);

Ako (br< 0) perror("fat16_read_file");

Else printf ("Čitanje% d klastera", broj);

Zatvorite datoteku uređaja i izađite:

Zatvori (tvrdo);

Vrati 0;

Funkcija za čitanje klastera datoteka izgleda ovako:

int fat16_read_file (__ u8 * puni_put, int broj)

Struktura split_name sn; // struktura za pohranjivanje sastavnih dijelova datoteke

U8 tmp_name_buff; // međuspremnik za privremenu pohranu složenih elemenata punog puta datoteke

Statički int i = 1;

Int n;

U8 * tmp_buff;

U16 start_cluster, sljedeći_cluster;

Naveli smo parametre funkcije kada razmatramo glavnu funkciju.

Pripremne operacije - nuliranje međuspremnika tmp_name_buff i strukture split_name sn:

Prvi znak u apsolutnom nazivu putanje mora biti kosa crta (/). Provjeravamo ovo:

Čitamo sektor za pokretanje s particije:

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

Čitani boot sektor sada je u globalnoj strukturi fat_boot_sector fbs. Kopirajmo iz ove strukture veličinu sektora, broj unosa u korijenskom direktoriju i ukupan broj sektora na particiji:

Odredimo veličinu klastera u bajtovima:

Byte_per_cluster = fbs.cluster_size * 512

Prikažimo informacije u boot sektoru:

Printf ("ID sustava -% s", fbs.system_id);

Printf ("Veličina sektora -% d", veličina_sektora);

Printf ("Veličina klastera -% d", fbs.cluster_size);

Printf ("Rezervirano -% d", fbs.rezervirano);

Printf ("FATs broj -% d", fbs.fats);

Printf ("Unosi u direktoriju -% d", dir_entries);

Printf ("Sektori -% d", sektori);

Printf ("Mediji - 0x% X", fbs.media);

Printf ("dužina FAT16 -% u", fbs.fat_length);

Printf ("Ukupni sekt -% u", fbs.total_sect);

Printf ("Bajt po klasteru -% d", byte_per_cluster);

Izračunajte veličinu FAT16 u bajtovima i pročitajte je:

Fat16_size = fbs.fat_length * 512;

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

Čitamo korijenski direktorij:

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

Pokazivač dir_entry sada je pozicioniran na memorijsko područje koje sadrži unose korijenskog direktorija. Veličina ovog memorijskog područja jednaka je veličini korijenskog direktorija (root_size).

Spremimo (za kontrolu) sadržaj korijenskog direktorija u zasebnu datoteku:

#ifdef DEBUG

Zatvori (masno);

#završi ako

Izračunavamo početak područja podataka:

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

Sa svim unosima u korijenskom direktoriju na mjestu, možemo doći do sadržaja test.txt datoteke. U tu svrhu organizirat ćemo ciklus. U tijelu petlje raščlanimo puni naziv datoteke, istaknuvši njezine elemente - poddirektorije (imamo ih dva, Folder1 i Folder2) i naziv potrebne datoteke (test.txt).

Dok (1) (

Memset (tmp_name_buff, 0, SHORT_NAME);

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

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

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

ja ++;

Pauza;

Tmp_name_buff [n] = "?";

Ispunite strukturu split_name sn odgovarajućim informacijama. Ispunjavanje se vrši funkcijom split_name, dok se naziv datoteke provjerava u odnosu na format "8.3":

< 0) {

Printf ("nevažeće ime");

Povratak -1;

Za svaki element punog naziva datoteke definiramo početni klaster. Da biste to učinili, potražite u elementima direktorija (počevši od korijena) unos koji odgovara elementu punog imena i pročitajte ovaj unos. Funkcija get_dentry () izvodi postupak pretraživanja:

Ako (get_dentry (& sn)< 0) {

Printf ("Nema takve datoteke!");

Povratak -1;

Provjera atributa datoteke. Ako je to imenik, pročitajte njegov sadržaj i nastavite s petljom:

Ako (dentry.attr & 0x10) (

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

Nastaviti;

Ako je ovo datoteka, pročitajte prvi broj klastera. Za kontrolu, pročitane informacije spremit ćemo u zasebnu datoteku:

Ako (dentry.attr & 0x20) (

Start_cluster = dentry.start;

Tmp_buff = (__u8 *) malloc (byte_per_cluster); // ovdje će se čitati sadržaj klastera

N = otvoren ("skup", O_CREAT | O_RDWR, 0600); // spremite pročitane informacije u ovu datoteku

Ako (n< 0) {

Pogreška ("otvoreno");

Povratak -1;

Za čitanje klastera datoteka, organizirat ćemo ciklus:

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

Čitamo sadržaj klastera u međuspremnik tmp_buff i spremamo ga u zasebnu datoteku:

< 0) return -1;

< 0) {

Perror ("pisati");

Zatvori (n);

Povratak -1;

Čitamo iz FAT16 broj sljedećeg klastera koji zauzima ova datoteka. Ako je ovo zadnji klaster, prekidamo petlju i vraćamo se na glavnu funkciju:

#ifdef DEBUG

Printf ("U redu. Pročitano");

Printf ("sljedeći klaster datoteke - 0x% X ..", sljedeći_cluster);

#završi ako

Ako (sljedeći_cluster == EOF_FAT16) (

#ifdef DEBUG

Printf ("zadnji klaster.");

#završi ako

Besplatno (tmp_buff);

Zatvori (n);

Vrati ++ i;

#ifdef DEBUG

Printf ("prestani čitati");

#završi ako

Vrati i;

Čitanje FAT16 sektora za podizanje sustava vrši se funkcijom read_fbs (). Rezultat se stavlja u globalnu fbs strukturu:

int read_fbs ()

Ako (čitaj (tvrdo, (__ u8 *) & fbs, sizeof (fbs))< 0) return -1;

Vrati 0;

Čitanje tablice dodjele datoteka FAT16 datotečnog sustava izvodi se funkcijom read_fat16 ():

int read_fat16 ()

U64 traženje = (__u64) (fbs.rezervirano) * 512; // pomak na FAT16 od početka particije

Fat16 = (void *) malloc (fat16_size);

Ako (pread64 (tvrdo, (__u8 *) fat16, fat16_size, traži)< 0) return -1;

Vrati 0;

Čitanje korijenskog direktorija izvodi se funkcijom read_root_dentry ():

int read_root_dentry ()

U64 traženje = (__u64) fbs.rezervirano * 512 + fat16_size * fbs.fats; // pomak prema korijenskom direktoriju od početka odjeljka

Root_size = 32 * dir_entries; // izračunati veličinu korijenskog direktorija

Dir_entry = (__u8 *) malloc (root_size);

Ako (! Dir_entry) vrati -1;

Memset (dir_entry, 0, root_size);

If (pread64 (hard, dir_entry, root_size, seek)< 0) return -1;

Vrati 0;

Čitanje klastera koji pripada datoteci izvodi se funkcijom read_cluster (). Ulazni parametri funkcije su broj klastera cluster_num i pokazivač na međuspremnik __u8 * tmp_buff, gdje se treba smjestiti rezultat čitanja. Pomak prema klasteru na sekciji izračunava se po formuli (vidi):

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

  • TRAŽITI- pomak prema klasteru na particiji
  • DATA_START- početak područja podataka
  • CLUSTER_NUM- redni broj klastera
  • BYTE_PER_CLUSTER- veličina klastera u bajtovima

int read_cluster (__ u16 cluster_num, __u8 * tmp_buff)

U64 traženje = (__u64) (byte_per_cluster) * (cluster_num - 2) + data_start; // izračunati pomak prema klasteru

< 0) return -1;

Vrati 0;

Funkcija read_directory čita unose u direktoriju (ne korijenski) i postavlja rezultat na memorijsku lokaciju na koju je postavljen pokazivač dir_entry:

int read_directory (__ u16 start_cluster)

Int i = 1;

U16 sljedeći_cluster;

Za (;; i ++) (

Dodjeljujemo memoriju za pohranjivanje sadržaja direktorija, čitamo sadržaj početnog klastera i dobivamo vrijednost sljedećeg klastera iz tablice FAT16:

Ako (! Dir_entry) vrati -1;

< 0) return -1;

Sljedeća_grupa = mast16;

Spremimo sadržaj direktorija u zasebnu datoteku (za kontrolu):

#ifdef DEBUG

Printf ("Sljedeći klaster - 0x% X", sljedeći_cluster);

Fat = otvoreno ("dir16", O_CREAT | O_WRONLY, 0600);

Write (fat, dir_entry, root_size);

Zatvori (masno);

#završi ako

Ako se dosegne zadnji klaster, izađite iz petlje, inače nastavite čitati direktorij, povećavajući veličinu međuspremnika dir_entry za još jedan klaster:

Ako (next_cluster & EOF_FAT16) break;

Start_cluster = sljedeći_cluster;

Vrati 0;

Funkcija get_dentry () traži u sadržaju direktorija stavku koja odgovara datoteci koju tražite. Ulazi za ovu funkciju su pokazivač na strukturu split_name * sn koja sadrži elemente kratkog naziva datoteke:

Int i = 0;

Globalni međuspremnik dir_entry sadrži niz unosa direktorija u kojem ćemo tražiti unos datoteke (ili direktorija). Za pretraživanje ćemo organizirati ciklus. U tijelu petlje kopirajte unose direktorija u globalnu strukturu dentry i usporedite vrijednost polja name i ext ove strukture s odgovarajućim poljima strukture split_name * sn. Podudarnost ovih polja znači da smo pronašli unos potrebne datoteke u nizu kataloških elemenata:

za (;; i ++) (

Ako (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Pauza;

Ako (! Dentry.name) vrati -1;

#ifdef DEBUG

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

Printf ("start cluster - 0x% X", dentry.start);

Printf ("veličina datoteke -% u", dentry.size);

Printf ("attrib datoteke - 0x% X", dentry.attr);

#završi ako

Vrati 0;

Sav gornji kod nalazi se u direktoriju FAT16, datoteka fat16.c. Da biste dobili izvršni modul, stvorite Makefile sa sljedećim sadržajem:

INCDIR = / usr / src / linux / uključiti

FONIJA = čist

Fat16: fat16.o split.o

Gcc -I $ (INCDIR) $ ^ -g -o [e-mail zaštićen]

% .o:% .c

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

Čist:

Rm -f * .o

Rm -f ./fat16

Programska implementacija algoritma za čitanje datoteke s logičke particije s datotečnim sustavom FAT12

Općenito, algoritam za čitanje datoteke s FAT12 particije identičan je algoritmu za čitanje datoteke s FAT16 particije. Razlika je u postupku očitavanja elemenata iz FAT12 tablice. Tablicu FAT16 smatrali smo jednostavnim nizom 16-bitnih elemenata. Predlaže se sljedeći algoritam za čitanje elemenata tablice FAT12:

  • pomnožite broj elementa s 1,5;
  • izdvojiti 16-bitnu riječ iz FAT-a koristeći rezultat prethodne operacije kao pomak;
  • ako je broj elementa paran, izvršite operaciju AND nad čitanom riječi i maskom 0x0FFF. Ako je broj neparan, pomaknite pročitanu riječ iz tablice za 4 bita prema najmanjim bitovima.

Na temelju ovog algoritma implementirat ćemo funkciju čitanja elemenata iz tablice FAT12:

int get_cluster (__ u16 cluster_num)

U16 traži;

U16 grozd;

Izračunajte pomak u tablici FAT12 i pročitajte 16-bitnu riječ iz tablice:

Traži = (broj_klastera * 3) / 2;

Memcpy ((__ u8 *) & clust, (__u8 *) (fat12 + traženje), 2);

Ako je početni broj klastera paran broj, očitanu vrijednost iz tablice pomičemo za 4 bita prema nižim znamenkama, ako je neparan dodajemo je u 0x0FFF:

Ako (cluster_num% 2) klast >> = 4;

Druga skupina & = 0x0FFF;

Ovaj se isječak također može implementirati u asembleru:

"xorw %% ax, %% ax"

"btw 0 $, %% cx"

"jnc 1f"

"shrw 4 $, %% dx"

"jmp 2f"

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

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

: "= a" (sljedeća)

: "d" (skup), "c" (broj_grupa));

Vraćamo rezultat:

Povratak grozd;

Zadržimo se još malo na samom algoritmu. Pretpostavimo da je datoteka stvorena na FAT12 particiji koja zauzima 9. i 10. klaster. Svaki element FAT12 dug je 12 bita. Jer čitamo 16-bitne elemente iz tablice, tada će pomak prema 9. elementu biti 13 bajtova (9 * 1,5 = 13, ostatak odbacujemo), dok će 4 najmanje značajna bita pripadati 8. elementu FAT-a. Moraju se odbaciti, a za to je dovoljno pomaknuti očitani element za 4 bita prema nižim znamenkama, što je predviđeno algoritmom. Pomak do 10. elementa bit će 15 bajtova, a najznačajnija 4 bita pripadat će 11. elementu FAT-a. Za njihovo odbacivanje potrebno je izvršiti operaciju AND na 10. elementu i maski 0x0FFF, što također odgovara gore navedenom algoritmu.

Izvorni kodovi modula za čitanje datoteke s FAT12 particije nalaze se u FAT12 direktoriju, datoteka fat12.c.

Programska implementacija algoritma za čitanje datoteke s logičke particije s datotečnim sustavom FAT32

Algoritam za čitanje datoteke s particije s datotečnim sustavom FAT32 praktički se ne razlikuje od algoritma za FAT16, osim što se u FAT32 korijenski direktorij može nalaziti bilo gdje na particiji i biti proizvoljne veličine. Stoga, da bude zanimljivije, zakomplicirajmo zadatak – pretpostavimo da znamo samo broj particije s datotečnim sustavom FAT32. Da biste pročitali informacije iz ovog odjeljka, prvo morate odrediti njegove koordinate - pomak prema odjeljku od početka diska. A za to morate imati ideju o logičkoj strukturi tvrdog diska.

Logička struktura tvrdog diska

Razmotrite logičku strukturu tvrdog diska koja je u skladu s Microsoftovim standardom - "glavna particija - proširena particija - particije koje nisu DOS".

Prostor na tvrdom disku može biti organiziran kao jedna ili više particija, a particije mogu sadržavati jedan ili više logičkih pogona.

Tvrdi disk na fizičkoj adresi 0-0-1 sadrži glavni zapis za pokretanje (MBR). MBR struktura sadrži sljedeće elemente:

  • ne-sustavna bootstrap (NSB);
  • tablica opisa particija diska (tablica particija, PT). Nalazi se u MBR-u na pomaku 0x1BE i zauzima 64 bajta;
  • MBR potpis. Posljednja dva bajta MBR-a moraju sadržavati broj 0xAA55.

Tablica particija opisuje mjesto i karakteristike particija dostupnih na tvrdom disku. Particije diska mogu biti dvije vrste - primarne i proširene. Maksimalan broj primarnih particija je četiri. Obavezno je imati barem jednu primarnu particiju na disku. Proširena particija može se podijeliti na veliki broj pododjeljaka - logičkih pogona. Pojednostavljena struktura MBR-a prikazana je u tablici 7. Tablica particija nalazi se na kraju MBR-a, a za opis particije u tablici dodijeljeno je 16 bajtova.

Tablica 7. MBR struktura

Pristranost Veličina, bajtovi 0 446 0x1BE 16 0x1CE 16 0x1DE 16 0x1EE 16 0x1FE 2

Struktura unosa unosa particione tablice prikazana je u tablici 8.

Tablica 8. Struktura unosa elementa particione tablice

Pristranost Veličina, bajtovi Sadržaj
0x00 1 Aktivan znak (0 - odjeljak nije aktivan, 0x80 - odjeljak je aktivan)
0x01 1 Broj glave diska od kojeg počinje particija
0x02 2 Broj cilindra i broj sektora od kojeg dio počinje
0x04 1 Kod vrste odjeljka ID sustava
0x05 1 Broj glave diska gdje završava particija
0x06 2 Broj cilindra i broj sektora koji završava odjeljak
0x08 4 Apsolutni (logički) broj početnog sektora particije
0x0C 4 Veličina particije (broj sektora)

Prvi bajt u elementu sekcije je oznaka aktivnosti sekcije (0 - neaktivno, 0x80 - aktivno). Služi za utvrđivanje je li particija sustav za podizanje sustava i postoji li potreba za podizanjem operativnog sustava s nje kada se računalo pokrene. Samo jedan odjeljak može biti aktivan. Nakon oznake aktivne particije slijede koordinate početka particije - tri bajta, što znači broj glave, broj sektora i broj cilindra. Brojevi cilindara i sektora navedeni su u formatu prekida Int 0x13, tj. bitovi 0-5 sadrže broj sektora, bitovi 6-7 su najznačajnija dva bita 10-bitnog broja cilindra, a bitovi 8-15 su najmanje značajnih osam bitova broja cilindra. Nakon toga slijedi ID sustava, koji identificira operativni sustav za ovu particiju. Identifikator je jedan bajt. Iza identifikatora sustava nalaze se koordinate kraja odjeljka - tri bajta koji sadrže brojeve glave, sektora i cilindra. Sljedeća četiri bajta su broj sektora prije particije, a posljednja četiri bajta su veličina particije u sektorima.

Dakle, element tablice sekcija može se opisati pomoću sljedeće strukture:

struct pt_struct (

U8 za podizanje; // oznaka aktivnosti odjeljka

U8 početni_dio; // koordinate početka dionice

U8 tip_dio; // identifikator sustava

U8 krajnji dio; // koordinate kraja odsjeka

U32 sect_prije; // broj sektora prije odjeljka

U32 sect_total; // veličina particije u sektorima (broj sektora u particiji)

Element primarne particije upućuje izravno na sektor za pokretanje logičkog diska (u primarnoj particiji uvijek postoji samo jedan logički disk), a element proširene particije upućuje na popis logičkih diskova sastavljen od struktura koje se nazivaju sekundarni MBR (SMBR).

Svaki disk proširene particije ima svoj vlastiti SMBR blok. SMBR ima strukturu sličnu MBR-u, ali nema zapis za pokretanje (ispunjen nulama), a koriste se samo dva od četiri deskriptorna polja particije. Prvi element particije pokazuje na logički disk, drugi element ukazuje na sljedeću SMBR strukturu na popisu. Posljednji SMBR popisa sadrži kod nulte sekcije u drugom elementu.

Vratimo se na modul za čitanje datoteke s FAT32 particije.

Datoteke zaglavlja:

#uključiti

#uključiti

#uključiti

#uključiti

#uključiti

MBR potpis:

#define POTPIS 0xAA55

Datoteka uređaja iz koje će se čitati informacije o particijama:

#define UREĐAJ "/ dev / hda"

Veličina elementa particione tablice (16 bajtova):

#define PT_SIZE 0x10

Sljedeći niz struktura postavlja korespondenciju između koda tipa odjeljka i njegovog simboličkog prikaza:

struct systypes (

U8 tip_dijela;

U8 * naziv_dijela;

struct systypes i386_sys_types = (

(0x00, "Prazno"),

(0x01, "FAT12"),

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

(0x05, "Prošireno"),

(0x06, "FAT16"),

(0x0b, "Win95 FAT32"),

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

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

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

(0x82, "Linux swap"),

(0x83, "Linux"),

(0x85, "Linux proširen"),

(0x07, "HPFS / NTFS")

Odredite broj elemenata u nizu i386_sys_types pomoću makronaredbe PART_NUM:

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

Postavimo ograničenje broja logičkih diskova:

#define MAX_PART 20

Sljedeći niz strukture sadržavat će informacije o logičkim diskovima na uređaju (tvrdi disk):

struct pt_struct (

U8 za podizanje;

U8 početni_dio;

U8 tip_dio;

U8 krajnji dio;

U32 sect_prije;

U32 sect_total;

) pt_t;

int teško; // deskriptor datoteke uređaja

U8 mbr; // ovdje brojite MBR

Broj particije na kojoj je kreiran datotečni sustav FAT32:

#define FAT32_PART_NUM 5

Sektor za pokretanje, sektor FSInfo i strukture unosa u katalog (definirano u datoteci ):

struct fat_boot_sector fbs;

struct fat_boot_fsinfo fsinfo;

struct msdos_dir_entry dentry;

U32 * fat32 = NULL; // ovdje kopirajte tablicu FAT32

U16 veličina_sektora; // veličina sektora (od FAT32)

U16 dir_entries; // 0 za FAT32

U16 sektori; // broj sektora po particiji

U32 mast32_veličina; // Veličina FAT32

U32 početak_podataka; // početak područja podataka

U16 byte_per_cluster; // koliko je bajtova u klasteru (veličina klastera u bajtovima)

U32 sljedeći_cluster; // sljedeći klaster u lancu

U32 root_cluster; // ROOT cluster - početni korijenski klaster

U8 * dir_entry = NULL; // pokazivač na unose direktorija

U64 start_seek = 0; // početni pomak do odjeljka (u bajtovima)

Glavna funkcija:

int main ()

Int broj = 0;

Int cluster_num = 5; // koliko klastera za čitanje iz datoteke

U8 * full_path = "/ Folder1 / Folder2 / readme"; // datoteka za čitanje

Otvaramo uređaj, dobivamo informacije o tablici particija na uređaju i prikazujemo informacije o particijama:

Tvrdo = otvoreno (DEV_NAME, O_RDONLY);

Ako (teško< 0) {

Pogreška (DEV_NAME);

Izlaz (-1);

Ako (get_pt_info (teško)< 0) {

Pogreška ("get_pt_info");

Izlaz (-1);

Prikaži_pt_info ();

Izračunavamo početni pomak za dionicu:

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

Čitamo klastere koji pripadaju datoteci:

Broj = fat32_read_file (pun_put, klaster_num);

Ako (br< 0) perror("fat32_read_file");

Else printf ("Čitanje% d klastera \ n", broj);

Zatvori (tvrdo);

Vrati 0;

Informacije o tablici particija čita funkcija get_pt_info ():

int get_pt_info (int hard)

Int i = 0;

U64 tražiti;

Čitamo particijsku tablicu iz MBR-a i provjeravamo potpis:

Read_main_ptable (tvrdo);

Ako (znak_provjere ()< 0) {

Printf ("Nevažeći potpis! \ N");

Povratak -1;

Tražimo identifikator proširenog odjeljka. Ako postoji, izračunavamo pomak prema proširenoj particiji i čitamo informacije o logičkim diskovima:

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

Ako je ((pt_t [i] .type_part == 0xF) || \

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

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

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

Read_ext_ptable (teško, traži);

Pauza;

Vrati 0;

Read_main_ptable () funkcija za čitanje tablice particija:

void read_main_ptable (int hard)

Ako (čitaj (tvrdo, mbr, 512)< 0) {

Pogreška ("čitaj");

Zatvori (tvrdo);

Izlaz (-1);

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

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

Povratak;

Funkcija provjere potpisa check_sign ():

int check_sign ()

U16 znak = 0;

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

#ifdef DEBUG

Printf ("Potpis - 0x% X \ n", znak);

#završi ako

Ako (znak! = POTPIS) vrati -1;

Vrati 0;

Funkcija čitanja proširene tablice particija:

void read_ext_ptable (int hard, __u64 traži)

Int broj = 4; // počevši od ove pozicije, niz pt_t struktura bit će ispunjen informacijama o logičkim diskovima

U8 smbr;

Ulazni podaci:

  • teško- deskriptor datoteke uređaja;
  • tražiti- pomak na proširenu particiju od početka diska (u bajtovima).

Da bismo dobili informacije o logičkim diskovima, organiziramo ciklus:

Za (;; broj ++) (

Čitamo SMBR koji se nalazi na traženju pomaka od početka diska:

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

Pread64 (tvrdo, smbr, 512, traži);

Popunjavamo dva elementa pt_t tablice, počevši od pozicije br. Prva stavka pokazat će na logički pogon, a druga na sljedeću SMBR strukturu:

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

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

Unosimo dopunu u polje "Broj početnog sektora" - brojanje je od početka diska:

Pt_t.sect_before + = (traži / 512);

Ako je kod vrste particije nula, tada više nema logičkih pogona:

Ako (! (Pt_t.type_part)) break;

Izračunajte pomak na sljedeći SMBR:

Traži = ((__u64) (pt_t.sect_before + pt_t.sect_total)) * 512;

Povratak;

Funkcija show_pt_info () prikazuje informacije o pronađenim logičkim pogonima na uređaju:

void show_pt_info ()

Int i = 0, n;

#ifdef DEBUG

Printf ("Broj particija na disku -% d \ n", PART_NUM);

#završi ako

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

Ako (! Pt_t [i] .type_part) break;

Printf ("\ nTip odjeljka% d -", i);

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

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

Printf ("% s \ n", i386_sys_types [n] .part_name);

Pauza;

Ako (n == DEL_NUM) printf ("nepoznata vrsta \ n");

Printf ("Znak za pokretanje - 0x% X \ n", pt_t [i] .bootable);

Printf ("Sektori u odjeljku% d -% d \ n", i, pt_t [i] .sect_total);

Printf ("Sektori prije odjeljka% d -% d \ n \ n", i, pt_t [i] .sect_before);

Povratak;

Čitanje klastera datoteka s FAT32 particije izvodi se funkcijom fat32_read_file (). Ova funkcija ima puno zajedničkog s funkcijom fat16_read_file (), pa pogledajte odjeljak 6 za detaljne komentare:

int fat32_read_file (__ u8 * puni_put, int broj)

Struktura split_name sn;

U8 tmp_name_buff;

Int i = 1, n;

U32 start_cluster, sljedeći_cluster;

U8 * tmp_buff;

Pripremne operacije - obrišite međuspremnik, strukturirajte i provjerite prvu kosu crtu:

Memset (tmp_name_buff, 0, SHORT_NAME);

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

Ako (pun_put! = "/") Vrati -1;

Čitamo boot sektor:

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

Memcpy ((void *) & veličina_sektora, (void *) fbs.sector_size, 2);

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

Memcpy ((void *) & sektori, (void *) fbs.sectors, 2);

Čitamo strukturu FSInfo i prikazujemo potpis sadržan u njoj:

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

Printf ("Potpis1 - 0x% X \ n", fsinfo.signature1);

Printf ("Potpis2 - 0x% X \ n", fsinfo.signature2);

Fat32_size = fbs.fat32_length * 512; // Veličina FAT32 u bajtovima

Data_start = 512 * fbs.reserved + fat32_size * 2; // početak podatkovnog polja

Byte_per_cluster = fbs.cluster_size * 512; // veličina klastera u bajtovima

Root_cluster = fbs.root_cluster; // broj klastera korijenskog direktorija

Čitamo FAT32:

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

Dodijelite memoriju za unose imenika:

Dir_entry = (__u8 *) malloc (byte_per_cluster);

Ako (! Dir_entry) vrati -1;

Čitamo korijenski direktorij:

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

Raščlanjujemo puni put datoteke i dijelimo svaki element na njegove komponente:

Dok (1) (

Memset (tmp_name_buff, 0, SHORT_NAME);

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

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

Tmp_name_buff [n] = puni_put [i];

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

ja ++;

Pauza;

Tmp_name_buff [n] = "\ 0";

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

Printf ("nevažeće ime \ n");

Povratak -1;

Ako (get_dentry (& sn)< 0) {

Printf ("Nema takve datoteke! \ N");

Povratak -1;

Da biste dobili početni broj klastera u datotečnom sustavu FAT32, trebate upotrijebiti najvažniju riječ broja prvog klastera datoteke - starthi polje strukture dentry:

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

Provjera bajta atributa:

If (dentry.attr & 0x10) (// ovo je imenik

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

Nastaviti;

Ako (dentry.attr & 0x20) (// a ovo je datoteka

Tmp_buff = (__u8 *) malloc (byte_per_cluster);

N = otvoren ("skup", O_CREAT | O_RDWR, 0600);

Ako (n< 0) {

Pogreška ("otvoreno");

Povratak -1;

Printf ("prvi klaster datoteke - 0x% X ..", start_cluster);

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

Memset (tmp_buff, 0, byte_per_cluster);

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

Ako (napišite (n, tmp_buff, byte_per_cluster)< 0) {

Perror ("pisati");

Povratak -1;

Ako (sljedeći_cluster == EOF_FAT32) (

Besplatno (tmp_buff);

Zatvori (n);

Vrati ++ i;

Start_cluster = sljedeći_cluster;

Vrati i;

Svrha sljedeće tri funkcije je dobiti sadržaj područja sustava, t.j. sektor za pokretanje, FSInfo struktura i FAT32 tablica:

1) funkcija read_fbs () čita sektor za pokretanje:

int read_fbs ()

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

Vrati 0;

2) funkcija read_fs_info () čita strukturu FSInfo:

int read_fs_info ()

U64 traženje = (__u64) fbs.info_sector * 512 + start_seek;

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

Vrati 0;

3) funkcija read_fat32 () čita tablicu FAT32:

int read_fat32 ()

U64 traženje = (__u64) fbs.rezervirano * 512 + start_seek;

Fat32 = (void *) malloc (fat32_size);

Ako (! Fat32) vrati -1;

Ako (pread64 (tvrdo, (__u8 *) fat32, fat32_size, traži)< 0) return -1;

Vrati 0;

Funkcija read_cluster () čita klaster s navedenim brojem:

int read_cluster (__ u32 cluster_num, __u8 * tmp_buff)

U64 traženje = (__u64) (byte_per_cluster) * (cluster_num - 2) + data_start + start_seek;

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

Vrati 0;

Čitanje direktorija (uključujući korijenski) upravlja se funkcijom read_directory ():

int read_directory (__ u32 start_cluster)

Int i = 2;

U32 sljedeći_cluster;

Parametri funkcije - početni klaster direktorija. Čitamo sadržaj direktorija u globalni međuspremnik dir_entry:

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

Sljedeća_cluster = fat32;

Ako imenik zauzima jedan klaster - izađite, ako ne - povećajte veličinu memorije i nastavite čitati:

Za (;; i ++) (

Start_cluster = sljedeći_cluster;

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

Ako (! Dir_entry) vrati -1;

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

Sljedeća_cluster = fat32;

Ako ((sljedeći_cluster == EOF_FAT32) || (sljedeći_cluster == 0xFFFFFF8)) vrati 0;

Vrati 0;

Posljednja funkcija koju ćemo pogledati pretražuje sadržaj direktorija za element koji odgovara datoteci koju tražite:

int get_dentry (struct split_name * sn)

Int i = 0;

Pokazivač dir_entry je postavljen na područje memorije koje sadrži niz unosa direktorija u kojem ćemo tražiti datoteku (ili direktorij). Za pretraživanje organiziramo ciklus i stavljamo pronađeni zapis u globalnu strukturu zuba:

Za (;; i ++) (

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

Ako (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Pauza;

Ako (! Dentry.name) vrati -1;

Vrati 0;

Ovim je završen pregled modula za čitanje datoteke s FAT32 particije.

Izvorni kodovi modula nalaze se u FAT32 direktoriju, datoteci fat32.c.

Razlike u organizaciji pohranjivanja zapisa datoteka u direktorije za FAT i EXT2 datotečne sustave

Nekoliko riječi o razlikama u organizaciji pohranjivanja zapisa datoteka u direktorije za FAT i EXT2 datotečne sustave. O strukturi datotečnog sustava EXT2 raspravljalo se u.

Upravo smo se upoznali s FAT-om - u njemu svi elementi kataloga imaju fiksnu veličinu. Prilikom izrade datoteke upravljački program datotečnog sustava traži prvu nezauzetu poziciju i ispunjava je informacijama o datoteci. Ako duljina imenika ne stane u jedan klaster, tada mu se dodjeljuje drugi klaster itd.

Da vidimo kako stoje stvari u EXT2.

Pretpostavimo da imamo particiju s datotečnim sustavom EXT2, veličina bloka je 4096 bajtova. U ovom odjeljku stvaramo imenik. Veličina direktorija bit će jednaka veličini bloka - 4096 bajtova. Operativni sustav odmah kreira dva unosa u imeniku - unos za trenutni imenik i unos za roditeljski imenik. Trenutni unos imenika zauzimat će 12 bajtova, dok će roditeljski unos biti 4084 bajta. Kreirajmo datoteku u ovom direktoriju. Nakon toga, imenik će sadržavati tri unosa - trenutni unos imenika je dugačak 12 bajtova, roditeljski unos je već 12 bajtova, a kreirani unos datoteke je, kao što ste vjerojatno pogodili, dugačak 4072 bajta. Ako izbrišemo kreiranu datoteku, duljina unosa roditeljskog direktorija ponovno će narasti na 4084 bajta.

Stoga, prilikom stvaranja datoteke, upravljački program datotečnog sustava EXT2 traži u direktoriju unos maksimalne duljine i dijeli ga, ostavljajući mjesta za novi unos. Pa, ako ipak nema dovoljno prostora, za imenik se dodjeljuje još jedan blok, a duljina direktorija postaje jednaka 8192 bajta.

I u zaključku - mali ispravak članka "Arhitektura datotečnog sustava EXT2".

Ova revizija se odnosi na funkciju get_i_num () za određivanje inode broja po imenu datoteke. Stara verzija ove funkcije izgledala je ovako:

int get_i_num (znak * ime)

Int i = 0, rec_len = 0;

Struktura ext2_dir_entry_2 udubljenje;

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

Ako (! Memcmp (dent.name, name, dent.name_len)) break;

Rec_len + = dent.rec_len;

Povratak dent.inode;

Ispravljena verzija:

int get_i_num (znak * ime)

* Parametar funkcije - naziv datoteke. Povratna vrijednost je inode broj datoteke.

Int rec_len = 0;

Struktura ext2_dir_entry_2 udubljenje; // ova struktura opisuje format unosa korijenskog direktorija:

* Globalni buff sadrži niz unosa direktorija. Da biste odredili serijski broj inode datoteke, morate pronaći

* u ovom nizu, unos s nazivom ove datoteke. Da bismo to učinili, organizirat ćemo ciklus:

Za (;;) (

/ * Kopiraj unose imenika u strukturu udubljenja: * /

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

* Duljina naziva datoteke jednaka nuli znači da smo nabrojali sve unose direktorija

* i zapisi s nazivom naše datoteke nisu pronađeni. Dakle, vrijeme je da se vratimo:

Ako (! Dent.name_len) vrati -1;

/ * Pretraživanje se vrši uspoređivanjem naziva datoteka. Ako se imena podudaraju, izađite iz petlje: * /

Ako (! Memcmp (dent.name, name, strlen (name))) break;

/ * Ako se imena ne podudaraju, prijeđite na sljedeći unos: * /

Rec_len + = dent.rec_len;

/ * Ako je uspješno, vratite inode broj datoteke: * /

Povratak dent.inode;

Književnost:

  1. V. Kulakov. Hardversko programiranje: posebna referenca. 2. izd. / - SPb .: Petar, 2003. - 848 str.
  2. A. V. Gordejev, A. Yu. Molčanov. Sistemski softver / - SPb .: Petar - 2002
  3. Meshkov V. Arhitektura datotečnog sustava ext2. - Časopis "Administrator sustava", br. 11 (12), studeni 2003. - 26-32 str.

U kontaktu s

Pročitajte o datotečnim sustavima u ovom članku.

Sustav za upravljanje datotekama glavni je u velikoj većini modernih operativnih sustava. Svi moderni operativni sustavi koriste datoteke i pripadajući softver za rad s njima. Činjenica je da, prvo, mnogi programi za obradu sustava komuniciraju kroz datotečni sustav prema podacima. Drugo, uz pomoć ovog sustava rješavaju se problemi centralizirane dodjele diskovnog prostora i upravljanja podacima. Konačno, korisnici dobivaju lakše načine za pristup svojim podacima koje pohranjuju na vanjskim uređajima za pohranu.

Postoji veliki broj datotečnih sustava stvorenih za različite vanjske memorijske uređaje i različite operacijske sustave. Koriste, odnosno, različite principe postavljanja podataka na nosač. To su FAT, FAT32 i NTFS sustavi.

Možemo reći da je glavna svrha datotečnog sustava i odgovarajućeg sustava za upravljanje datotekama omogućiti prikladan pristup podacima organiziranim u obliku datoteka, odnosno umjesto pristupa na niskoj razini podacima koji ukazuju na specifične fizičke adrese zapisa koje mi potrebno, koristimo logički pristup koji označava naziv datoteke i zapis u njemu.

Datotečni sustav FAT (Tablica dodjele datoteka) dobiva ime iz jednostavne tablice koja navodi:

  • izravno adresabilni dijelovi logičkog diska, koji su izdvojeni za postavljanje datoteka ili njihovih fragmenata u njih; Slobodna područja prostora na disku;
  • neispravna područja diska (ova područja sadrže neispravna područja i ne jamče čitanje i pisanje podataka bez pogrešaka).

U datotečnom sustavu FAT, diskovni prostor bilo kojeg logičkog diska podijeljen je u dva područja (Sl. područje sustava i podatkovno područje.

Područje sustava logičkog diska kreira se i inicijalizira tijekom formatiranja, a zatim se ažurira tijekom rada sa strukturom datoteka. Područje podataka logičkog diska sadrži obične datoteke i datoteke direktorija; ti objekti čine hijerarhiju podređenu korijenskom direktoriju. Unos direktorija opisuje objekt datoteke, koji može biti obična datoteka ili datoteka direktorija. Područje podataka, za razliku od područja sustava, dostupno je putem korisničkog sučelja operacijskog sustava. Područje sustava sastoji se od sljedećih komponenti (koje se nalaze jedna iza druge u logičkom adresnom prostoru):

  • Zapis o pokretanju (BR)
  • rezervirani sektori (Reserved Sectors, ResSec);
  • Tablica dodjele datoteka (FAT)
  • Korijenski imenik (RDir).

Tablica dodjele datoteka vrlo je važna informacijska struktura. Možemo reći da je to adresna karta podatkovnog područja, koja opisuje stanje svakog dijela podatkovnog područja i njegovu pripadnost jednom ili drugom datotečnom objektu,

Cijelo područje podataka podijeljeno je na tzv grozdovima. Klaster je jedan ili više susjednih sektora u logičkom adresnom prostoru diska (točnije, samo u podatkovnom području). Klaster je najmanja adresabilna jedinica diskovnog prostora dodijeljena datoteci (ili nekorijenskom direktoriju). Klasteri su uvedeni kako bi se smanjio broj adresabilnih jedinica u podatkovnom području logičkog diska.

Svaka datoteka zauzima cijeli broj klastera. U ovom slučaju, posljednji klaster možda neće biti u potpunosti uključen, što, uz veliku veličinu klastera, može dovesti do zamjetnog gubitka prostora na disku. Na disketama klaster zauzima jedan ili dva sektora, a na tvrdim diskovima njegova veličina ovisi o volumenu particije. U FAT tablici klasteri koji pripadaju istoj datoteci (ili direktoriju datoteka) povezani su u lance. 16-bitna riječ koristi se za označavanje broja klastera u datotečnom sustavu FAT16, stoga možete imati do 2 16 = 65 536 klastera (s brojevima od 0 do 65 535).

Budući da se datoteke na disku mijenjaju (brišu, premještaju, povećavaju ili smanjuju), spomenuto pravilo za dodjelu prvog slobodnog klastera za novi podatak dovodi do fragmentacija datoteke, odnosno podaci jedne datoteke mogu se nalaziti ne u susjednim skupinama, već ponekad u vrlo udaljenim jedna od druge, tvoreći složene lance. Naravno, to dovodi do značajnog usporavanja rada s datotekama.

Zbog činjenice da se FAT tablica koristi vrlo intenzivno pri pristupu disku, obično se učitava u RAM (u I/O međuspremnike ili u predmemoriju) i ostaje tamo što je dulje moguće. Ako je tablica velika, ali je predmemorija datoteka, s druge strane, relativno mala, u memoriju se pohranjuju samo fragmenti ove tablice kojima se nedavno pristupilo.

Svatko tko je ikada instalirao operativni sustav naišao je na činjenicu da u fazi formatiranja instalacijske particije tvrdog diska program nudi odabir vrste datotečnog sustava FAT ili NTFS.

A oni koji su slučajno formatirali flash disk ili neki drugi vanjski uređaj za pohranu morali su se odlučiti između tri datotečna sustava FAT32, NTFS i exFAT. Korisnici najčešće biraju zadano oblikovanje jer ne znaju u čemu je razlika.

Ovaj članak je namijenjen onima koji žele popuniti ovu prazninu u svom znanju.

Struktura FAT datoteke: principi i svrha

Struktura datoteke ili Sustav datoteka razvijena je 70-ih godina prošlog stoljeća od strane Microsofta i predstavljala je određeni red organiziranja prostora za pohranu i pristup podacima na računalima i drugim digitalnim uređajima.

Svrha funkcionalnosti je pružiti korisniku praktično upravljanje informacijama pohranjenim na disku ili vanjskom gadgetu. Datotečni sustav uključuje datoteke, mape i direktorije, kao i skup sistemskih alata koji su u interakciji s njima radi obavljanja funkcija čitanja-pisanja, stvaranja-brisanja, kopiranja, imenovanja itd. Osim toga, ova struktura organizira zajednički pristup informacijama između korisnika i osigurava zaštitu od neovlaštenih radnji šifriranjem, radom u načinu "samo za čitanje" i tako dalje.

Strukturno, cijelo područje diskovnog prostora podijeljeno je u klastere, poput lista papira u kavezu. Svaka ćelija je blok čija je veličina određena tijekom formatiranja i mora biti višekratnik 2. Minimalna veličina može biti 512 bajtova (za flash pogon), za tvrdi disk je 32 KB. Jedna datoteka može zauzeti nekoliko takvih klastera. Slikovito, možete zamisliti prostor na disku u obliku bilježnice, gdje je klaster slovo, datoteka je riječ, a struktura datoteke je sadržaj bilježnice.

Prilikom pristupa datoteci, operativni sustav je mora pronaći u nekoliko klastera smještenih na različitim mjestima na disku, formirajući tako lanac klastera. Svaki klaster ima svoju oznaku, koja ga definira kao jednu od tri vrste:

  1. Besplatno, spreman za pisanje podataka.
  2. Zauzet, koji pohranjuje dio informacija i ima podatke u oznaci o sljedećem klasteru u lancu, dok je potonji označen posebnom oznakom.
  3. BAD-blok - klaster s pogreškama, koji nakon formatiranja postaje nedostupan.

Veličina oznake određena je vrstom strukture datoteke: za FAT32 to je 32 bajta.

Cijeli datotečni sustav sastoji se od sljedećih dijelova:

  • sektor za pokretanje, koji se nalazi na početku diska, aktivira se nakon pokretanja OS-a i pohranjuje parametre particije;
  • tablicu dodjele datoteka ("sadržaj") koja pohranjuje oznake klastera;
  • kopije tablice dodjele datoteka za oporavak podataka u slučaju oštećenja strukture datoteke;
  • korijenski direktorij;
  • područja podataka;
  • cilindar za obavljanje operacija čitanja/pisanja.

Ukupno postoje tri tipa FAT sustava datoteka: FAT12, FAT16 i FAT32. FAT je zamijenjen NTFS-om, a exFAT je proširena verzija FAT32 i koristi se uglavnom za flash diskove.

Prednosti i nedostaci FAT32, NTFS i exFAT datotečnih struktura

Kako biste odredili izbor najoptimalnijeg datotečnog sustava za formatiranje, razmotrite opise sve tri opcije, usredotočujući se na prednosti i nedostatke svake.

FAT32

Od tri razmatrane strukture datoteka, FAT32 je najstarija. Zamijenio je FAT16 i donedavno je bio najprogresivniji. Izdanje FAT32 tempirano je da se poklopi s izdavanjem operativnog sustava Windows 95 OSR2 1996. godine. Glavne razlikovne značajke su: 32-bitno adresiranje klastera i ograničenja veličine: datoteka ne veća od 4 GB i volumen od 128 GB.

Dostojanstvo

Unatoč određenoj moralnoj zaostalosti, FAT32 ima niz prednosti u odnosu na druge datotečne sustave. Njegova glavna atrakcija je kompatibilnost i svestranost. FAT32 radi sa svim verzijama operativnih sustava, uključujući Windows (usporedba svih verzija), Linux i MacOS, pogodan za sve igraće konzole i druge gadgete s USB priključkom. Danas se prema zadanim postavkama koristi u svim vanjskim pogonima (flash diskovi, CD-kartice), budući da mnogi stari uređaji: računala, prijenosna računala, set-top box uređaji s USB ulazom mogu raditi samo s FAT32.

Ostale važne prednosti datotečnog sustava su: brze performanse, nezahtjevna količina RAM-a, produktivan rad s datotekama srednje i male veličine, kao i nisko trošenje diska zbog manjeg pomaka glave. No, sklon je i fragmentaciji, a periodična defragmentacija definitivno neće naštetiti.

Nedostaci

Glavni nedostatak ovog datotečnog sustava je ograničenje veličine. Za klastere ne može biti veći od 64 KB, inače neke aplikacije mogu pogrešno izračunati prostor na disku.

Veličina datoteke ne smije biti veća od 4 GB, tako da bi maksimalna veličina diska za klaster tablice dodjele datoteka od 32 KB bila oko 8 TB.

Prilikom formatiranja diska pomoću ScanDisk-a, koji je 16-bitni program, uzimajući u obzir same FAT tablice, i s maksimalnom veličinom klastera od 32 KB, volumen je ograničen na 128 GB.

S obzirom na činjenicu da nema mnogo računalnih uređaja opremljenih tvrdim diskom kapaciteta većeg od 8 TB, ovaj nedostatak većini korisnika neće biti uočljiv. Međutim, činjenica da FAT32 radi s datotekama do 4 GB je značajan nedostatak, budući da je većina kvalitetnih video datoteka modernog 4K formata danas veća od ovih 4 GB, što znači da nisu kompatibilne s ovim datotečnim sustavom.

Osim ograničenja veličine, FAT32 ima i druge nedostatke. Ne podržava duge nazive datoteka, što je nezgodno za korisnike koji žele logički identificirati datoteke na temelju njihovog sadržaja. Postoje pritužbe na sigurnosni sustav (dodatni antivirusni skener neće ometati) i sigurnost datoteka u slučaju kvarova (osobito tvrdih diskova), kao i na nisku brzinu rada s direktorijima koji sadrže mnogo datoteka.

Dakle, FAT32 je prikladniji za prijenosne uređaje koji nisu jako prostrani i stara računala. Najnovije verzije sustava Windows više se ne mogu instalirati na disk formatiran FAT32, morate ga preformatirati u NTFS.

Glavna primjena datotečnog sustava FAT32 danas su prijenosni flash pogoni i SD kartice (značajke), koje sadrže malo datoteka i kompatibilne su s raznim digitalnim uređajima.

NTFS

Ovaj datotečni sustav razvio je Microsoft 1993. i uveden zajedno sa Windows NT 3.1. U samom nazivu nova tehnologija datotečnog sustavašto znači nova tehnologija datotečnog sustava, položena je njegova progresivna bit.

Nakon formatiranja diska u NTFS, podijeljen je u tri zone:

  • MFT - zona ili opća tablica datoteka (Master File Table), gdje se pohranjuju podaci o datotekama i direktorijima;
  • korisnički podaci;
  • metadatoteke koje sadrže informacije o usluzi.

Svaka od metadatoteka odgovorna je za određeno područje. Na primjer, LogFile je datoteka dnevnika u kojoj su sve operacije zapisane u dnevnik, Boot je sektor za podizanje sustava, Bitmap prati slobodan prostor na particiji itd. Takva struktura pouzdano štiti datoteke od bilo kakvih kvarova, bilo da se radi o zamrzavanju OS-a ili nestanku struje.

Dostojanstvo

Za razliku od FAT32, ova struktura datoteka praktički nema ograničenja na veličinu datoteka i direktorija. Veličina klastera može varirati od 512 bajtova do 64 KB, optimalna veličina se smatra 4 KB.

Zahvaljujući mnogim značajnim poboljšanjima za poboljšanje sigurnosti, kao što su podrška za dopuštenja datoteka, HPFS kvote, enkripcija, vođenje dnevnika, kontrola pristupa i revizija, tvrde veze i još mnogo toga, NTFS je idealan za formatiranje diska za područje sustava. Druge particije tvrdog diska također se mogu formatirati u ovom sustavu, budući da NTFS omogućuje optimalno korištenje prostora na disku u prisutnosti mnogo malih datoteka.

Prednost ove organizacije datoteka je brz pristup malim datotekama, visoka učinkovitost pri radu s velikim datotekama i mogućnost korištenja dugih naziva datoteka.

Nedostaci

Glavni nedostatak NTFS-a je nekompatibilnost sa svim operativnim sustavima ispod Windows NT, kao i ograničenja u kompatibilnosti s drugim operativnim sustavima. Dakle, Mac OS čita datoteke s NTFS diskova, ali ih ne može pisati, ista situacija s kompatibilnošću datoteka s Linuxom. Najpopularnije igraće konzole Playstation i Xbox 360 ne rade s NTFS-om, samo Xbox One može komunicirati s njim.

Među nedostacima NTFS-a su visoki zahtjevi za RAM-om, sporija brzina u usporedbi s FAT32 i poteškoće u upravljanju imenicima srednje veličine.

Stoga je svrsishodnije koristiti strukturu NTFS datoteka na tvrdim diskovima, uključujući SSD-ove s najnovijim verzijama sustava Windows, počevši od NT-a.

exFAT

Ovaj datotečni sustav posljednji je koji se razmatra za izdavanje. Pojavio se 2008. godine sa sljedećim ažuriranjima za Windows XP i zapravo je proširena verzija FAT32.

Glavni cilj programera je stvoriti produktivnu, prikladnu i svestranu strukturu datoteka za prijenosne uređaje za pohranu: flash pogone, SD kartice i uklonjive tvrde diskove.

prednosti:

  • Jednostavna organizacija bez specijaliziranih značajki i ograničenja veličine datoteka i particija.
  • Izvrsna kompatibilnost sa svim Windows OS, kao i Mac OS i Linux. Potonja opcija zahtijeva instalaciju dodatnog softvera.
  • Podrška sa svih modernih Apple uređaja, kao i Xbox One i Playstation 4 igraćih konzola.

Glavni nedostatak organizacije exFAT datoteka je Microsoftova politika licenciranja koja zabranjuje njihovu slobodnu upotrebu u javnoj domeni.

Najoptimalnija struktura datoteka

Nakon pregleda opisa tri popularna datotečna sustava, mogu se izvući sljedeći zaključci:

  • za računalne uređaje s operativnim sustavom višim od Windows NT, bit će svrsishodnije formatirati tvrdi disk u NTFS sustavu;
  • za stare uređaje, kao i za kompatibilnost s raznim modernim digitalnim gadgetima, najbolja bi opcija bila odabrati FAT32;
  • za bilo koji prijenosni medij, sustav će biti idealan

I posljednja stvar: informacije o tome koja je struktura datoteka implementirana na vašim diskovima mogu se pronaći na kartici "Općenito" (desna tipka miša "Svojstva").

Pozdrav!

Bez obzira na medij za pohranu - bio to tvrdi disk, SSD disk ili flash pogon (MicroSD, microSDXC, USB-Flash Drive, itd.), svima im je potreban datotečni sustav kako bi mogli pisati i čitati podatke s njih.

Postoji niz datotečnih sustava, ali u ovom članku ćemo pogledati najpopularnije i, sukladno tome, korištene.

Dostavljene informacije bit će vrlo korisne u situacijama kada trebate formatirati tvrdi disk (SSD pogon) ili jednu od njegovih particija, USB flash pogon itd.

Datotečni sustav FAT16, FAT32 - povijest i značajke

Počnimo s datotečnim sustavom MASTI 16(također se zove jednostavno MAST) - stvorena je prvenstveno za operativni sustav MS DOS, a njegova podrška bila je dostupna u Windows 95 i Windows 98. Maksimalna veličina jedne datoteke bila je ograničena na 2 gigabajta. Maksimalna veličina particije mogla bi biti potpuno ista.

Dominacija FAT16 nije dugo trajala; ubrzo ga je zamijenio datotečni sustav FAT32 - bio je standardan za Windows 95 i Windows 98, iako su iz razloga kompatibilnosti, kao što je gore spomenuto, ovi operativni sustavi podržavali i FAT16.

U FAT32 je maksimalna veličina datoteke već bila 4 gigabajta. Oni. broj datoteka može biti bilo koji, ali veličina bilo koje od njih ne može biti veća od 4 gigabajta. A maksimalna veličina particije mogla bi biti teoretski 8 terabajta, ali u Windowsima je umjetno ograničena. Na primjer, u sustavu Windows 98 veličina particije ne može biti veća od 137 gigabajta.

Možda se pitate zašto nakon toliko godina možete formatirati flash pogone i male tvrde diskove u ovaj datotečni sustav. Odgovor na ovo pitanje je u nastavku.

  • Kompatibilnost: FAT32 je još uvijek široko podržan od strane glavnih operativnih sustava: Windows, MacOS, Linux, raznih samostalnih uređaja (set-top box uređaja, MP3 playera, telefona, pametnih telefona itd.) i ugrađenih sustava.
  • Ograničenja: Ako pokušate napisati datoteku veću od 4 gigabajta, to ne možete učiniti i pojavit će se pogreška. Postoje rješenja za ovaj problem.

    Postoje i ograničenja u pogledu veličine particije – iako FAT32 teoretski podržava medij za pohranu do 8 terabajta, u sustavu Windows XP (i novijim) nećete moći formatirati disk ili particiju veće od 32 GB u FAT32. Ovo ograničenje uveo je Microsoft kako bi zadržao optimalne performanse pri radu s ovim datotečnim sustavom.

  • danas se ovaj datotečni sustav uspješno koristi na flash diskovima i uređajima za pohranu kako bi se osigurala maksimalna kompatibilnost s najširom klasom uređaja.

    Još jedna prednost je odsutnost suvišnog pisanja/čitanja "tehničkih podataka" u procesu interakcije s ovim datotečnim sustavom. Ovo je nedvojbeno blagoslov za Flash diskove, za koje je resurs čitanja/pisanja memorijskih ćelija ograničen.

Datotečni sustav NTFS - opis, aplikacija i ključna svojstva

Sustav datoteka NTFS danas je relevantan i sveprisutan. Po prvi put debitirajući u sustavu Windows XP, nastavlja se koristiti u svim modernim verzijama Microsoftovog OS-a, uključujući najnoviji Windows 10.

Njegovi programeri dali su sve od sebe, dajući ovom datotečnom sustavu mnoge značajke koje su bile diktirane modernom stvarnošću. Primjerice, zahvaljujući bilježenju tehničkih informacija svih izvedenih operacija datoteka, bilo je moguće značajno povećati pouzdanost sigurnosti podataka u slučaju iznenadnog nestanka struje medija.

Također u NTFS je dodana mogućnost postavljanja prava na datoteke i mape, što značajno povećava ukupnu sigurnost pri radu u Windowsima. Ne zaboravite na mogućnost stvaranja zasjenjenih kopija datoteka i podataka tijekom rada sustava, koji aktivno koristi Windows OS, kako bi se osigurale visoke performanse prilikom sigurnosnog kopiranja podataka, enkripcije i samo redovitog rada operativnog sustava .

Naravno, ovo nije potpuni popis onoga što nudi moderni NTFS datotečni sustav.

Kao što je gore spomenuto, ovaj je datotečni sustav standardan za Windows XP i sljedeće Microsoftove operacijske sustave. Tijekom instalacije operativnog sustava nećete moći čak ni odabrati datotečni sustav - tvrdi disk ili SSD bit će formatirani strogo u NTFS.

Zbog značajne kompliciranosti principa NTFS datotečnog sustava i nekih problema s licenciranjem, ima vrlo ograničenu podršku od drugih operacijskih sustava i uređaja.

Na primjer, MacOS operativni sustav može čitati samo podatke s medija na kojima se koristi NTFS, ali više ne može pisati podatke na medije s ovim datotečnim sustavom.

Situacija je bolja na Linuxu. Iako izvorno Linux može čitati podatke samo s NTFS medija, neke konačne Linux distribucije također dodaju podršku za pisanje na NTFS diskove.

Što se tiče samostalnih uređaja, igraćih konzola (Sony PlayStation, Xbox 360) itd., oni u većini slučajeva ne podržavaju NTFS.

  • Kompatibilnost: Potpuno podržan u svim modernim verzijama OS-a od Microsofta. Na Mac računalima (MacOS) podržano je samo čitanje, a na Linuxu su čitanje i pisanje također podržani u nekim konačnim distribucijama. Što se tiče ostalih uređaja, u većini slučajeva uopće nije podržan.
  • Ograničenja: Nema ograničenja u pogledu broja i veličine datoteka i mapa.
  • Optimalno područje primjene: Datotečni sustav je stvoren s ciljem da se koristi za tvrde diskove (i kasnije SSD-ove), uglavnom u Windows okruženju.

Datotečni sustav ExFat - što je to, za što je stvoren

ExFat(također se zove FAT64) Je datotečni sustav koji je debitirao 2006. godine, stvoren za flash pogone. Tijekom njegovog razvoja preuzeto je sve najbolje iz FAT32 i uklonjena su njegova inherentna ograničenja. ExFat nema ograničenja na maksimalnu veličinu datoteke koja se može zapisati na medij s danim datotečnim sustavom.

Također je poboljšana situacija s eliminacijom prekomjernog broja tehničkih operacija čitanja/pisanja kako bi se osigurala maksimalna brzina osnovnih operacija datoteka uz minimalan utjecaj na memorijske ćelije, kako bi se spriječilo i odgodilo njihovo trošenje što je više moguće. .

Ako govorimo o kompatibilnosti, onda je situacija s njim puno bolja u usporedbi s istim NTFS-om. MacOS ima punu podršku za operacije čitanja/pisanja, a dostupna je i podrška za Linux, pod uvjetom da instalirate nekoliko paketa iz spremišta.

Što se tiče vanjskih uređaja, situacija s podrškom za ExFat se popravlja, no definitivno je nemoguće jamčiti podršku na svim uređajima.

  • Kompatibilnost: Ima punu podršku za Windows počevši od Windows XP, MacOS i Linux OS (možda ćete morati instalirati paket podrške iz spremišta).

    Na starijim samostalnim uređajima (MP3 playeri, kamere itd.) možda neće biti podržani.

  • Ograničenja: Ovaj datotečni sustav nema ograničenja ni za maksimalnu veličinu datoteke ni za njihov broj.
  • Optimalno područje primjene: Svi flash pogoni i uređaji za pohranu (MicroSD, microSDXC, USB-Flash disk itd.), čija je veličina veća od 4 gigabajta. Flash pogon s ovim datotečnim sustavom pokazat će performanse velike brzine i radit će dulje nego ako koristi NTFS.

Kratak sažetak

Da sumiramo gore navedeno, ispada da bi se NTFS datotečni sustav trebao koristiti za tvrde (HDD) i SSD diskove koji su instalirani unutar računala, a ExFat za vanjske flash pogone.
A FAT32 je optimalan za male flash pogone (do 4 gigabajta), kao i za flash pogone koji se koriste u starim uređajima i ne razumiju ExFat.

To je sve! Vidimo se u novom sadržaju! Kako ih ne biste propustili - vrijedi se pretplatiti!

FAT – Tablica dodjele datoteka – Ovaj izraz se odnosi na jedan od načina organiziranja datotečnog sustava na disku. Ova tablica pohranjuje informacije o datotekama na vašem tvrdom disku kao niz brojeva koji određuju gdje se nalazi svaki dio svake datoteke. Uz njegovu pomoć, operativni sustav otkriva koje klastere zauzima potrebna datoteka. FAT je najčešći datotečni sustav i podržava ga velika većina operativnih sustava. FAT je izvorno bio 12-bitni i dopuštao je diskete i logičke pogone veličine do 16 MB. U MS-DOS-u 3.0, FAT je 16-bitni za podršku većih pogona, a 32-bitni FAT se koristi za pogone do 2047 GB.

FAT32 je noviji datotečni sustav koji se temelji na FAT formatu i podržava ga Windows 95 OSR2, Windows 98 i Windows Millennium Edition. FAT32 koristi 32-bitne identifikatore klastera, ali rezervira gornja 4 bita, tako da je efektivna veličina identifikatora klastera 28 bita. Budući da je maksimalna veličina klastera FAT32 32 KB, u teoriji FAT32 može podnijeti volumen od 8 TB. Windows 2000 ograničava veličinu novih FAT32 volumena na 32 GB, iako podržava veće postojeće EAT32 volumene (stvorene s drugim operativnim sustavima). Veći broj klastera koje podržava FAT32 omogućuje mu učinkovitije upravljanje diskovima od FAT 16. FAT32 može koristiti 512-bajtne klastere za volumene do 128 MB.

FAT 32 datotečni sustav u sustavu Windows 98 koristi se kao glavni datotečni sustav. Ovaj operativni sustav dolazi s posebnim programom za pretvaranje diska iz FAT 16 u FAT 32. Windows NT i Windows 2000 također mogu koristiti FAT datotečni sustav, te stoga možete pokrenuti svoje računalo s DOS diska i imati potpuni pristup svim datotekama . Međutim, neke od najnaprednijih značajki sustava Windows NT i Windows 2000 osigurava njegov vlastiti NT datotečni sustav, ntfs. ntfs dopušta particije diska do 2TB (poput FAT 32), ali također ima ugrađenu kompresiju datoteka, sigurnost i reviziju za umrežavanje. A u sustavu Windows 2000 implementirana je podrška za datotečni sustav FAT 32. Instalacija operacijskog sustava Windows NT počinje na FAT disku, ali se na kraju instalacije podaci na disku mogu pretvoriti u ntfs format.

To možete učiniti kasnije pomoću uslužnog programa Convert.exe isporučenog s operacijskim sustavom. Particija diska pretvorena u ntfs postaje nedostupna drugim operativnim sustavima. Da biste se vratili na DOS, Windows 3.1 ili Windows 9x, trebate izbrisati ntfs particiju i umjesto toga stvoriti FAT particiju. Windows 2000 može se instalirati na disk s datotečnim sustavom FAT 32 i ntfs.

Mogućnosti EAT32 datotečnih sustava su mnogo šire od onih u FAT16. Najvažnija značajka je da podržava pogone do 2.047 GB i radi s manjim klasterima, čime se značajno smanjuje količina izgubljenog prostora na disku. Na primjer, tvrdi disk od 2 GB u FAT16 koristi klastere od 32 KB, dok FAT32 koristi klastere od 4 KB. Kako bi se održala kompatibilnost s postojećim programima, mrežama i upravljačkim programima uređaja što je više moguće, FAT32 je implementiran s minimalnim promjenama u arhitekturi, API-jima, internim strukturama podataka i formatu diska. No, budući da je veličina elemenata tablice FAT32 sada četiri bajta, mnoge interne strukture podataka i strukture podataka na disku, kao i API-ji, morali su biti revidirani ili prošireni. Određeni API-ji na EAT32 diskovima su zaključani kako bi se spriječilo da naslijeđeni uslužni programi za disk oštete sadržaj FAT32 diskova. Ove promjene neće utjecati na većinu programa. Postojeći alati i upravljački programi također će raditi na FAT32 pogonima. Međutim, MS-DOS upravljački programi blok uređaja (kao što je Aspidisk.sys) i uslužni programi za disk moraju se modificirati da podržavaju FAT32. Svi uslužni programi za disk koje isporučuje Microsoft (Format, Fdisk, Defrag i ScanDisk za stvarne i zaštićene načine) redizajnirani su kako bi u potpunosti podržavali FAT32. Osim toga, Microsoft pomaže vodećim dobavljačima uslužnih programa za diskove i upravljačkih programa uređaja modificirati svoje proizvode tako da podržavaju FAT32. FAT32 je učinkovitiji od FAT16 pri radu s većim diskovima i ne zahtijeva particioniranje na particije od 2 GB. Windows 98 nužno podržava FAT16, budući da je ovaj datotečni sustav kompatibilan s drugim operativnim sustavima, uključujući tvrtke trećih strana. U MS-DOS Real Mode i Windows 98 Safe Mode, FAT32 je znatno sporiji od FAT16. Stoga je pri pokretanju programa u MS DOS načinu rada preporučljivo uključiti naredbu za učitavanje Smartdrv.exe u datoteku Autoexec.bat ili PIF, što će ubrzati rad diska. Neki naslijeđeni programi dizajnirani za specifikaciju FAT16 mogu prijaviti netočne informacije o količini slobodnog ili ukupnog prostora na disku ako je veći od 2 GB. Windows 98 nudi nove API-je za MS-DOS i Win32 koji vam omogućuju da ispravno definirate ove metrike. Stol 1 prikazuje usporedne karakteristike FAT16 i FAT32.

Tablica 1. Usporedba FAT16 i FAT32 datotečnih sustava

Implementira i koristi većina operativnih sustava (MS-DOS, Windows 98, Windows NT, OS / 2, UNIX).

Na ovaj trenutak podržano samo u sustavima Windows 95 OSR2 i Windows 98.

Vrlo učinkovit za logičke diskove manje od 256 MB.

Ne radi s diskovima manjim od 512 MB.

Podržava kompresiju diska, kao što je DriveSpace.

Ne podržava kompresiju diska.

Obrađuje najviše 65.525 klastera, čija veličina ovisi o veličini logičkog diska. Budući da je maksimalna veličina klastera 32 KB, FAT16 može upravljati logičkim pogonima do 2 GB.

Može raditi s logičkim diskovima do 2047 GB s maksimalnom veličinom klastera od 32 KB.

Što je veća veličina logičkog diska, manje je učinkovita pohrana datoteka u sustavu FAT "16, jer se i veličina klastera povećava. diska, datoteka od 10 KB zahtijeva 32 KB, a 22 KB prostora na disku će biti izgubljeno.

Na logičkim pogonima manjim od 8 GB, klasteri su 4 KB.

Maksimalna moguća duljina datoteke u FAT32 je 4 GB minus 2 bajta. Win32 aplikacije mogu otvarati datoteke ove duljine bez posebne obrade. Ostale aplikacije moraju koristiti prekid Int 21h, funkciju 716C (FAT32) s otvorenom zastavicom EXTEND-SIZE (1000h).

U datotečnom sustavu FAT32 za svaki klaster u tablici dodjele datoteka dodijeljeno je 4 bajta, dok je u FAT16 - 2, au FAT12 - 1.5.

Najznačajnija 4 bita 32-bitnog elementa FAT32 tablice su rezervirana i ne sudjeluju u formiranju broja klastera. Programi koji izravno čitaju tablicu PAT32 moraju maskirati ove bitove i zaštititi ih od promjene kada se napišu nove vrijednosti.

Dakle, FAT32 ima sljedeće prednosti u odnosu na prethodne implementacije datotečnog sustava FAT:

    Podržava diskove do 2TB;

    učinkovitije organizira prostor na disku. FAT32 koristi manje klastere (4KB za pogone do 8GB), što može uštedjeti do 10-15% prostora na velikim diskovima u usporedbi s FAT-om;

    korijenski direktorij FAT 32, kao i svi ostali direktoriji, sada je neograničen, sastoji se od lanca klastera i može se nalaziti bilo gdje na disku;

    ima veću pouzdanost: FAT32 može premjestiti korijenski direktorij i raditi s sigurnosnom kopijom FAT-a, osim toga, zapis pokretanja na FAT32 diskovima je proširen da uključuje sigurnosnu kopiju kritičnih struktura podataka, što znači da su FAT32 diskovi manje osjetljivi na pojava zasebnih loših odjeljaka od postojećih FAT volumena;

    programi se učitavaju 50% brže.

Tablica 2. Usporedba veličina klastera

Volumen diska

Veličina klastera u FAT16, KB

Veličina klastera u FAT32, KB

256 MB-511 MB

Nije podržano

512 MB -1023 MB

1024 MB - 2 GB

2 GB - 8 GB

Nije podržano

8 GB-16 GB

Nije podržano

16 GB-32 GB

Nije podržano

Više od 32 GB

Nije podržano

Poboljšani uslužni program za defragmentaciju diska optimizira postavljanje aplikacijskih datoteka učitanih u vrijeme pokretanja aplikacije. Moguće je pretvoriti disk u EAT32 pomoću uslužnog programa Drive Converter (FAT32), ali nakon toga se preporuča pokrenuti uslužni program Disk Defragmenter, inače će računalo raditi s diskom sporije nego prije. Korištenje FAT32 onemogućuje konfiguriranje Windows 98 i Windows NT 4.0 Alternate Boot jer potonji ne podržava FAT32. FAT32 dodjeljuje prostor na disku mnogo ekonomičnije od prethodnih verzija datotečnog sustava FAT. To može osloboditi desetke ili čak stotine megabajta na velikim diskovima, a u kombinaciji s naprednim uslužnim programom za defragmentaciju diska FAT32, značajno smanjuje vrijeme učitavanja aplikacije. Pretvaranje datotečnog sustava tvrdog diska u FAT32 pomoću Drive Convertera (FAT32) jednostavno je. Da biste to učinili, otvorite izbornik Start, podizbornik programa, Pribor, Sistemski alati i odaberite naredbu Drive Converter (FAT32). Pretvorba može utjecati na značajke hibernacije (spremanje stanja računala na disk) koje su dostupne na mnogim računalima. Sustavi u kojima je stanje mirovanja implementirano preko ARM BIOS-a ili ACPI (Advanced Configuration and Power Interface) S4 / BIOS moraju podržavati FAT32 - samo će tada ispravno raditi u sustavu Windows 98.

Većina proizvođača BIOS-a uključuje antivirusnu zaštitu koja prati promjene glavnog zapisa za pokretanje (MBR). Osim toga, naslijeđeni antivirusni programi instalirani kao TSR-ovi ili upravljački programi u stvarnom načinu rada mogu otkriti promjene MBR-a kada se MS-DOS pokrene. Budući da će pretvorba u FAT32 neizbježno modificirati MBR, neki skeneri virusa mogu pogrešno smatrati da je to znak infekcije sustava. Stoga, ako antivirusni uslužni program otkrije promjenu u MBR-u, nudi da ga "izliječi". Najbolje je deinstalirati antivirusni softver i onemogućiti ugrađenu zaštitu od virusa u BIOS-u prije pretvaranja pogona u FAT32. Zatim možete ponovno instalirati antivirusni uslužni program i aktivirati antivirusnu zaštitu ugrađenu u BIOS.

Vrhunski povezani članci