телевизори. Конзоли. Проектори и аксесоари. Технологии. Цифрова телевизия

Дебела структура на файловата система. Какво да направите, ако данните се загубят. Файлова система FAT32

Тази файлова система се използва от операционни системи като Windows NT/2000/XP. При инсталиране на NTFS дискът се разделя на две неравни части: първата е предназначена за MFT (Master File Table - обща файлова таблица), наречена MFT зона и заема около 12% от общия размер на диска, втората част е заети от самите ви данни. Има и трета зона, но повече за това по-късно. Що за звяр е този MFT? Това е основата на NTFS. Той се намира, както беше споменато по-рано, в MFT зоната, т.е. в началото на диска. Всеки запис в MFT съответства на файл и заема около 1 Kb. В основата си това е директория на всички файлове, разположени на диска. Трябва да се отбележи, че всеки елемент от данни в NTFS се счита за файл, дори MFT. Първите 16 файла (метафайла) в MFT зоната са специална каста. Съдържат сервизна информация, имат фиксирана позиция и са недостъпни дори за операционната система. Между другото, първият от тези 16 е самият MFT файл. Съществува копие на първите три записа. Не забравяйте, че говорих за третата зона, така че там се намира и със своята позиция, така да се каже, разделя диска наполовина. Защо беше направено това? Да, за по-сигурно, в случай на загуба на информация в MFT файла, винаги можете да възстановите информацията, а след това е въпрос на технология, както се казва. Всички други файлове в MFT зоната могат да бъдат разположени произволно. Трябва да се отбележи, че теоретично в MFT зоната няма нищо освен сервизни файлове. Но има случаи, когато няма останало място в частта от диска, която е запазена за потребителя: - (и тогава MFT зоната се намалява. Съответно се появява място във втората половина на диска за запис на данни. Когато е достатъчно в тази зона се освобождава свободно място, MFT - зоната се разширява отново.И тук се появява проблемът.Обикновените файлове попадат в зоната на MFT и тя започва да се фрагментира.Това не е фатално, разбира се, но тук няма много приятно или. Но нека се върнем към нашите овце, тоест метафайлове. Всеки от тях отговаря за всяка област на работа. Те започват с името символ $ (тези, които се занимават с програмиране, знаят иконата). Ще дам пример за някои от тях:

  • MFT не е нищо повече от самия MFT
  • MFTmirr - същото копие, което е в средата на диска
  • LogFile е лог файл
  • Зареждане - както подсказва името, Негово Величество е зареждащият сектор
  • Bitmap - карта на свободното пространство на дяла

И така нататък. Информацията за метафайловете се намира в MFT файла. Труден? Има такова нещо. Но целият този боклук е измислен, за да повиши надеждността на NTFS и е оправдан. Да продължим. NTFS на практика няма ограничения за размера на диска (поне с настоящите технологии за производство на твърди дискове). Размерът на клъстера може да варира от 512 b до 64 Kb, въпреки че обичайният му размер е 4 Kb.

Нека сега да поговорим за каталога. Това е метафайл с нотация $. . Той е разделен на части, всяка от които съдържа името на файла, неговите атрибути и връзка към MFT файла. И цялата друга информация вече е там. Директорията е двоично дърво. Нека се опитаме да разберем какви глупости са това. В директорията информацията за данните на диска е разположена по такъв начин, че при търсене на файл директорията се разделя на две части и отговорът е в това коя част съдържа това, което търсите. След това същата операция се повтаря върху избраната половина. И така докато се намери желания файл.

А сега за файловете. Те не съществуват като такива. Нормално, да! Има така наречените потоци, или на нормален руски език - потоци. Тоест, всяка единица информация представлява няколко потока. Едната нишка са самите данни, тя е основната. Други потоци са файлови атрибути. Можете да прикачите всеки друг файл към всеки файл. Просто казано, можете да прикачите напълно нов поток към потоци от същите данни и да запишете нови данни там. Но информацията за размера на файла се взема въз основа на обема на основния поток. Празните или малки файлове на диска се показват само в метафайлове. Това беше направено с цел спестяване на дисково пространство. Като цяло трябва да се отбележи, че понятието файл е много по-дълбоко и широко и е доста трудно да се опишат всички свойства. Моля, обърнете внимание, че максималната дължина на името на файла може да достигне 255 знака.

В допълнение, NTFS файловете имат такъв прекрасен атрибут като компресиран. Всеки файл или дори директория може да бъде компресиран. Самата операция на компресиране става незабелязана, тъй като скоростта й е доста висока. Преди купчината се използва така нареченото виртуално компресиране, т.е. една част от файла може да бъде компресирана, но другата не може. Компресията се извършва на блокове. Всеки блок е равен на 16 клъстера.

NTFS използва криптиране на данни. По този начин, ако разрушите системата и я инсталирате отново, няма да можете да четете криптираните файлове без подходящо разрешение.

Сега относно сечта. Но първо, нека дефинираме понятието транзакция. Транзакцията е действие, което трябва да бъде извършено изцяло (четете правилно), в противен случай няма да бъде извършено изобщо. Така че, въз основа на този боклук, ако има повреда при запис на данни на диска, няма да се правят бележки за новия файл в метафайловете. И мястото, където е започнал записът, ще се счита за чисто. Това е необходимо за предпазване :-) от различни видове хемороиди. Накратко, изпълних действието докрай - направих запис, не успя - и няма нужда да го записвам. Но трябва да се отбележи, че функцията за журналиране запазва функционалността на файловата система, а не вашите данни.

И накрая, NTFS има още две функции: символни връзки - възможност за създаване на виртуални директории и твърди връзки - поддръжка на множество имена за един и същ файл.Това може би е всичко.

В този момент тази файлова система е най-често срещаната, въпреки че постепенно губи позицията си след пускането на Windows XP. Всички операционни системи от семейството Windows, започвайки от Windows 95 OSR2, поддържат FAT 32. И така, FAT 32 (Таблица за разпределение на файлове) е електронна таблица за разпределение на файлове. Намира се почти в самото начало на диска. FAT структура на диска:

    1. сектори за зареждане на основния и допълнителните дялове;
    2. boot сектор на логическия диск;
    3. основна директория;
    4. област за данни;
    5. цилиндър за извършване на диагностични операции четене/запис;

Основното предимство на FAT 32 пред FAT 16 е, че вместо 16-битови записи се използват 32-битови записи. Това от своя страна увеличава броя на клъстерите в дяла до 268 435 456 (в FAT - 65 536). При използване на FAT 32 размерът на тома е 2 Tb, а размерът на един файл може да достигне 4 Gb. Забележима разлика между FAT 32 и предишните таблици е, че основната директория не заема фиксирано дисково пространство и може да бъде с произволен размер.

Размерът на клъстера при използване на FAT 32 в дял от 2 Gb с 5000 файла е 4 Kb (в FAT 16 - 32 Kb), таблицата ще използва до 524 288 записа. В този случай самата маса ще тежи около 2 MB.

Сравнение на NTFS и FAT 32.

Е, нека се заемем с неблагодарната задача да сравняваме две файлови системи.

Предимства:

    1. Бърза скорост на достъп до малки файлове;
    2. Размерът на дисковото пространство днес е практически неограничен;
    3. Фрагментирането на файлове не засяга самата файлова система;
    4. Висока надеждност на съхранението на данните и самата файлова структура;
    5. Висока производителност при работа с големи файлове;

недостатъци:

    1. По-високи изисквания за капацитет на RAM в сравнение с FAT 32;
    2. Работата със средно големи каталози е затруднена поради тяхната фрагментарност;
    3. По-бавна скорост на работа в сравнение с FAT 32

Предимства:

    1. Висока скорост;
    2. Ниско изискване за RAM;
    3. Ефективна работа със средни и малки файлове;
    4. По-ниско износване на диска поради по-малко движения на главата за четене/запис.

недостатъци:

    1. Ниска защита срещу системни повреди;
    2. Неефективна работа с големи файлове;
    3. Ограничение на максималния обем на дял и файл;
    4. Намалена производителност поради фрагментация;
    5. Намалена производителност при работа с директории, съдържащи голям брой файлове;

И така, някои мисли. И двете файлови системи съхраняват данни в клъстери, чийто минимален размер е 512 b. Като правило обичайният размер на клъстера е 4 Kb. Тук вероятно свършват приликите. Нещо за фрагментацията: производителността на NTFS намалява рязко, когато дискът е пълен на 80 - 90%. Това се дължи на фрагментацията на служебните и работните файлове. Колкото повече работите с такъв натоварен диск, толкова по-силна е фрагментацията и по-ниска е производителността. В FAT 32 фрагментирането на работната област на диска се случва на по-ранни етапи. Въпросът тук зависи от това колко често записвате/изтривате данни. Както при NTFS, фрагментацията значително намалява производителността. Сега за RAM. Обемът на самата електронна таблица FAT 32 може да заема около няколко мегабайта RAM. Но кеширането идва на помощ. Какво се записва в кеша:

    1. Най-използваните директории;
    2. Данни за всички файлове, които се използват в момента;
    3. Данни за свободно дисково пространство;

Какво ще кажете за NTFS? Големите директории трудно се кешират и могат да достигнат размер от няколко десетки мегабайта. Плюс MFT, плюс информация за свободното дисково пространство. Въпреки че трябва да се отбележи, че NTFS все още използва ресурсите на RAM доста икономично. Имаме успешна система за съхранение на данни; в MFT всеки запис е приблизително 1 Kb. Но все пак изискванията за количеството RAM са по-високи, отколкото за FAT 32. Накратко, ако паметта ви е по-малка или равна на 64 Mb, тогава FAT 32 ще бъде по-ефективен по отношение на скоростта.Ако е повече, разликата в скоростта ще бъде малка, а често и никаква. Сега за самия твърд диск. За да използвате NTFS, се изисква Bus Mastering. Какво е това? Това е специален режим на работа на водача и контролера. При използване на BM обменът става без участието на процесора. Липсата на виртуална машина ще повлияе на производителността на системата. Освен това, поради използването на по-сложна файлова система, броят на движенията на главите за четене/запис се увеличава, което също се отразява на скоростта. Наличието на дисков кеш има еднакво положителен ефект както върху NTFS, така и върху FAT 32.

Много потребители се сблъскват с липса на разбиране на основите на файловите системи на Windows. Изглежда, защо ненужна теория? Всъщност това е познаването на дълбокото функциониране на различни файлови системи, което ви позволява правилно да изберете една или друга файлова система за определен носител за съхранение. Понякога грешка в избора може да стане критична по-късно при решаване на проблема с възстановяването на информация или преждевременното износване на носителя.

Файловата система се състои от система за управление на файлове и колекция от файлове на определен тип носител (CD, DVD, FDD, HDD, Flash и др.). Системата за управление на файлове позволява на потребителите и приложенията да имат достъп до файлове, да ги записват и да поддържат целостта на тяхното съдържание. Най-разпространеният носител за дългосрочно съхранение в съвременните изчислителни системи е твърдият диск – “Winchester”. Този термин се отнася за всеки запечатан диск с аеродинамично проектирани магнитни четящи глави.

Файловите системи на съвременните операционни системи са инсталирани на дяловете на твърдия диск.

FAT 32. Простота и надеждност.

Има три FAT файлови системи: FAT12 (за FDD дискети), FAT16, FAT32. Те се различават по броя на битовете (12, 16, 32), за да укажат номера на клъстера в системата за управление на файлове. Във файловите системи FAT логическото дисково пространство на всяко логическо устройство е разделено на системна област и област с данни. BR – Boot Record; RS – запазени сектори; FAT1, FAT2 – таблици за разпределение на файлове 1 и 2; RDir (Главна директория, ROOT) – основна директория. Областта с данни е разделена на клъстери, които представляват 1 или повече съседни сектора. В FAT таблица клъстерите, принадлежащи към един и същ файл, са свързани във верига. Картата на областта с данни всъщност е таблицата за разпределение на файлове (FAT).Всеки елемент от таблицата FAT (12, 16 или 32 бита) съответства на един дисков клъстер и характеризира неговото състояние: свободен, зает или лош клъстер.. За да се посочи номерът на клъстера в системата за управление на файлове FAT16, се използва 16-битова дума и могат да бъдат адресирани 65536 клъстера.

Клъстерът е минимално адресируема единица дискова памет, разпределена за файл. Файл или директория заема цял брой клъстери. Разделянето на областта с данни на клъстери вместо използване на сектори ви позволява да: намалите размера на FAT таблицата, да намалите фрагментацията на файла, да намалите дължината на файловите вериги, да ускорите достъпа до файлове. Последният клъстер може да не се използва напълно, което ще доведе до забележима загуба на дисково пространство, ако размерът на клъстера е голям. На дискета клъстерът заема 1 или 2 сектора. Твърдият диск има 4, 8, 16, 32, 64 сектора в един клъстер. Всеки елемент има следната структура: име на файл, атрибут на файла, резервно поле, час на създаване, дата на създаване, дата на последен достъп, резерв, дата на последна модификация, време на последна модификация, начален номер на фат клъстер, размер на файла.

В този пример файл с име MyFile.txt се поставя, започвайки от 8-ия клъстер и заема 12 клъстера. Веригата от клъстери за този случай: 8,9,A,B,15,16,17,19,1A,1B,1C,1D. Клъстер номер 18 е маркиран с код F7 като лош. Не може да се използва за хостване на данни. Този код се задава от помощните програми за форматиране на диска и проверка. Клъстер 1D е маркиран с FF кода като последен, принадлежащ на този файл. Свободните клъстери са маркирани с код 0. Когато се разпредели нов клъстер, първият свободен клъстер се взема за запис във файл. Тъй като файловете на диска се променят, изтриват, преместват, увеличават и свиват, това правило за разположение води до фрагментация, т.е. данните от един файл не се намират в съседни клъстери, а понякога са много отдалечени един от друг. Образува се сложна верига. Това води до по-бавна работа с файлове. Тъй като Fat се използва много интензивно по време на достъп до диска, той се зарежда в RAM. Системата Fat32 е много по-ефективна при използване на дисково пространство, тъй като използва по-малки клъстери в сравнение с предишните версии на Fat. В сравнение с Fat16, това дава спестявания от 10-16%.

Полето за атрибут на елемент от директория може да съхранява следните стойности:

1) архив (инсталира се при промяна на файл и премахване от програма, която архивира файлове на друг носител);

2) указател;

3) етикет на обема;

4) системни;

5) скрит;

6) само за четене.

Дългите имена във FAT32 се предоставят чрез използване на множество записи в директория: за един файл (един запис е един запис за името 8.3 и 24 записа за най-дългото име, което може да бъде до 256 знака. Следователно не се препоръчва да използвайте дълги имена.

Основният недостатък на FAT е бавната обработка на файлове. Когато създавате файл, правилото е, че се заделя първият свободен клъстер. Това води до фрагментация на диска и сложни файлови вериги. Това води до по-бавна работа с файлове.

По принцип файловата система FAT е нещо, което трябва да се избягва днес. Ето защо е жизненоважно да изберете подходяща, която ще ви позволи да избегнете тази файлова система.

NTFS: удобство и висока скорост.

Една от основните концепции, използвани при работа с NTFS, е концепцията за обем. Възможно е да се създаде том, устойчив на грешки, който заема няколко дяла, тоест да се използва RAID технология. NTFS разделя цялото използваемо дисково пространство на том на клъстери - блокове от данни, които се адресират като единици данни. NTFS поддържа размери на клъстери от 512 байта до 64 KB; 2 или 4 KB диск се разпределят за MFT зоната - пространство, което може да бъде заето от основния обслужващ метафайл MFT, увеличаващ се по размер. Не е възможно да се записват данни в тази област. MFT зоната е празна, така че служебният файл (MFT) да не се фрагментира, докато расте.

MFT (обща файлова таблица) е централизирана директория на всички други файлове на диска, включително самия него. MFT е разделен на записи с фиксиран размер от 1 KB, като всеки запис съответства на файл. Първите 16 файла са със сервизен характер и са недостъпни за операционната система - наричат ​​се метафайлове, като първият метафайл е самият MFT. Тези първи 16 MFT елемента са единствената част от диска, която има строго фиксирана позиция. Копие от същите тези 16 записа се съхранява в средата на тома за безопасност, тъй като те са много важни. Останалите части на MFT файла могат да бъдат разположени на произволни места на диска - можете да възстановите позицията му, като използвате самия файл, „хващайки“ на самата основа - на първия MFT елемент. Всеки файл в NTFS е представен с помощта на потоци; той няма данни, а по-скоро "потоци". Един от потоците са файлови данни. Можете да дефинирате множество потоци от данни за един файл.

Основни характеристики на NTFS:

Работата на големи дискове се извършва ефективно (много по-ефективно, отколкото във FAT);

Има инструменти за ограничаване на достъпа до файлове и директории;

NTFS дяловете осигуряват локална сигурност за файлове и директории;

Въведен е механизъм за транзакции, при който се регистрират файлови операции;

Значително повишаване на надеждността;

Премахнати са много ограничения за максималния брой дискови сектори и/или клъстери;

Името на файл в NTFS, за разлика от файловите системи FAT и HPFS, може да съдържа всякакви знаци, включително пълния набор от национални азбуки, тъй като данните са представени в Unicode - 16-битово представяне, което дава 65 535 различни знака. Максималната дължина на име на файл в NTFS е 255 знака.

NTFS също има вградени възможности за компресиране, които можете да приложите към отделни файлове, цели директории и дори томове (и след това да ги отмените или преназначите, както сметнете за добре). Директорията в NTFS е специален файл, който съхранява връзки към други файлове и директории.

NTFS осигурява сигурност на ниво файл; това означава, че правата за достъп до томове, директории и файлове може да зависят от потребителския акаунт и групите, към които потребителят принадлежи. Всеки път, когато потребител осъществи достъп до обект на файлова система, неговите права за достъп се проверяват спрямо списъка с разрешения на този обект. Ако потребителят има достатъчно права, искането му се удовлетворява; в противен случай заявката се отхвърля. Този модел на сигурност се прилага както за локална потребителска регистрация на NT компютри, така и за отдалечени мрежови заявки.

Системата NTFS също има определени възможности за самовъзстановяване. NTFS поддържа различни механизми за проверка на целостта на системата, включително регистриране на транзакции, което позволява операциите за запис на файлове да бъдат възпроизвеждани срещу специален системен журнал.

Основният недостатък на файловата система NTFS е, че служебните данни заемат много място (например всеки елемент на директория заема 2 KB) - за малки дялове служебните данни могат да заемат до 25% от обема на носителя.

По този начин, когато избираме тип файлова система, ние не избираме някакво абстрактно действие, ние вземаме набор от решения, които засягат цялата система като цяло. Защо да знаете всички тънкости на файловата система толкова подробно? Това е необходимо за евентуалното му възстановяване, което ще обсъдим в някоя от следващите статии =)

Във FAT имената на файловете са във формат 8.3 и се състоят само от ASCII знаци. VFAT добави поддръжка за дълги (до 255 знака) имена на файлове. Дълго име на файл, LFN) в UTF-16LE кодиране, с LFN, съхранявани едновременно с 8.3 имена, ретроспективно наречени SFN. Кратко име на файл). LFN са нечувствителни към главни букви при търсене, но за разлика от SFN, които се съхраняват с главни букви, LFN запазват главните букви, посочени при създаването на файла.

Структура на FAT системата

Във файловата система FAT съседните дискови сектори се комбинират в единици, наречени клъстери. Броят на секторите в един клъстер е равен на степен две (вижте по-долу). Цял брой клъстери (поне един) са разпределени за съхраняване на файлови данни, така че, например, ако размерът на файла е 40 байта и размерът на клъстера е 4 KB, само 1% от пространството, разпределено за него, действително ще бъде заето. по информация за файла. За да избегнете подобни ситуации, препоръчително е да намалите размера на клъстерите и да намалите количеството адресна информация и да увеличите скоростта на файловите операции, обратно. На практика се избира някакъв компромис. Тъй като капацитетът на диска може да не се изрази в цял брой клъстери, обикновено в края на тома има т.нар. излишни сектори - "остатък" с по-малък размер на клъстера, който не може да бъде разпределен от ОС за съхраняване на информация.

Пространството на тома FAT32 е логично разделено на три съседни области:

  • Запазена зона. Съдържа сервизни структури, които принадлежат към записа за зареждане на дяла (Partition Boot Record - PBR, за да се разграничи от главния запис за зареждане - основният запис за зареждане на диска; PBR често се нарича неправилно сектор за зареждане) и се използват при инициализиране на сила на звука;
  • Област на FAT таблица, съдържаща масив от индексни указатели („клетки“), съответстващи на клъстерите на областта с данни. Обикновено има две копия на FAT таблицата на диска за целите на надеждността;
  • Областта с данни, където се записва действителното съдържание на файловете - тоест текстът на текстовите файлове, кодираното изображение за картинните файлове, цифровизираният звук за аудио файловете и т.н. - както и т.нар. метаданни - информация относно имената на файлове и папки, техните атрибути, времена за създаване и модификация, размери и разположение на диска.

FAT12 и FAT16 също специално разпределят областта на основната директория. Има фиксирана позиция (непосредствено след последния елемент на FAT таблицата) и фиксиран размер в сектори.

Ако даден клъстер принадлежи към файл, тогава съответната клетка съдържа номера на следващия клъстер от същия файл. Ако клетката съответства на последния клъстер на файла, тогава тя съдържа специална стойност (FFFF 16 за FAT16). По този начин се изгражда верига от файлови клъстери. Неизползваните клъстери в таблицата съответстват на нули. „Лошите“ клъстери (които са изключени от обработка, например поради нечетливостта на съответната област на устройството) също съответстват на специален код.

Когато файл бъде изтрит, първият знак от името се заменя със специален код E5 16 и веригата от файлови клъстери в таблицата за разпределение се нулира. Тъй като информацията за размера на файла (която се намира в директорията до името на файла) остава непокътната, ако файловите клъстери са били разположени последователно на диска и не са били презаписани с нова информация, е възможно да се възстанови изтритият файл.

Вписване за зареждане

Първата FAT обемна структура се нарича BPB. Блок с параметри на BIOS ) и се намира в запазена зона, в нулев сектор. Тази структура съдържа информация, идентифицираща типа файлова система и физическите характеристики на носителя за съхранение (дискета или дял на твърд диск).

Блок с параметри на BIOS

BPB по същество отсъстваше от FAT, който обслужваше MS-DOS 1.x, тъй като по това време имаше само два различни вида томове - едностранни и двустранни пет-инчови 360 KB флопи дискове, като форматът на тома се определяше от първият байт от FAT областта. BPB беше въведен в MS-DOS 2.x в началото на 1983 г. като задължителна структура на сектор за зареждане, която отсега нататък щеше да определя формата на тома; Старата схема за определяне по първия байт на FAT е загубила поддръжка. Също така в MS-DOS 2.0 беше въведена йерархия от файлове и папки (преди това всички файлове се съхраняваха в главната директория).

Структурата BPB в MS-DOS 2.x съдържа 16-битово поле „общ брой сектори“, което означава, че тази версия на FAT е фундаментално неприложима за томове, по-големи от 2 16 = 65 536 сектора, тоест повече от 32 MB със стандартен размер на сектора от 512 байта. В MS-DOS 4.0 (1988) горното поле BPB беше разширено до 32 бита, което означаваше, че теоретичният размер на обема се увеличи до 232 = 4 294 967 296 сектора или 2 TB с 512-байтов сектор.

Следващата модификация на BPB се появи с Windows 95 OSR2, която въведе FAT32 (през август 1996 г.). Ограничението от два гигабайта за размера на тома е премахнато; том FAT32 теоретично може да бъде с размер до 8 TB. Въпреки това, размерът на всеки отделен файл не може да надвишава 4 GB. BIOS Parameter Block FAT32, за съвместимост с по-ранни версии на FAT, повтаря BPB FAT16 до и включително полето BPB_TotSec32, последвано от разликите.

"Секторът за зареждане" на FAT32 всъщност представлява три сектора от 512 байта - сектори 0, 1 и 2. Всеки от тях съдържа подписа 0xAA55 на адрес 0x1FE, тоест в последните два байта, ако размерът на сектора е 512 байта. Ако размерът на сектора е повече от 512 байта, тогава подписът се съдържа както на адрес 0x1FE, така и в последните два байта на нулевия сектор, т.е. той се дублира.

FSInfo

Записът за зареждане на FAT32 дял съдържа структура, наречена FSInfo, използван за съхраняване на броя на свободните клъстери на тома. FSInfo, като правило, заема сектор 1 (вижте полето BPB_FSInfo) и има следната структура (адреси спрямо началото на сектора):

  • FSI_LeadSig. 4-байтовият подпис 0x41615252 показва, че секторът се използва за структурата FSInfo.
  • FSI_Reserved1. Интервалът от 4-ти до 483-ти байт на сектора включително се нулира.
  • FSI_StrucSig. Друг подпис се намира на адрес 0x1E4 и съдържа стойността 0x61417272.
  • FSI_Free_Count. Четирибайтовото поле на адрес 0x1E8 съдържа последната стойност на броя на свободните клъстери на тома, известен на системата. Стойност 0xFFFFFFFF означава, че броят на свободните клъстери е неизвестен и трябва да се изчисли.
  • FSI_Nxt_Free. Четирибайтовото поле на адрес 0x1EC съдържа номера на клъстера, от който трябва да започне търсенето на свободни клъстери в таблицата с индексни указатели. Обикновено това поле съдържа номера на последния FAT клъстер, определен за съхраняване на файла. Стойността 0xFFFFFFFF означава, че търсенето на свободен клъстер трябва да се извърши от самото начало на таблицата FAT, тоест от втория клъстер.
  • FSI_Reserved2. Запазено 12-байтово поле на адрес 0x1F0.
  • FSI_TrailSig. Сигнатура 0xAA550000 - последните 4 байта от сектора FSInfo.

Смисълът на въвеждането на FSInfo е да се оптимизира работата на системата, тъй като във FAT32 таблицата с индексни указатели може да бъде значителна и сканирането й байт по байт може да отнеме значително време. Стойностите на полетата FSI_Free_Count и FSI_Nxt_Free обаче може да не са правилни и трябва да бъдат проверени за адекватност. Освен това те дори не се актуализират в резервното копие на FSInfo, което обикновено се намира в сектор 7.

Определяне на типа FAT обем

Определянето на типа FAT на том (т.е. изборът между FAT12, FAT16 и FAT32) се прави от операционната система въз основа на броя на клъстерите в тома, който от своя страна се определя от полетата BPB. Първо се изчислява броят на секторите на основната директория:

RootDirSectors = (BPB_RootEntCnt * 32) / BPB_BytsPerSec

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

Накрая се определя броят на клъстерите в областта на данните:

CountofClusters = DataSec / BPB_SecPerClus

Въз основа на броя на клъстерите има ясно съответствие с файловата система:

  • Брой на клъстерите< 4085 - FAT12
  • Брой клъстери = 4085 ÷ 65524 - FAT16
  • Брой клъстери > 65524 - FAT32

Според официалната спецификация това е единственият валиден начин за определяне на типа FAT. Изкуственото създаване на том, който нарушава посочените правила за съответствие, ще доведе до неправилна обработка на Windows. Въпреки това се препоръчва да се избягват стойности на CountofClusters, близки до критични (4085 и 65525), за да се определи правилно типа файлова система от всякакви, често неправилно написани драйвери.

С течение на времето FAT започва да се използва масово в различни устройства за съвместимост между DOS, Windows, OS/2, Linux. Microsoft не е показал намерение да ги принуди да лицензират [ посочете] .

През февруари 2009 г. Microsoft съди TomTom, производител на базирани на Linux навигационни системи за автомобили, за нарушение на патент.

Бележки

  1. http://cd.textfiles.com/megademo2/INFO/OS2_HPFS.TXT
  2. www.microsoft.com/mscorp/ip/tech/fathist.asp на archive.org
  3. Спецификация на файловата система FAT32 на Microsoft Extensible Firmware Initiative 1.03. Microsoft (6 декември 2000 г.). - Документ във формат Microsoft Word, 268 Kb. Архивирано
  4. Какво ще кажете за VFAT? . Архив на TechNet. Microsoft (15 октомври 1999 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 5 април 2010 г.
  5. Разширението на файловата система VFAT не трябва да се бърка с драйвера на файловата система със същото име, който се появи в Windows за работни групи 3.11 и е проектиран да обработва извиквания на функции на MS-DOS (INT 21h) в защитен режим (вижте: KB126746: Хронология на версиите на Windows за работни групи. ВЕРСИЯ 3.11 → Немрежови функции. Microsoft (14 ноември 2003 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 5 април 2010 г.)
  6. Федералният патентен съд обявява FAT патента на Microsoft за нищожен (на английски език). heise онлайн. Heise Zeitschriften Verlag (2 март 2007 г.). Архивирано
  7. Браян Кахин. Microsoft разтърсва света с FAT патенти. Huffington Post (10 март 2009 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 10 март 2009 г.
  8. Райън Пол.Делото на Microsoft за FAT патенти може да отвори кутията на Пандора на OSS (на английски). Ars Technica. Condé Nast Publications (25 февруари 2009 г.). Архивирано
  9. Глин Муди.(Английски) . ComputerworldUK. IDG (5 март 2009 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 9 март 2009 г.
  10. Стивън Дж. Вон-Никълс. Linux компаниите подписват пактове за патентна защита на Microsoft (на английски). Блогове на Computerworld. IDG (5 март 2009 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 9 март 2009 г.
  11. Ерика Ог. TomTom завежда контраиск срещу Microsoft в патентен спор. CNet (19 март 2009 г.). Архивиран от оригинала на 22 август 2011 г. Посетен на 20 март 2009 г.

Връзки

  • ECMA-107 (английски) FAT стандарт

Всеки, който някога е инсталирал операционна система, се е сблъсквал с факта, че на етапа на форматиране на инсталационния дял на твърдия диск програмата ви подканва да изберете типа файлова система FAT или NTFS.

А тези, на които се случи да форматират флаш устройство или друго външно устройство за съхранение, трябваше да решат между три файлови системи: FAT32, NTFS и exFAT. Най-често потребителите избират форматирането по подразбиране, защото не знаят каква е разликата.

Тази статия е адресирана до тези, които искат да запълнят тази празнина в знанията си.

FAT файлова структура: принципи и цел

Файлова структура или Файлова системае разработен през 70-те години на миналия век от Microsoft и представлява определена процедура за организиране на пространство за съхранение и достъп до данни на компютри и други цифрови устройства.

Целта на функционалността е да предостави на потребителя удобно управление на информацията, съхранявана на диск или външна джаджа. Файловата система включва файлове, папки и директории, както и набор от системни инструменти, които взаимодействат с тях, за да изпълняват функциите четене-запис, създаване-изтриване, копиране, име и др. В допълнение, тази структура организира споделен достъп до информация между потребителите и осигурява защита срещу неразрешени действия чрез криптиране, работа в режим само за четене и др.

Структурно цялата площ на дисковото пространство е разделена на клъстери, като лист карирана хартия. Всяка клетка е блок, чийто размер се задава по време на форматирането и трябва да бъде кратен на 2. Минималният размер може да бъде 512 байта (за флаш устройство), за твърд диск е 32 KB. Един файл може да заема няколко такива клъстера. Можете образно да си представите дисковото пространство като бележник, където клъстерът е буква, файлът е дума, а файловата структура е съдържанието на бележника.

При достъп до файл операционната система трябва да го намери в няколко клъстера, разположени на различни места на диска, като по този начин се образува верига от клъстери. Всеки клъстер има свой собствен етикет, който го идентифицира като един от трите типа:

  1. Безплатен, готов за запис на данни.
  2. Busy, който съхранява част от информацията и има в етикета данни за следващия клъстер във веригата, като последният е маркиран със специален етикет.
  3. BAD блок е клъстер с грешки, който вече не е достъпен след форматиране.

Размерът на етикета се определя от вида на файловата структура: за FAT32 той е 32 байта.

Цялата файлова система се състои от следните части:

  • секторът за зареждане, който се намира в началото на диска, се активира след зареждане на ОС и съхранява параметрите на дяла;
  • таблица за разпределение на файлове („съдържание“), която съхранява етикети на клъстери;
  • копия на таблицата за разпределение на файлове за възстановяване на данни, ако файловата структура е повредена;
  • главна директория;
  • области с данни;
  • цилиндър за извършване на операции за четене/запис.

Има три вида FAT файлови системи: FAT12, FAT16 и FAT32. FAT е заменен от NTFS, а exFAT е разширена версия на FAT32 и се използва главно за флашки.

Предимства и недостатъци на файловите структури FAT32, NTFS и exFAT

За да вземем решение за избора на най-оптималната файлова система за форматиране, ще разгледаме описанията на трите опции, като се фокусираме върху предимствата и недостатъците на всяка от тях.

FAT32

Сред трите разглеждани файлови структури FAT32 е най-старата. Той замени FAT16 и доскоро беше най-прогресивният. Пускането на FAT32 беше насрочено да съвпадне с пускането на операционната система Windows 95 OSR2 през 1996 г. Основните отличителни характеристики: 32-битово адресиране на клъстери и ограничения на размера: файл от не повече от 4 GB и обем от 128 GB.

Предимства

Въпреки известна морална изостаналост, FAT32 има редица предимства пред другите файлови системи. Основната му привлекателност е съвместимостта и гъвкавостта. FAT32 работи с всички версии на операционни системи, включително Windows (сравнение на всички версии), Linux и MacOS и е подходящ за всякакви игрови конзоли и други джаджи с USB порт. Днес той се използва във всички външни устройства (флаш устройства, CD карти) по подразбиране, тъй като много стари устройства: компютри, лаптопи, декодери с USB вход могат да работят само с FAT32.

Други важни предимства на файловата система са: висока скорост на работа, ниски изисквания към обема на RAM, продуктивна работа със средни и малки файлове и ниско износване на диска поради по-малки движения на главата. Въпреки това, той също е обект на фрагментация и периодичното дефрагментиране определено няма да навреди.

недостатъци

Основният недостатък на тази файлова система е нейният размер ограничения. За клъстери не може да бъде повече от 64 KB, в противен случай някои приложения може да изчислят неправилно дисковото пространство.

Размерът на файла не трябва да надвишава 4 GB, така че максималният размер на диска за размер на клъстер за таблица за разпределение на файлове от 32 KB ще бъде около 8 TB.

При форматиране на диск с помощта на ScanDisk, която е 16-битова програма, като се вземат предвид самите FAT таблици и с максимален размер на клъстера от 32 KB, размерът на тома е ограничен до 128 гигабайта.

Като се има предвид, че не много компютърни устройства са оборудвани с твърд диск, по-голям от 8 TB, този недостатък няма да бъде забележим за повечето потребители. Въпреки това фактът, че FAT32 работи с файлове с размер до 4 GB, е значителен недостатък, тъй като повечето висококачествени видео файлове в съвременния 4K формат днес са по-големи от тези 4 GB и следователно не са съвместими с тази файлова система.

Освен ограниченията на размера, FAT32 има и други недостатъци. Той не поддържа дълги имена на файлове, което не е много удобно за потребители, които искат да идентифицират файловете логически въз основа на тяхното съдържание. Има оплаквания относно системата за сигурност (допълнителен антивирусен скенер не би навредил) и защитата на файловете в случай на повреди (характеристики на твърдите дискове), както и ниската скорост при работа с директории, съдържащи много файлове.

По този начин FAT32 е по-подходящ за преносими устройства с малък капацитет и по-стари компютри. Последните версии на Windows вече не могат да се инсталират на диск, форматиран със системата FAT32; необходимо е преформатиране в NTFS.

Основната употреба на файловата система FAT32 днес е в преносими флаш устройства и SD карти (функции), които съдържат малко файлове и са съвместими с различни цифрови устройства.

NTFS

Тази файлова система е разработена от Microsoft през 1993 г. и въведена с Windows NT 3.1. В самото заглавие нова технологична файлова система, което означава нова технологична файлова система, се крие неговата прогресивна същност.

След форматиране на диск в NTFS, той се разделя на три зони:

  • MFT - зона или обща файлова таблица (Master File Table), където се съхранява информация за файлове и директории;
  • потребителски данни;
  • метафайлове, съдържащи служебна информация.

Всеки от метафайловете отговаря за определена област. Например LogFile е регистрационен файл, в който всички операции се записват в журнала, Boot е секторът за зареждане, Bitmap контролира свободното пространство в дяла и т.н. Тази структура надеждно защитава файловете от всякакви повреди, било то замръзване на операционната система или прекъсване на захранването.

Предимства

За разлика от FAT32, тази файлова структура практически няма ограничения за размера на файловете и директориите. Размерът на клъстера може да варира от 512 байта до 64 KB, като оптималният размер е 4 KB.

Благодарение на много значителни подобрения за подобряване на сигурността, като поддръжка на права за достъп до файлове, HPFS квоти, криптиране, журналиране, контрол на достъпа и одит, твърди връзки и т.н., NTFS е идеален за форматиране на диск за системната област. Други дялове на твърдия диск също могат да бъдат форматирани в тази система, тъй като NTFS позволява оптимално използване на дисковото пространство, когато има много малки файлове.

Предимството на тази файлова организация е бързата скорост на достъп до малки файлове, висока производителност при работа с големи файлове и възможността за използване на дълги имена на файлове.

недостатъци

Основният недостатък на системата NTFS е нейната несъвместимост с всички операционни системи под Windows NT, както и ограниченията в съвместимостта с други операционни системи. И така, Mac OS чете файлове от NTFS дискове, но не може да ги записва, същата ситуация със съвместимостта на Linux файлове. Най-популярните игрови конзоли Playstation и Xbox 360 не работят с NTFS, само Xbox One може да взаимодейства с него.

Недостатъците на NTFS също включват високи изисквания към RAM, по-ниска скорост в сравнение с FAT32 и трудности при управление на директории със среден размер.

Поради това е по-препоръчително да използвате файловата структура NTFS на твърди дискове, включително SSD, работещи с най-новите версии на Windows, като се започне с NT.

exFAT

Тази файлова система е последната, прегледана по отношение на времето за издаване. Появи се през 2008 г. с редовни актуализации на Windows XP и всъщност е разширена версия на FAT32.

Основната цел на разработчиците е да създадат продуктивна, удобна и универсална файлова структура за преносими устройства за съхранение: флаш памети, SD карти и сменяеми твърди дискове.

Предимства:

  • Проста организация без специализирани функции и ограничения за размерите на файловете и дяловете.
  • Отлична съвместимост с всички Windows операционни системи, както и с Mac OS и Linux. При последния вариант се изисква инсталиране на допълнителен софтуер.
  • Поддръжка от всички съвременни устройства на Apple, както и игрови конзоли Xbox One и Playstation 4.

Основният недостатък на файловата организация exFAT е лицензионната политика на Microsoft, която забранява свободното й използване в публичното пространство.

Най-оптималната файлова структура

След като разгледахме описанията на три популярни файлови системи, можем да направим следните заключения:

  • за компютърни устройства с операционна система, по-висока от Windows NT, би било по-подходящо твърдият диск да се форматира в системата NTFS;
  • за по-стари устройства, както и за целите на съвместимостта с различни съвременни цифрови джаджи, най-добрият вариант би бил да изберете FAT32;
  • за всеки сменяем носител би било идеално да използвате системата

И накрая: информация за това каква файлова структура е внедрена на вашите дискове можете да намерите в раздела „Общи“ (десен бутон на мишката „Свойства“).

ВЛАДИМИР МЕШКОВ

Архитектура на файловата система FAT

Обща характеристика на файловата система FAT. Структура на дялове с файлова система FAT

Файловата система FAT (File Allocation Table) е разработена от Бил Гейтс и Марк Макдоналд през 1977 г. и първоначално е била използвана в операционната система 86-DOS. За да се постигне преносимост на програмите от операционната система CP/M към 86-DOS, приетите по-рано ограничения върху имената на файлове бяха запазени. 86-DOS впоследствие е придобит от Microsoft и става основа за MS-DOS 1.0, издаден през август 1981 г. FAT е проектиран да работи с флопи дискове, по-малки от 1 MB, и първоначално не е осигурявал поддръжка за твърди дискове.

Структурата на FAT дяла е показана на фигурата.

Във файловата система FAT дисковото пространство на логическия дял е разделено на две области - системна област и област с данни (виж фиг. 1). Системната област се създава и инициализира по време на форматиране и впоследствие се актуализира, когато се манипулира файловата структура. Системната област на FAT файловите системи се състои от следните компоненти:

  • запис за зареждане (BR);
  • резервна зона;
  • таблици за разпределение на файлове;
  • област на основната директория (не съществува във FAT32).

Областта с данни на логическия диск съдържа файлове и директории, подчинени на основната, и е разделена на секции с еднакъв размер - клъстери. Клъстерът може да се състои от един или няколко сектора, разположени последователно на диска. Броят на секторите в клъстера трябва да бъде кратен на 2N и може да приема стойности от 1 до 64. Размерът на клъстера зависи от типа на използваната файлова система и размера на логическия диск.

Предназначение, структура и видове таблица за разпределение на файлове

FAT получи името си от едноименната таблица за разпределение на файлове – File Allocation Table, FAT. Таблицата за разпределение на файлове съхранява информация за клъстерите на логическия диск. Всеки клъстер има съответен елемент от FAT таблица, съдържащ информация за това дали клъстерът е свободен или зает с файлови данни. Ако клъстерът е зает от файл, тогава адресът на клъстера, съдържащ следващата част от файла, се посочва в съответния елемент на таблицата за разпределение на файлове. Номерът на първоначалния клъстер, зает от файл, се съхранява в записа на директорията, съдържащ записа на файла. Последният елемент от списъка с клъстери съдържа знак за край на файла (EOF – End Of File). Първите два FAT елемента са запазени.

FAT файловата система винаги запълва свободното дисково пространство последователно от началото до края. Когато създава нов файл или увеличава съществуващ, той търси първия свободен клъстер в таблицата за разпределение на файлове. Ако по време на работа някои файлове са били изтрити, а други са променени по размер, тогава получените празни клъстери ще бъдат разпръснати по диска. Ако клъстерите, съдържащи данните на файла, не са разположени в ред, тогава файлът става фрагментиран.

Съществуват следните видове FAT – FAT12, FAT16, FAT32. Имената на FAT типовете са получени от размера на елемента: FAT12 елемент има размер 12 бита (1,5 байта), FAT16 - 16 бита (2 байта), FAT32 - 32 бита (4 байта). Във FAT32 четирите най-значими бита са запазени и се игнорират по време на работа на операционната система.

Основна директория

Таблиците за разпределение на файлове са последвани от основната директория. Всеки файл и поддиректория в основната директория има 32-байтов запис в директория, съдържащ името на файла, неговите атрибути (архивиран, скрит, системен и само за четене) и датата и часа, когато е създаден (или последно модифициран), като както и друга информация. За файловите системи FAT12 и FAT16 позицията на главната директория на дяла и нейният размер са строго фиксирани. Във FAT32 основната директория може да бъде разположена навсякъде в областта с данни на дяла и може да бъде с произволен размер.

Формати на имена на файлове

Една от характеристиките на по-ранните версии на FAT (FAT12 и FAT16) е използването на кратки имена на файлове. Краткото име се състои от две полета - 8-байтово поле, съдържащо действителното име на файла, и 3-байтово поле, съдържащо разширението (формат "8.3"). Ако името на файла, въведено от потребителя, е по-кратко от 8 символа, то се допълва с интервали (код 0x20); ако въведеното разширение е по-кратко от три байта, тогава то също се допълва с интервали.

Структурата на елемента на директорията за кратко име на файл е представена в таблица 1.

Първият байт от краткото име служи като индикатор за заетост на директорията:

  • ако първият байт е 0xE5, тогава записът в директорията е свободен и може да се използва при създаване на нов файл;
  • ако първият байт е 0x00, тогава записът в директорията е свободен и е началото на чиста област на директория (няма разрешени записи след него).

Таблица 1. Структура на елемент на директория за кратко име на файл

Пристрастие

Размер (байтове) Съдържание
0x00 11 Кратко име на файл
0x0B 1 Атрибути на файла
0x0C 1 Запазено за Windows NT.
0x0D 1 Поле, указващо времето за създаване на файла (съдържа десетки милисекунди). Полето се обработва само във FAT32
0x0E 1 Време за създаване на файл. Полето се обработва само във FAT32
0x10 2 Дата на създаване на файла. Полето се обработва само във FAT32
0x12 2 Дата на последния достъп до файла за запис или четене на данни. Полето се обработва само във FAT32
0x14 2 Най-значимата дума от първия клъстерен номер на файла. Полето се обработва само във FAT32
0x16 2 Час на последната операция за запис във файл
0x18 2 Дата на последната операция за запис във файла
0x1A 2 Ниската дума на първия клъстерен номер на файла
0x1C 4 Размер на файла в байтове

Има редица ограничения за използването на ASCII символи в кратко име:

  • не можете да използвате знаци с кодове по-малки от 0x20 (с изключение на код 0x05 в първия байт на краткото име);
  • не можете да използвате символи с кодове 0x22, 0x2A, 0x2B, 0x2C, 0x2E, 0x2F, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x5B, 0x5C, 0x5D, 0x7C;
  • Не можете да използвате знак за интервал (0x20) в първия байт на името.

Файловите системи FAT32 и VFAT (виртуална FAT, разширение FAT16) включват поддръжка за дълги имена на файлове (LFN). За съхраняване на дълго име се използват елементи на директория, съседни на основния елемент. Името на файла не се изписва с ASCII символи, а с Unicode. Можете да съхранявате фрагмент от до 13 Unicode знака в един запис в директорията. Неизползваната част от последния фрагмент се запълва с кодове 0xFFFF. Структурата на елемента на директория за дълго име на файл е показана в таблица 2.

Таблица 2. Структура на елемент на директория за дълго име на файл

Пристрастие Размер (байтове) Съдържание
0x00 1 Номер на фрагмента
0x01 10 Знаци 1-5 от името на файла в Unicode
0x0B 1 Атрибути на файла
0x0C 1 Байт за флагове
0x0D 1 Контролна сума за кратко име
0x0E 12 Знаци 6-11 от името на файла в Unicode
0x1A 2 Номер на първия клъстер (попълнен с нули)
0x1C 4 Знаци 12-13 от името на файла в Unicode

Зареждащ сектор

Първият сектор на логическия диск с FAT система съдържа сектора за зареждане и блок от параметри на BIOS. Първоначалният раздел на този блок е идентичен за всички видове FAT (Таблица 3). Разликите в структурата на секторите за зареждане за различните типове FAT започват от отместване 0x24. За FAT12 и FAT16 структурата е показана в таблица 4, за FAT32 - в таблица 5.

Таблица 3. Първоначална секция на сектора за зареждане

Пристрастие Размер, байтове Описание
0x00 3 Безусловен скок (jmp) към код за зареждане
0x03 8 ID на производителя
0x0B 2 Брой байтове в сектора (512)
0x0D 1 Брой сектори в клъстер
0x0E 2 Брой резервни сектори в резервната зона на дяла, започвайки от първия сектор на дяла
0x10 1 Брой таблици (копия) FAT
0x11 2 За FAT12/FAT16 - брой 32-байтови файлови дескриптори в основната директория; за FAT32 това поле има стойност 0
0x13 2 Общ брой сектори в дяла; ако това поле съдържа 0, тогава броят на секторите се определя от полето при отместване 0x20
0x15 1 Тип медия. За твърд диск стойността е 0xF8; за дискета (2 страни, 18 сектора на песен) – 0xF0
0x16 2 За FAT12/FAT16 това поле съдържа броя на секторите зает от едно копие на FAT; за FAT32 това поле има стойност 0
0x18 2 Брой сектори на песен (за прекъсване 0x13)
0x1A 2 Брой работни повърхности (за прекъсване 0x13)
0x1C 4 Брой скрити сектори преди разделяне
0x20 4 Общият брой сектори в дяла. Полето се използва, ако секцията над 65535 сектора, в противен случай полето съдържа 0.

Таблица 4. Структура на сектора за зареждане на FAT12/FAT16

Пристрастие Размер, байт Описание 0x24 1 Номер на устройството за прекъсване 0x13 0x25 1 0x26 1 Флаг за разширен запис при зареждане (0x29) 0x27 4 Номер на логическо устройство 0x2B 11 Етикет на диска 0x36 8 Текстов низ със съкращение от тип файлова система

Таблица 5. Структура на сектора за зареждане на FAT32

Размер, байт Описание 4 Брой сектори, заети от едно копие на FAT 2 Активен FAT номер 2 Номер на версията на FAT32: старши байт - номер на версията,junior – ревизионен номер. В момента стойността е 0:0 4 Номер на клъстер за първия клъстер от основната директория 2 Номер на сектор на структурата FSINFO в резервната област на логическия диск 2 Използван номер на сектор (в резервната област на логическия диск).за съхраняване на резервно копие на сектора за зареждане 12 Запазено (съдържа 0)

Пристрастие
0x24
0x28
0x2A
0x2С
0x30
0x32
0x34

В допълнение към 2-ро и 3-то поле, изброени в таблиците, нулевият сектор на логическия диск трябва да съдържа кода 0x55 в байта при отместване 0x1FE и кода 0xAA в следващия байт (отместване 0x1FF). Посочените два байта са знак за зареждащия диск.

По този начин секторът за зареждане изпълнява две важни функции: описва структурата на данните на диска и също така позволява на операционната система да стартира.

Логическият диск с организация FAT32 допълнително съдържа структура FSInfo, разположена в първия сектор на резервната област. Тази структура съдържа информация за броя на свободните клъстери на диска и номера на първия свободен клъстер във FAT таблицата. Форматът на структурата е описан в таблица 6.

Таблица 6. Структура на сектора FSInfo и резервния зареждащ сектор на FAT32

Размер, байт Описание 4 Стойността 0x41615252 е подпис, който показва, че този сектор съдържа структурата FSInfo 480 Запазено (съдържа 0) 4 Стойност 0x61417272 (подпис) 4 Съдържа текущия брой свободни клъстери на диска. Ако полето съдържа стойността 0xFFFFFFFF, тогава броят на свободните клъстери е неизвестен и трябва да се изчисли 4 Съдържа номера на клъстера, от който драйверът на диска трябва да започне да търси свободни клъстери. Ако полето съдържа стойността 0xFFFFFFFF, тогава търсенето на свободни клъстери трябва да започне с клъстер номер 2 12 Запазено (съдържа 0) 4 Сигнатура 0xAA550000 – знак за край на структурата FSInfo

Пристрастие
0x000
0x004
0x1E4
0x1E8
0x1EC
0x1F0
0x1FC

За достъп до съдържанието на файл, разположен на дял с файлова система FAT, трябва да получите номера на първия клъстер на файла. Този номер, както вече установихме, е част от записа в директорията, съдържащ записа на файла. Първият номер на клъстера съответства на елемента на FAT таблицата, който съхранява адреса на клъстера, съдържащ следващата част от файла. FAT елементът, съответстващ на последния клъстер във веригата, съдържа подписа за края на файла. За FAT12 тази стойност е 0xFFF, за FAT16 – 0xFFFF, за FAT32 – 0xFFFFFFFF.

Нека да разгледаме софтуерната реализация на алгоритъма за четене за всеки тип FAT и да започнем с FAT16.

Всички изходни текстове, разгледани в статията, са достъпни на уебсайта на списанието.

Софтуерна реализация на алгоритъма за четене на файл от логически дял с файлова система FAT16

Нека разработим модул, който чете първите N клъстера на файл, създаден на дял с файлова система FAT16. Параметърът N (брой клъстери за четене) е променлива стойност и се определя от потребителя. Името на файла съответства на формат “8.3”, т.е. е кратък. Модулът работи под Linux OS.

Нека дефинираме необходимите заглавни файлове:

#включи

#включи

#включи

#включи

#включи

#include "split.h"

Заглавният файл split.h има следното съдържание:

#включи

#define SHORT_NAME 13 // максимална дължина на кратко име на файл

struct split_name(

U8 име; // име на файл

U8 вътр. // разширение на файл

Int name_len, // дължина на името на файла

Ext_len; // дължина на файловото разширение

Структурата split_name е предназначена да съхранява компонентите на кратко име на файл (име и разширение) и техните дължини.

Заглавният файл дефинира структурни типове, които описват основните компоненти на файловата система FAT - сектор за зареждане, сектор FSInfo, структури на елементи на директория за кратки и дълги имена на файлове.

Нека разгледаме накратко полетата, които са включени във всяка от тези структури.

    1. Структура на сектора за зареждане struct fat_boot_sector:
      • __s8 системен_идентификатор– системен идентификатор;
      • __u8 sector_size – размер на сектора в байтове;
      • __u8 клъстер_размер– размер на клъстера по сектори;
      • __u16 запазено– броя на резервните сектори в резервната зона на дяла;
      • __u8 мазнини– брой FAT копия;
      • __u8 dir_entries– броя на 32-байтовите файлови дескриптори в основната директория;
      • __u8 сектора– брой сектори на дяла; ако това поле е 0, се използва полето total_sect;
      • __u8 медии– тип носител, на който е създадена файловата система;
      • __u16 дебел_дължина– размер на FAT в сектори;
      • __u32 total_sect– размер на FAT дяла в сектори (ако полето за сектори == 0).
      • __u32 fat32_дължина– FAT32 размер в сектори;
      • __u32 root_cluster– номер на първия клъстер от основната директория;
      • __u16 инфо_сектор– номер на сектора, съдържащ структурата FSInfo.

Следните полета от тази структура се използват само от FAT32:

  1. Секторна структура FSInfo struct fat_boot_fsinfo:
    • __u32 подпис1– подпис 0x41615252;
    • __u32 подпис2– подпис 0x61417272;
    • __u32 безплатни клъстери– брой свободни клъстери. Ако полето съдържа -1, търсенето на свободни клъстери трябва да започне с клъстер номер 2.
  2. Кратко име структура на елемент на директория struct msdos_dir_entry:
    • __s8 име, вътр– име и разширение на файла;
    • __u8 атрибут– файлови атрибути;
    • __u8 ctime_ms– в това поле се посочва времето за създаване на файла до ms (използва се само FAT32);
    • __u16 ctime– време за създаване на файл (използва се само FAT32);
    • дата __u16– дата на създаване на файла (използва се само FAT32);
    • дата __u16– дата на последен достъп до файла (използва се само FAT32);
    • __u16 starthi– най-значимите 16 бита от първия клъстерен номер на файла (използва се само FAT32);
    • __u16 час, дата, начало– час и дата на създаване на файла, номер на първия клъстер на файла;
    • __u32 размер– размер на файла (в байтове).
  3. Структура на елемент на директория с дълго име:
    • __u8 id– номер на елемента;
    • __u8 име0_4– знаци 1 – 5 от името;
    • __u8 атрибут– файлови атрибути;
    • __u8 псевдоним_контролна сума– кратко име контролна сума;
    • __u8 име5_10– символи 6 – 11 от името;
    • __u8 име11_12– символи 12 – 13 от името.

Нека продължим да разглеждаме софтуерната реализация на алгоритъма и да определим името на дяла, на който е създадена файловата система FAT16:

#ifndef FAT16_PART_NAME

#define FAT16_PART_NAME "/dev/hda1"

#endif

Глобални структури:

struct fat_boot_sector fbs; // структура на сектора за зареждане

struct msdos_dir_entry dentry; // структура на елемент на директория

Глобални променливи:

U16 * мазнини 16; // копирайте таблицата FAT16 тук

U16 сектор_размер; // размер на сектора (от FAT16)

U16 dir_entries; // брой 32-байтови дескриптори

// в основната директория (0 за FAT32)

U16 сектори; // общ брой сектори в дяла

U32 fat16_size; // FAT16 размер

U32 root_size; // размер на основната директория

U16 байт_на_клъстер; // размер на клъстера в байтове

U16 следващ_клъстер; // следващ клъстер във веригата

int мазнини;

Да започнем с основната функция:

int main()

Int num;

Посочваме пълното име на файла, чието съдържание искаме да прочетем. Напомням, че работим само с кратки имена на файлове. Процедурата за работа с дълги имена не се обсъжда в тази статия.

U8 *пълен_път = "/Папка1/Папка2/текст.txt";

Отворете файла на устройството:

Hard = open(FAT16_PART_NAME, O_RDONLY);

Ако (трудно< 0) {

Грешка (FAT16_PART_NAME);

Изход(-1);

Четем първите 10 клъстера от файла. Четенето се извършва от функцията fat16_read_file(). Функционалните параметри са пълното име на файла и броя на клъстерите за четене. Функцията връща броя на прочетените клъстери или -1, ако е възникнала грешка при четене:

Num = fat16_read_file(пълен_път, 10);

Ако (бр< 0) perror("fat16_read_file");

Else printf("Прочетете %d клъстера ", брой);

Затворете файла на устройството и излезте:

Затвори (трудно);

Връщане 0;

Функцията за четене на файлови клъстери има следната форма:

int fat16_read_file(__u8 *пълен_път, int num)

Структура split_name sn; // структура за съхраняване на файлови компоненти

U8 tmp_name_buff; // буфер за временно съхранение на компонентите на пълния файлов път

Статично int i = 1;

Int n;

U8 *tmp_buff;

U16 начален_клъстер, следващ_клъстер;

Ние изброихме параметрите на функцията, когато разглеждахме основната функция.

Подготвителни операции - нулиране на буфера tmp_name_buff и структурата struct split_name sn:

Първият знак в абсолютния път на файл трябва да бъде наклонена черта (/). Нека проверим това:

Прочетете сектора за зареждане от дяла:

Ако (read_fbs ()< 0) return -1;

Прочетеният зареждащ сектор вече се намира в глобалната структура struct fat_boot_sector fbs. Нека копираме размера на сектора, броя на записите в основната директория и общия брой сектори на дяла от тази структура:

Нека определим размера на клъстера в байтове:

Byte_per_cluster = fbs.cluster_size * 512

Нека покажем информацията, намираща се в сектора за зареждане:

Printf("Идентификатор на системата - %s ", fbs.system_id);

Printf("Размер на сектор - %d ", сектор_размер);

Printf("Размер на клъстер - %d ", fbs.cluster_size);

Printf("Резервирано - %d ", fbs.reserved);

Printf("FATs номер - %d ",fbs.fats);

Printf("Записи в директория - %d ", dir_entries);

Printf("Сектори - %d ", сектори);

Printf("Медия - 0x%X ", fbs.media);

Printf("FAT16 дължина - %u ", fbs.fat_length);

Printf("Обща секта - %u ", fbs.total_sect);

Printf("Байт на клъстер - %d ", byte_per_cluster);

Изчисляваме размера на FAT16 в байтове и го четем:

Fat16_size = fbs.fat_length * 512;

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

Четене на основната директория:

Ако (read_root_dentry()< 0) return -1;

Указателят dir_entry вече е позициониран на мястото в паметта, съдържащо записите в основната директория. Размерът на тази област на паметта е равен на размера на основната директория (root_size).

Нека запазим (за контрол) съдържанието на главната директория в отделен файл:

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Близо (дебел);

#endif

Изчисляваме началото на областта с данни:

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

Имайки всички записи в главната директория, можем да стигнем до съдържанието на файла test.txt. За целта организираме цикъл. В тялото на цикъла ще анализираме пълното име на файла, като подчертаваме неговите елементи - поддиректории (имаме две от тях, Folder1 и Folder2) и името на файла, който търсим (test.txt).

докато (1) (

Memset(tmp_name_buff, 0, SHORT_NAME);

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

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

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

I++;

прекъсване;

Tmp_name_buff[n] = "?";

Попълваме структурата struct split_name sn с подходящата информация. Функцията split_name изпълнява попълването и проверява името на файла за съответствие с формата "8.3":

< 0) {

Printf("невалидно име ");

Връщане -1;

За всеки елемент от пълното име на файла ние дефинираме начален клъстер. За да направим това, търсим в елементите на директорията (започвайки от корена) за запис, съответстващ на елемента с пълно име, и четем този запис. Процедурата за търсене се извършва от функцията get_dentry():

If(get_dentry(&sn)< 0) {

Printf("Няма такъв файл!");

Връщане -1;

Проверка на атрибутите на файла. Ако това е директория, прочетете нейното съдържание и продължете цикъла:

Ако (dentry.attr & 0x10) (

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

Продължи;

Ако това е файл, четем първите num клъстери. За контрол ще запазим прочетената информация в отделен файл:

Ако (dentry.attr & 0x20) (

Start_cluster = dentry.start;

Tmp_buff = (__u8 *)malloc(byte_per_cluster); // съдържанието на клъстера ще бъде прочетено тук

N = отворен ("клъст", O_CREAT|O_RDWR, 0600); // запишете прочетената информация в този файл

Ако (n< 0) {

Грешка ("отворен");

Връщане -1;

За да четем файлови клъстери, организираме цикъл:

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

Ние четем съдържанието на клъстера в буфера tmp_buff и го записваме в отделен файл:

< 0) return -1;

< 0) {

Грешка ("запиши");

Затвори(n);

Връщане -1;

Ние четем от FAT16 номера на следващия клъстер, зает от този файл. Ако това е последният клъстер, прекъсваме цикъла и се връщаме към основната функция:

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("ОК. Прочетено ");

Printf("следващ клъстер на файл - 0x%X .. ", следващ_клъстер);

#endif

If(следващ_клъстер == EOF_FAT16) (

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("последен клъстер.");

#endif

Безплатно (tmp_buff);

Затвори(n);

Връщане ++i;

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("спиране на четенето ");

#endif

Връщане i;

Четенето на сектора за зареждане на FAT16 се извършва от функцията read_fbs(). Резултатът се поставя в глобалната fbs структура:

int read_fbs()

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

Връщане 0;

Четенето на таблицата за разпределение на файлове на файловата система FAT16 се извършва от функцията read_fat16():

int read_fat16()

U64 търсене = (__u64)(fbs.reserved) * 512; // изместване до FAT16 от началото на дяла

Fat16 = (void *)malloc(fat16_size);

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

Връщане 0;

Функцията read_root_dentry() чете основната директория:

int read_root_dentry()

U64 търсене = (__u64)fbs.reserved * 512 + fat16_size * fbs.fats; // изместване към основната директория от началото на дяла

Root_size = 32 * dir_entries; // изчисляване на размера на основната директория

Dir_entry = (__u8 *)malloc(root_size);

If(!dir_entry) върне -1;

Memset(dir_entry, 0, root_size);

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

Връщане 0;

Четенето на клъстер, принадлежащ на файл, се извършва от функцията read_cluster(). Входните параметри на функцията са номерът на клъстера cluster_num и указател към буфера __u8 *tmp_buff, където трябва да се постави резултатът от четенето. Отместването към клъстера на дяла се изчислява по формулата (вижте):

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

  • ТЪРСИ– отместване към клъстера на дяла
  • DATA_START– начало на областта с данни
  • CLUSTER_NUM– сериен номер на клъстера
  • BYTE_PER_CLUSTER– размер на клъстера в байтове

int read_cluster(__u16 cluster_num, __u8 *tmp_buff)

U64 търсене = (__u64)(байт_на_клъстер) * (номер_клъстер - 2) + начало_на_данни; // изчисляване на отместването към клъстера

< 0) return -1;

Връщане 0;

Функцията read_directory чете записи от директория (не от основната директория) и поставя резултата в мястото в паметта, на което указателят dir_entry е зададен:

int read_directory(__u16 start_cluster)

Int i = 1;

U16 следващ_клъстер;

За(; ;i++) (

Разпределяме памет за съхраняване на съдържанието на директорията, четем съдържанието на началния клъстер и получаваме стойността на следващия клъстер от таблицата FAT16:

If(!dir_entry) върне -1;

< 0) return -1;

Следващ_клъстер = fat16;

Нека запазим съдържанието на директорията в отделен файл (за контрол):

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("Следващ клъстер - 0x%X ", next_cluster);

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

Write(fat, dir_entry, root_size);

Близо (дебел);

#endif

Ако бъде достигнат последният клъстер, излизаме от цикъла, в противен случай продължаваме да четем директорията, увеличавайки размера на буфера dir_entry с още един клъстер:

If(next_cluster & EOF_FAT16) break;

Начален_клъстер = следващ_клъстер;

Връщане 0;

Функцията get_dentry() търси в съдържанието на директорията елемент, съответстващ на файла, който се търси. Входните параметри на тази функция са указател към структурата struct split_name *sn, съдържаща елементите на краткото име на файл:

Int i = 0;

Глобалният буфер dir_entry съдържа масив от записи в директория, в които ще търсим запис във файл (или директория). За търсене организираме цикъл. В тялото на цикъла копираме елементите на директорията в глобалната структура на dentry и сравняваме стойностите на полетата name и ext на тази структура със съответните полета на структурата struct split_name *sn. Съвпадението на тези полета означава, че сме намерили запис за файла, който търсим в масива от елементи на директорията:

за (; ; i++) (

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

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

прекъсване;

If(!dentry.name) върне -1;

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

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

Printf("стартов клъстер - 0x%X ", dentry.start);

Printf("размер на файла - %u ", dentry.size);

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

#endif

Връщане 0;

Целият горен код се намира в директорията FAT16, файл fat16.c. За да получите изпълним модул, създайте Makefile със следното съдържание:

INCDIR = /usr/src/linux/include

ФАЛШИРАНЕ = чисто

Fat16: fat16.o split.o

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

%.o: %.c

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

Чисто:

Rm -f *.o

Rm -f ./fat16

Софтуерна реализация на алгоритъма за четене на файл от логически дял с файлова система FAT12

Като цяло алгоритъмът за четене на файл от FAT12 дял е идентичен с алгоритъма за четене на файл от FAT16 дял. Разликата е в процедурата за четене на елементи от таблицата FAT12. Разгледахме таблицата FAT16 като прост масив от 16-битови елементи. За четене на елементите на таблицата FAT12 се предлага следният алгоритъм:

  • умножете номера на елемента по 1,5;
  • извлечете 16-битова дума от FAT, като използвате резултата от предишната операция като отместване;
  • ако номерът на елемента е четен, изпълнете операцията И върху прочетената дума и маската 0x0FFF. Ако числото е нечетно, преместете думата, прочетена от таблицата, с 4 бита към долните цифри.

Въз основа на този алгоритъм ние изпълняваме функцията за четене на елементи от таблицата FAT12:

int get_cluster(__u16 cluster_num)

U16 търсене;

U16 клъст;

Изчисляваме отместването в таблицата FAT12 и четем 16-битова дума от таблицата:

Търсене = (cluster_num * 3) / 2;

Memcpy((__u8 *)&clust, (__u8 *)(fat12 + търсене), 2);

Ако началният номер на клъстера е четно число, изместваме прочетената от таблицата стойност с 4 бита към по-ниските битове, ако е нечетно, сумираме го с 0x0FFF:

If(cluster_num % 2) clust >>= 4;

Друг клъст &= 0x0FFF;

Този фрагмент може да бъде реализиран и в асемблер:

" xorw %%ax, %%ax "

" между другото $0, %%cx "

"jnc 1f"

" shw $4, %%dx "

"jmp 2f"

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

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

:"=a" (следващ)

:"d" (клъстер), "c" (номер_клъстер));

Връщаме резултата:

Returnclust;

Нека разгледаме по-подробно самия алгоритъм. Да приемем, че е създаден файл на FAT12 дял, който заема 9-ия и 10-ия клъстер. Всеки FAT12 елемент заема 12 бита. защото от таблицата четем 16-битови елементи, тогава отместването до 9-ия елемент ще бъде равно на 13 байта (9 * 1,5 = 13, останалото се изхвърля), докато по-ниските 4 бита ще принадлежат на 8-ия FAT елемент. Те трябва да бъдат изхвърлени и за да направите това, е достатъчно да изместите прочетения елемент с 4 бита към по-ниските цифри, което се осигурява от алгоритъма. Отместването на 10-ия елемент ще бъде 15 байта, а най-значимите 4 бита ще принадлежат на 11-ия FAT елемент. За да ги отхвърлите, е необходимо да извършите операция И върху 10-ия елемент и маската 0x0FFF, което също отговаря на горния алгоритъм.

Изходните текстове на модула за четене на файл от FAT12 дял се намират в FAT12 директория, файл fat12.c.

Софтуерна реализация на алгоритъма за четене на файл от логически дял с файлова система FAT32

Алгоритъмът за четене на файл от дял с файлова система FAT32 практически не се различава от алгоритъма за FAT16, с изключение на това, че в FAT32 основната директория може да се намира навсякъде в дяла и да има произволен размер. Затова, за да стане по-интересно, нека усложним задачата - да предположим, че знаем само номера на дяла с файловата система FAT32. За да прочетете информация от този дял, първо трябва да определите неговите координати - отместването спрямо дяла от началото на диска. И за това трябва да имате представа за логическата структура на твърдия диск.

Логическа структура на твърд диск

Нека разгледаме логическата структура на твърд диск, който отговаря на стандарта на Microsoft - „главен дял – разширен дял – не-DOS дялове“.

Пространството на твърдия диск може да бъде организирано в един или повече дялове, а дяловете могат да съдържат едно или повече логически устройства.

Главният запис за зареждане (MBR) се намира на твърдия диск на физически адрес 0-0-1. Структурата на MBR съдържа следните елементи:

  • несистемно зареждане (NSB);
  • таблица, описваща дисковите дялове (partition table, PT). Намира се в MBR на отместване 0x1BE и заема 64 байта;
  • MBR подпис. Последните два байта на MBR трябва да съдържат числото 0xAA55.

Таблицата на дяловете описва разположението и характеристиките на наличните дялове на твърдия диск. Дисковите дялове могат да бъдат два вида - основни (primary, main) и разширени (extended). Максималният брой първични дялове е четири. Наличието на поне един първичен дял на диска е задължително. Разширеният дял може да бъде разделен на голям брой подразделения - логически дискове. Опростена структура на MBR е представена в таблица 7. Таблицата на дяловете се намира в края на MBR; 16 байта са разпределени за описание на дяла в таблицата.

Таблица 7. Структура на MBR

Пристрастие Размер, байтове 0 446 0x1BE 16 0x1CE 16 0x1DE 16 0x1EE 16 0x1FE 2

Структурата на записите в таблицата за дялове е показана в таблица 8.

Таблица 8. Структура на записите в таблицата на дяловете

Пристрастие Размер, байтове Съдържание
0x00 1 Знак за активност (0 - дялът не е активен, 0x80 - дялът е активен)
0x01 1 Номерът на главата на диска, от който започва дялът
0x02 2 Номер на цилиндъра и номер на сектора, от който започва секцията
0x04 1 Код на типа дял на системния идентификатор
0x05 1 Номер на главата на диска, където завършва дялът
0x06 2 Номер на цилиндъра и номер на сектора, който завършва секцията
0x08 4 Абсолютен (логически) номер на началния сектор на дяла
0x0C 4 Размер на дяла (брой сектори)

Първият байт в елемента на секцията е флагът за активност на секцията (0 – неактивен, 0x80 – активен). Той служи за определяне дали дялът е системен за зареждане и дали има нужда да се зарежда операционната система от него при стартиране на компютъра. Само една секция може да бъде активна. Флагът за активност на дяла е последван от координатите на началото на дяла - три байта, указващи номера на главата, номера на сектора и номера на цилиндъра. Номерата на цилиндъра и сектора са посочени във формата на прекъсване Int 0x13, т.е. битове 0-5 съдържат номера на сектора, битове 6-7 – най-значимите два бита от 10-битовия номер на цилиндъра, битове 8-15 – най-малко значимите осем бита от номера на цилиндъра. Това е последвано от System ID код, който показва, че този раздел принадлежи към определена операционна система. Идентификаторът заема един байт. Зад системния идентификатор се намират координатите на края на участъка - три байта, съдържащи съответно номерата на главата, сектора и цилиндъра. Следващите четири байта са броят на секторите преди дяла, а последните четири байта са размерът на дяла в сектори.

По този начин елементът на таблицата на дяловете може да бъде описан със следната структура:

struct pt_struct (

U8 стартиращ; // флаг за активност на раздел

U8 начална_част; // координати на началото на участъка

U8 тип_част; // системен идентификатор

U8 край_част; // координати на края на участъка

U32 sect_before; // брой сектори преди дяла

U32 sect_total; // размер на дяла в сектори (брой сектори в дяла)

Елементът на основния дял сочи директно към сектора за зареждане на логическия диск (винаги има само един логически диск в първичния дял), а елементът на разширения дял сочи директно към списък с логически дискове, съставен от структури, наречени вторичен MBR (Secondary MBR, SMBR).

Всеки диск от разширения дял има свой собствен SMBR блок. SMBR има структура, подобна на MBR, но няма запис за зареждане (попълнен с нули) и се използват само две от четирите полета на дескриптора на дяла. Първият елемент от раздела сочи към логическия диск, вторият елемент сочи към следващата SMBR структура в списъка. Последният SMBR от списъка съдържа код на дял нула във втория си елемент.

Да се ​​върнем към модула за четене на файл от FAT32 дял.

Заглавни файлове:

#включи

#включи

#включи

#включи

#включи

MBR подпис:

#define ПОДПИС 0xAA55

Файл на устройството, от който ще се чете информация за дяла:

#define УСТРОЙСТВО "/dev/hda"

Размер на елемента на таблицата на дяловете (16 байта):

#define PT_SIZE 0x10

Следният масив от структури преобразува кода на типа на раздел към неговото символно представяне:

struct systypes (

U8 part_type;

U8 *име на част;

struct systypes i386_sys_types = (

(0x00, "Празно"),

(0x01, "FAT12"),

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

(0x05, "Разширен"),

(0x06, "FAT16"),

(0x0b, "Win95 FAT32"),

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

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

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

(0x82, "размяна на Linux"),

(0x83, "Linux"),

(0x85, "Linux разширени"),

(0x07, "HPFS/NTFS")

Нека определим броя на елементите в масива i386_sys_types с помощта на макроса PART_NUM:

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

Нека зададем ограничение за броя на логическите устройства:

#define MAX_PART 20

Следният структурен масив ще съдържа информация за логическите дискове на устройството (твърд диск):

struct pt_struct (

U8 стартиращ;

U8 начална_част;

U8 тип_част;

U8 край_част;

U32 sect_before;

U32 sect_total;

) pt_t;

int трудно; // файлов дескриптор на устройство

U8 mbr; // брой MBR тук

Номер на дяла, на който е създадена файловата система FAT32:

#define FAT32_PART_NUM 5

Структурите на сектора за зареждане, сектора FSInfo и записа в директорията (дефинирани във файла ):

struct fat_boot_sector fbs;

struct fat_boot_fsinfo fsinfo;

struct msdos_dir_entry dentry;

U32 *fat32 = NULL; // копирайте FAT32 таблицата тук

U16 сектор_размер; // размер на сектора (от FAT32)

U16 dir_entries; // 0 за FAT32

U16 сектори; // брой сектори на дяла

U32 мазнини32_размер; // FAT32 размер

U32 data_start; // начало на областта с данни

U16 байт_на_клъстер; // колко байта има в клъстера (размер на клъстера в байтове)

U32 следващ_клъстер; // следващ клъстер във веригата

U32 root_cluster; // ROOT клъстер - начален клъстер на основната директория

U8 *dir_entry = NULL; // указател към записи в директория

U64 start_seek = 0; // начално отместване към дяла (в байтове)

Главна функция:

int main()

Int num = 0;

Int cluster_num = 5; // колко клъстера да се прочетат от файла

U8 *пълен_път = "/Папка1/Папка2/readme"; // файл за четене

Отваряме устройството, получаваме информация за таблицата на дяловете на устройството и показваме информация за дяловете:

Hard = open(DEV_NAME, O_RDONLY);

Ако (трудно< 0) {

Грешка (DEV_NAME);

Изход(-1);

If(get_pt_info(hard)< 0) {

Грешка ("get_pt_info");

Изход(-1);

Show_pt_info();

Изчисляваме началното отместване към дяла:

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

Прочетете клъстерите, принадлежащи към файла:

Num = fat32_read_file(пълен_път, номер_клъстер);

Ако (бр< 0) perror("fat32_read_file");

Else printf("Прочетете %d клъстера\n", num);

Затвори (трудно);

Връщане 0;

Информацията за таблицата на дяловете се чете от функцията get_pt_info():

int get_pt_info(int hard)

Int i = 0;

U64 търсене;

Четем таблицата на дяловете от MBR и проверяваме подписа:

Read_main_ptable(hard);

If(check_sign()< 0) {

Printf("Невалиден подпис!\n");

Връщане -1;

Търсим идентификатора на разширения раздел. Ако има такъв, изчисляваме отместването към разширения дял и четем информация за логическите устройства:

за (; i< 4; i++) {

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

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

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

Търсене = (__u64)pt_t[i].sect_before * 512;

Read_ext_ptable(твърдо, търсене);

прекъсване;

Връщане 0;

Функция за четене на таблица на дялове read_main_ptable():

void read_main_ptable(int hard)

Ако (четене (трудно, mbr, 512)< 0) {

Грешка ("четене");

Затвори (трудно);

Изход(-1);

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

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

Връщане;

Функция за проверка на подпис check_sign():

int check_sign()

U16 знак = 0;

Memcpy((void *)&знак, (void *)(mbr + 0x1FE), 2);

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("Подпис - 0x%X\n", знак);

#endif

If(sign != SIGNATURE) върне -1;

Връщане 0;

Функция за четене на разширена таблица на дялове:

void read_ext_ptable(int hard, __u64 търсене)

Int num = 4; // започвайки от тази позиция, масивът от структури pt_t ще бъде попълнен с информация за логическите устройства

U8 sbr;

Входни данни:

  • твърд– файлов дескриптор на устройството;
  • търси– отместване към разширения дял от началото на диска (в байтове).

За да получим информация за логическите устройства, организираме цикъл:

For(;;num++) (

Четем SMBR, намиращ се на отместването на търсенето от началото на диска:

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

Pread64(твърд, smbr, 512, търсене);

Попълваме два елемента от таблицата pt_t, започвайки от позиция num. Първият елемент ще сочи към логическото устройство, а вторият ще сочи към следната SMBR структура:

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

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

Правим промяна в полето „Номер на начален сектор“ - броенето е от началото на диска:

Pt_t.sect_before += (търсене / 512);

Ако кодът на типа дял е нула, тогава няма повече логически устройства:

If(!(pt_t.type_part)) break;

Изчисляваме отместването към следния SMBR:

Търсене = ((__u64)(pt_t.sect_before + pt_t.sect_total)) * 512;

Връщане;

Функцията show_pt_info() показва информация за намерените логически дискове на устройството:

недействителен show_pt_info()

Int i = 0, n;

#ifdef ОТСТРАНЯВАНЕ НА ГРЕШКИ

Printf("Броят на дяловете на диска е %d\n", PART_NUM);

#endif

За (; i< MAX_PART; i++) {

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

Printf("\nТип дял %d - ", i);

За (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].part_name);

прекъсване;

If(n == PART_NUM) printf("неизвестен тип\n");

Printf("Знак за стартиране - 0x%X\n", pt_t[i].bootable);

Printf("Сектори в дял %d - %d\n", i, pt_t[i].sect_total);

Printf("Сектори преди дял %d - %d\n\n", i, pt_t[i].sect_before);

Връщане;

Четенето на файлови клъстери от FAT32 дял се извършва от функцията fat32_read_file(). Тази функция има много общо с функцията fat16_read_file(), така че вижте точка 6 за подробни коментари:

int fat32_read_file(__u8 *пълен_път, int num)

Структура split_name sn;

U8 tmp_name_buff;

Int i = 1, n;

U32 начален_клъстер, следващ_клъстер;

U8 *tmp_buff;

Подготвителни операции - почистваме буфера, структурата и проверяваме първата наклонена черта:

Memset(tmp_name_buff, 0, SHORT_NAME);

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

If(full_path != "/") върне -1;

Четене на зареждащия сектор:

Ако (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);

Ние четем структурата на FSInfo и показваме подписа, намиращ се в нея:

Ако (read_fs_info()< 0) return -1;

Printf("Подпис1 - 0x%X\n", fsinfo.подпис1);

Printf("Подпис2 - 0x%X\n", fsinfo.подпис2);

Fat32_size = fbs.fat32_length * 512; // FAT32 размер в байтове

Data_start = 512 * fbs.reserved + fat32_size * 2; // начало на полето с данни

Byte_per_cluster = fbs.cluster_size * 512; // размер на клъстера в байтове

Root_cluster = fbs.root_cluster; // номер на клъстер на основната директория

Четене на FAT32:

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

Разпределете памет за записи в директорията:

Dir_entry = (__u8 *)malloc(byte_per_cluster);

If(!dir_entry) върне -1;

Четене на основната директория:

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

Ние анализираме пълния път на файла и разделяме всеки елемент на неговите компоненти:

докато (1) (

Memset(tmp_name_buff, 0, SHORT_NAME);

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

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

Tmp_name_buff[n] = пълен_път[i];

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

I++;

прекъсване;

Tmp_name_buff[n] = "\0";

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

Printf("невалидно име\n");

Връщане -1;

If(get_dentry(&sn)< 0) {

Printf("Няма такъв файл!\n");

Връщане -1;

За да получите началния номер на клъстер във файловата система FAT32, трябва да използвате най-високата дума от номера на първия клъстер на файла - полето starthi на структурата на dentry:

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

Проверка на байта на атрибута:

If(dentry.attr & 0x10) ( // това е директорията

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

Продължи;

If(dentry.attr & 0x20) ( // и това е файл

Tmp_buff = (__u8 *)malloc(byte_per_cluster);

N = отворен ("клъст", O_CREAT|O_RDWR, 0600);

Ако (n< 0) {

Грешка ("отворен");

Връщане -1;

Printf("първият клъстер на файла - 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) {

Грешка ("запиши");

Връщане -1;

If(следващ_клъстер == EOF_FAT32) (

Безплатно (tmp_buff);

Затвори(n);

Връщане ++i;

Начален_клъстер = следващ_клъстер;

Връщане i;

Целта на следващите три функции е да получат съдържанието на системната област, т.е. сектор за зареждане, структура FSInfo и таблица FAT32:

1) функцията read_fbs() чете сектора за зареждане:

int read_fbs()

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

Връщане 0;

2) функцията read_fs_info() чете структурата FSInfo:

int read_fs_info()

U64 търсене = (__u64)fbs.info_sector * 512 + start_seek;

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

Връщане 0;

3) функцията read_fat32() чете таблицата FAT32:

int read_fat32()

U64 търсене = (__u64)fbs.reserved * 512 + start_seek;

Fat32 = (void *)malloc(fat32_size);

If(!fat32) върне -1;

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

Връщане 0;

Функцията read_cluster() чете клъстера с посочения номер:

int read_cluster(__u32 cluster_num, __u8 *tmp_buff)

U64 търсене = (__u64)(байт_на_клъстер) * (номер_клъстер - 2) + начало_на_данни + търсене_на_начало;

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

Връщане 0;

Функцията read_directory() се използва за четене на директории (включително основната директория):

int read_directory (__u32 start_cluster)

Int i = 2;

U32 следващ_клъстер;

Функционалните параметри са началният клъстер на директорията. Ние четем съдържанието на директорията в глобалния буфер dir_entry:

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

Следващ_клъстер = fat32;

Ако директорията заема един клъстер, излезте; ако не, увеличете размера на паметта и продължете да четете:

За(; ;i++) (

Начален_клъстер = следващ_клъстер;

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

If(!dir_entry) върне -1;

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

Следващ_клъстер = fat32;

If((следващ_клъстер == EOF_FAT32) || (следващ_клъстер == 0xFFFFFF8)) върне 0;

Връщане 0;

Последната функция, която ще разгледаме, търси съдържанието на директория за елемент, който съответства на файла, който търсим:

int get_dentry(struct split_name *sn)

Int i = 0;

Указателят dir_entry е зададен на област от паметта, съдържаща масив от записи в директория, в която ще търсим файла (или директорията). За търсене организираме цикъл и поставяме намерения запис в глобалната структура на dentry:

За(;;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)))

прекъсване;

If(!dentry.name) върне -1;

Връщане 0;

С това приключваме нашия преглед на модула за четене на файл от FAT32 дял.

Изходният код на модула се намира в директорията FAT32, файл fat32.c.

Разлики в организацията на съхраняване на файлови записи в директории за файловите системи FAT и EXT2

Няколко думи за разликите в организирането на съхранението на файлови записи в директории за файловите системи FAT и EXT2. Структурата на файловата система EXT2 беше обсъдена в .

Току-що се запознахме с FAT - в него всички елементи на директорията имат фиксирана стойност. Когато се създаде файл, драйверът на файловата система търси първата незаета позиция и я запълва с информация за файла. Ако дължината на директорията не се побира в един клъстер, тогава за нея се разпределя друг клъстер и т.н.

Нека да видим как стоят нещата в EXT2.

Да кажем, че имаме дял с файлова система EXT2, размерът на блока е 4096 байта. В този раздел създаваме директория. Размерът на директорията ще бъде равен на размера на блока - 4096 байта. В една директория операционната система веднага създава два записа - запис за текущата директория и запис за родителската директория. Записът в текущата директория ще заема 12 байта, докато записът на родителя ще бъде дълъг 4084 байта. Нека създадем файл в тази директория. След това ще има три записа в директорията - запис на текущата директория с дължина 12 байта, запис на родителската директория с дължина 12 байта и запис на създадения файл с дължина, както вероятно се досещате, 4072 байта. Ако изтрием създадения файл, дължината на записа в родителската директория отново се увеличава до 4084 байта.

По този начин, когато създава файл, драйверът на файловата система EXT2 търси запис с максимална дължина в директорията и го разделя, освобождавайки място за нов запис. Е, ако все още няма достатъчно място, друг блок се разпределя за директорията и дължината на директорията става 8192 байта.

И в заключение, малка редакция на статията „Архитектура на файловата система EXT2“.

Тази промяна се отнася до функцията get_i_num() за определяне на номера на inode по име на файл. Старата версия на тази функция изглеждаше така:

int get_i_num(char *име)

Int i = 0, rec_len = 0;

Структура ext2_dir_entry_2 вдлъбнатина;

За (; i< 700; i++) {

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

Rec_len += dent.rec_len;

Връщане на dent.inode;

Коригирана версия:

int get_i_num(char *име)

* Функционалният параметър е името на файла. Върнатата стойност е номерът на inode на файла.

Int rec_len = 0;

Структура ext2_dir_entry_2 вдлъбнатина; // тази структура описва формата на записа в основната директория:

* Глобалният буфер buff съдържа масив от записи в директория. За да определите серийния номер на inode файла, трябва да намерите

* в този масив има запис с името на този файл. За да направите това, организираме цикъл:

За(;;) (

/* Копиране на записи в директорията в структурата на вдлъбнатина: */

Memcpy((void *)&вдлъбнатина, (buff + rec_len), sizeof(вдлъбнатина));

* Дължина на името на файла нула означава, че сме прегледали всички записи в директорията

* и не бяха намерени записи с нашето име на файл. Така че е време да се върнем назад:

If(!dent.name_len) върне -1;

/* Търсенето се извършва чрез сравняване на имена на файлове. Ако имената съвпадат, излизаме от цикъла: */

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

/* Ако имената не съвпадат, преминете към следващия запис: */

Rec_len += dent.rec_len;

/* Ако е успешно, връща номера на inode на файла: */

Връщане на dent.inode;

Литература:

  1. В. Кулаков. Програмиране на хардуерно ниво: специален справочник. 2-ро изд. / – Санкт Петербург: Питър, 2003 – 848 с.
  2. А.В.Гордеев, А.Ю.Молчанов. Системен софтуер / – Санкт Петербург: Питър – 2002
  3. Мешков В. Архитектура на файловата система ext2. – сп. “Системен администратор”, бр.11(12), ноември 2003 г. – 26-32 с.

Във връзка с



Свързани публикации