Изберете заявки в Access

Тази статия е за файлови системи ... Когато инсталирате, Windows ви подканва да изберете файлова система на дяла, където ще бъде инсталирана, а потребителите на компютри трябва да избират от две опции ДЕБЕЛили NTFS.

В повечето случаи потребителите са доволни от това, че знаят това NTFS е "по-добър", и изберете тази опция.

Въпреки това, понякога се чудят и кое точно е по-добре?

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

Статията опростява някои от техническите характеристики на файловите системи за по-ясно възприемане на материала.

Файлова системаТова е начин за организиране на данни на носители за съхранение. Файловата система определя къде и как файловете се записват на носителя и дава на операционната система достъп до тези файлове.

Към съвременните файлови системи се налагат допълнителни изисквания: способност за криптиране на файлове, контрол на достъпа до файлове, допълнителни атрибути. Обикновено файловата система се записва в началото на твърдия диск. ().

От гледна точка на операционната система, твърдият диск е колекция от клъстери.

КлъстерТова е област от диск с определен размер за съхранение на данни. Минималният размер на клъстера е 512 байта. Тъй като се използва двоична бройна система, размерите на клъстера са кратни на степените на две.

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

За твърди дискове в компютър в момента най-често се срещат две файлови системи: ДЕБЕЛили NTFS... Първо се появи ДЕБЕЛ (FAT16), тогава FAT32, и тогава NTFS.

ДЕБЕЛ(FAT16)това е съкращение за Таблица за разпределение на файлове(в превод Таблица за разпределение на файлове).

Рамката FAT е разработена от Бил Гейтс и Марк Макдоналд през 1977 г. Използва се като основна файлова система в операционните системи DOS и Microsoft Windows (до Windows ME).

Има четири версии на FAT - FAT12, FAT16, FAT32и exFAT... Те се различават по броя на битовете, отделени за съхраняване на номера на клъстера.

FAT12използва се главно за флопи дискове, FAT16- за малки дискове, и нови exFATосновно за флашки. Максималният размер на клъстера, поддържан във FAT, е 64Kb. ()

FAT16въведена за първи път през ноември 1987 г. Индекс 16 в името показва, че за номера на клъстера се използват 16 бита. В резултат на това максималният размер на дисковия дял (том), който тази система може да поддържа, е 4GB.

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

NTFS(съкращение НовтехнологияФайлСистема - Нова технологична файлова система) е стандартната файлова система за семейството операционни системи Microsoft Windows NT.

Представен на 27 юли 1993 г. с Windows NT 3.1. NTFS се основава на файловата система HPFS (съкращение ВисокопроизводителностФайлСистема - Високопроизводителна файлова система), създаден от Microsoft съвместно с IBM за операционната система OS / 2.

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

Спецификациите на файловата система са собствени. Обикновено размерът на клъстера е 4K. На практика не се препоръчва да създавате обеми, по-големи от 2TB. Твърдите дискове току-що са достигнали този размер, може би в бъдеще ни очаква нова файлова система. ().

По време на инсталацията на Windows XP се препоръчва да форматирате диска в системата ДЕБЕЛили NTFS... Това означава FAT32.

Всички файлови системи са изградени на принципа: един клъстер - един файл. Тези. един клъстер съхранява данните само от един файл.

Основната разлика за средния потребител между тези системи е размерът на клъстера. „Преди много време, когато дисковете бяха малки и файловете бяха много малки“, това беше много забележимо.

Нека да разгледаме пример за един том на 120GB диск и 10KB файл.

За FAT32размерът на клъстера ще бъде 32Kb, а за NTFS - 4Kb

V FAT32такъв файл ще заема 1 клъстер, оставяйки 32-10 = 22Kb неразпределено пространство.

V NTFSтакъв файл ще заема 3 клъстера, оставяйки 12-10 = 2Kb неразпределено пространство.

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

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

През 2003 г. имах диск от 120 GB, разделен на томове от 40 GB и 80 GB. Когато надстроих от Windows 98 до Windows XP и конвертирах диска от FAT32 v NTFS, получих около 1GB свободно дисково пространство. По това време това е значително "увеличение".

За да разберете коя файлова система се използва на томовете на твърдия диск на вашия компютър, трябва да отворите прозореца със свойства на тома и в раздела "Общ"прочетете тези данни.

Сила на звука- това е синоним на дисков дял, потребителите обикновено наричат ​​тома "диск C", "диск D" и т.н. Пример е показан на снимката по-долу:

В момента широко се използват дискове от 320GB и повече. Затова препоръчвам да използвате системата NTFSза оптимално използване на дисковото пространство.

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

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

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

При написването на статията са използвани материали от сайтове ru.wikipedia.org

Автор на статията: Максим Телпари
Потребител на компютър с 15 години опит. Подкрепете специализиран видео курс "Уверен потребител на компютър", след като изучавате, който ще научите как да сглобите компютър, да инсталирате Windows XP и драйвери, да възстановите системата, да работите в програми и много други.

Правете пари с тази статия!
Регистрирайте се за партньорска програма. Заменете връзката към курса в статията с вашата партньорска връзка. Добавете статията към вашия сайт. Можете да получите препечатана версия.

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

Windows поддържа три различни файлови системи. NTFSТова е най-модерната файлова система. Windows използва NTFS за системното си устройство и по подразбиране за повечето несменяеми устройства. FAT32Това е стара файлова система, която не е толкова ефективна като NTFS и не поддържа голям набор от функции, но осигурява по-голяма съвместимост с други операционни системи. exFATе модерен заместител на FAT32 и се поддържа от повече устройства и операционни системи, отколкото NTFS - но не толкова широко разпространен като FAT32.

NT файлова система (NTFS)

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

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

Системният дял на Windows трябва да е във формат NTFS... Ако имате допълнителен диск с Windows и планирате да инсталирате програми на него, по-добре е също да го форматирате в NTFS. И ако имате дискове, за които съвместимостта не е проблем - тъй като знаете, че ще ги използвате в Windows системи - не се колебайте да изберете NTFS.

Въпреки своите предимства, NTFS няма съвместимост... Той ще работи с всички последни версии на Windows - до Windows XP - но има ограничена съвместимост с други операционни системи. По подразбиране Mac OS X може само да чете NTFS устройства, но не и да записва данни. Някои дистрибуции на Linux може да включват поддръжка за запис на NTFS, но други може да са само за четене. Нито една от конзолите на Sony PlayStation не поддържа NTFS. Дори собствената конзола Xbox 360 на Microsoft не може да чете NTFS устройства, различни от Xbox One. Други устройства е още по-малко вероятно да поддържат NTFS.

Съвместимост: Работи с всички версии на Windows, но е само за четене на Mac и може да бъде само за четене в някои дистрибуции на Linux. Други устройства, с изключение на Microsoft Xbox One, вероятно няма да поддържат NTFS.

Ограничения: Нереалистично ограничение за размера на файла и размера на дяла.

Перфектна употреба: Използвайте го за вашето устройство с Windows и други вътрешни устройства, които ще се използват само с Windows.

Таблица за разпределение на файлове 32 (FAT32)

FAT32 е най-старата от трите файлови системи, налични в Windows. Той беше въведен в Windows 95 и замени старата файлова система FAT16, използвана в MS-DOS и Windows 3.

Възрастта на файловата система FAT32 има своите предимства и недостатъци. Големите предимства са, че FAT32 е де факто стандарт. Опакованите флаш памети често са файлова система FAT32 за максимална съвместимост не само със съвременните компютри, но и с други устройства като игрови конзоли и всичко с USB порт.

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

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

Съвместимост: Работи с всички версии на Windows, Mac и Linux, игрови конзоли и почти всяко устройство с USB порт.

Ограничения: Максимален размер на файла 4 GB, максимален размер на дяла 8 TB.

Перфектна употреба: Използвайте на сменяеми устройства, където се нуждаете от максимална съвместимост с широк спектър от устройства, освен ако не използвате 4GB или по-големи файлове.

Разширена таблица за разпределение на файлове (exFAT)

ExFAT файлова системабеше представен през 2006 г. и беше добавен към по-стари версии на Windows с актуализации за Windows XP и Windows Vista. exFAT е флаш-оптимизирана файлова система- проектиран да поддържа съвместимост с FAT32, но без ненужните функции на NTFS и без ограниченията на FAT32.

Подобно на NTFS, exFAT има много големи ограничения за размер на файлове и дялове, което ви позволява да съхранявате файлове много по-големи от 4GB, разрешени във FAT32.

Въпреки че exFAT не е напълно съвместим с FAT32, той е по-широко съвместим от NTFS. Дори Mac OS предлага пълна поддръжка за четене/запис на exFAT. exFAT дисковете могат да бъдат достъпни в Linux след инсталиране на съответния софтуер. С други устройства е малко по-сложно: PlayStation 4 поддържа exFAT; PlayStation 3 не поддържа; Xbox One поддържа, но Xbox 360 не.

Съвместимост: Работи с всички версии на Windows и модерни версии на Mac X, но изисква допълнителен софтуер на Linux. Повече устройства поддържат exFAT, но някои - особено по-старите - работят само с FAT32.

Ограничения: Нереалистично ограничение на размера за файлове и дялове.

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

NTFS е идеален за вътрешни устройства, докато exFAT обикновено е идеален за флаш устройства. Въпреки това, понякога може да се наложи да форматирате външно устройство с FAT32, ако exFAT не се поддържа на устройството, с което искате да го използвате.

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

Веднага трябва да кажа, че нямах цел да напиша собствен шофьор или да разбера подробно тънкостите, просто ми беше интересно. Задачата е доста проста за разбиране, така че тук няма да има "кодове".

И така, първото нещо, което трябва да разберем, е, че когато комуникираме директно с карта с памет, можем или да четем, или да запишем 512 байта, не се дава друго действие. Тъй като непрекъснато копираме и изтриваме файлове, а размерите на файловете винаги са различни, тогава на картата ще се образуват празни зони, смесени със записаните. За да не се притеснява потребителят за поставянето на данни, има слой, който се грижи за тези проблеми, това е файловата система.

Както бе споменато по-горе, можете да пишете и четете само в кратни на 512 байта, т.е. 1 сектор. Има и концепция - клъстерът е глупаво няколко сектора, например, ако размерът на клъстера е 16kB, тогава това означава, че има 16000/512 = 31.25, по-точно 32 сектора, а реалният размер на клъстера е 16384 байта. Всички файлове са кратни на размера на клъстера. Дори ако файлът е с размер 1kB и клъстерът е 16kB, файлът ще заема всички 16kB.

Би било логично да се правят клъстери с малък размер, тогава влиза в игра ограничението за максимален брой файлове и техния размер. FAT16 работи с 16-битови данни, така че не можете да поберете повече от 2 ^ 16 клъстера. Следователно, колкото по-малък е техният размер, толкова по-ефективно се използва пространството за малки файлове, но толкова по-малко информация може да бъде натъпкана на диска. И обратното, колкото по-голям е размерът, толкова повече информация може да бъде натъпкана, но толкова по-малко ефективно се използва пространството за малки файлове. Максималният размер на клъстера е 64 kB, така че максималният за FAT16 е 64 kb * 2 ^ 16 = 4 GB.

Първоначални данни: има 1GB micro SD карта с памет. С етикет MYDISK, напълно форматиран, размер на клъстера 16KB.

Ще ви е необходим Hex редактор, но всеки няма да работи, имате нужда от такъв, който може да преглежда целия диск, а не само файловете на диска. От това, което успях да намеря: WinHex е най-подходящият, но платен; HxD е прост, безплатен, но все още не мога да го накарам да записва промените на диска; DMDE е леко неудобен за потребителя, безплатен и ви позволява да запазвате промените. Като цяло се спрях на HxD.

Като начало си струва да разгледате структурата на FAT16, снимката показва в какъв ред са разположени различните части на файловата система.

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

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

Най-интересните данни са показани в таблицата.

Първото нещо, от което се нуждаем, е да разберем размера на зоната за зареждане. Гледаме адреса 0x0E и виждаме, че 4 сектора са разпределени за зоната за зареждане, т.е. областта FAT започва от адрес 4 * 512 = 0x800.

Броят на FAT таблиците може да се определи от адреса на областта за зареждане 0x10. В нашия пример те са две, защо две, защото всяка таблица се дублира от standby, така че в случай на повреда данните да бъдат възстановени. Размерът на таблицата е посочен на адрес 0x16. По този начин размерът на воала е 512 * 2 * 0xEE = 0x3B800, а основната директория започва от адреса: 0x800 + 0x3B800 = 0x3C000

В главната директория всички елементи са разделени на 32 байта. Първият елемент е етикетът на тома, докато следващите елементи са файлове и папки. Ако името на файла започва с 0xE5, това означава, че файлът е изтрит. Ако името започва с 0x00, това означава, че предишният файл е бил последният.

Получих доста интересна структура на основната директория. Картата беше форматирана напълно, след което бяха създадени 2 текстови файла, които бяха преименувани на MyFile.txt и BigFile.txt.

Както виждате, освен двата ми файла са създадени и куп левичарски, за чийто произход може само да се гадае.

Най-важното нещо, което може да се начертае тук, е адресът на първия клъстер, от който започват данните на нашия файл. Адресът винаги се намира в отместване 0x1A. Например името на нашия файл MyFile.txt се намира на адрес 0x3C100, добавяме 0x1A към него, там виждаме номера на първия клъстер. = 0x0002 т.е. втори клъстер. За файла BigFile.txt данните започват от третия клъстер.

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

Размерът е посочен в сектора за зареждане на 0x11 (2 байта) = 0x0200 * 32 = 0x4000 или 16384 байта.

Нека добавим неговия размер към основния адрес: 3C000 + 4000 = 40000 това е адресът на първия клъстер от данни, но вторият ни трябва, за да намерим MyFile.txt. Броят на секторите в клъстера е 32, размерът на клъстера = 32 * 512 = 16384 или 0x4000, така че към адреса на първия клъстер добавяме неговия размер, т.е. на теория вторият клъстер трябва да започва с 0x44000.

Отиваме на адрес 0x44000 и виждаме, че данните принадлежат на BigFile.txt (в него има просто боклук)

Оказва се, че има лека тънкост, номерирането на клъстерите започва от втория, не е ясно защо се прави това, но е факт, т.е. всъщност се преместихме в третия клъстер. Нека се върнем един клъстер към адрес 0x40000 и да видим очакваните данни.

Сега въпросът е. Защо имаме нужда от FAT таблица? Въпросът е, че данните могат да бъдат фрагментирани, т.е. началото на файла може да бъде в един клъстер, а краят в напълно различен. Освен това това могат да бъдат напълно различни клъстери. Може да има няколко от тях, разпръснати в различни области на данните. FAT е вид карта, която ни казва как да се движим между клъстери.

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

Първите осем байта, 0xF8FFFFFF, са идентификаторът за началото на phat таблицата. След това има 2 байта, които се отнасят до MyFile.txt, фактът, че в тях е записан 0xFFFF означава, че файлът заема само един клъстер. Но следващият файл BigFile.txt започва в третия клъстер, както си спомняме от основната директория, продължава в четвъртия, след това отива на 5,6,7 ... и завършва на 12, т.е. заема 10 клъстера.

Нека проверим дали това наистина е така. Файлът тежи 163kB, т.е. заема 163 000 / (32 * 512) = 9,9 клъстера, което е съвсем както се очаква. Нека повторим още веднъж, че един елемент в таблицата FAT заема 2 байта, т.е. 16 бита, откъдето идва и името FAT16. Съответно максималният адрес е 0xFFFF, т.е. максимален размер за FAT16 0xFFFF * размер на клъстера.

Да преминем към FAT32. Частта на багажника е леко променена.

Има някои фундаментални промени. Името на файловата система е преместено на адрес 0x52, основният размер вече се игнорира. Областта с данни е непосредствено зад таблиците FAT, главната директория е вътре в областта на данните. Освен това главната директория няма фиксиран размер.

Адресът на областта с данни се изчислява:
размер на зареждащия сектор + таблица FAT, в моя случай се оказа:
746496 + (3821056 * 2) = 0x800000

Адресът на основната директория се изчислява:
(номер на първия клъстер на основната директория - 2) * размер на клъстера + адрес на началото на областта с данни,
тези. в този пример той ще съвпада с началото на областта с данни.

Както и преди, данните в корена заемат 32 байта, както и преди "изтритите" магически файлове, предполагам, че това са временни файлове на бележника.

Но началото на първия клъстер в MYFILE.txt вече се определя от два байта, най-старият при отместване 0x14 и най-малкият при отместване 1A. Следователно номерът на първия клъстер от данни за файла ще бъде:
8000A0 + 0x14 = 0x8000B4 - висок байт
8000A0 + 0x1A = 0x8000BA - нисък байт
В моя случай картата беше само с един файл, така че това е третият клъстер.

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

Полезни за масата
F8 FF FF F0 - първи клъстер
FF FF FF 0F - последен клъстер
FF FF FF F7 - повреден клъстер

Къде се намират данните?
начало на областта с данни + размер на клъстера * (номер на коренния клъстер - 1)
= 0x800000 + (2 * 4096) = 0x801000

Дано стана ясно в общи линии, сякаш няма нищо свръхестествено. Който го е чел и повторил може да хапне бисквитка 🙂

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

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

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

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

Структурата на 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, 0x7D;
  • не можете да използвате интервал (0x20) в първия байт на името.

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

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

пристрастие Размер (байтове) Съдържание
0x00 1 Номер на фрагмента
0x01 10 Уникод знаци от името на файла 1-5
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 Идент. № на производителя
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: висок байт - номер на версията,младши - номер на ревизия. Използваната в момента стойност е 0:0 4 Номер на клъстер за първия клъстер от основната директория 2 Номерът на сектора на структурата FSINFO в резервната област на логическия диск 2 Използван номер на сектор (в резервната област на логическия диск).за да съхранявате резервно копие на сектора за зареждане 12 Резервиран (съдържа 0)

пристрастие
0x24
0x28
0x2A
0x2C
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. Структура на стартиращия сектор структура fat_boot_sector:
      • __s8 system_id- системен идентификатор;
      • __u8 sector_size - размер на сектора в байтове;
      • __u8 cluster_size- размерът на клъстера в сектори;
      • __u16 запазен- броят на резервните сектори в свободната зона на дяла;
      • __u8 мазнини- брой FAT копия;
      • __u8 dir_entries- броят на 32-байтовите файлови дескриптори в основната директория;
      • __u8 сектори- броят на секторите на дял; ако това поле е 0, се използва полето total_sect;
      • __u8 медии- вида на носителя, на който е създадена файловата система;
      • __u16 дебела_дължина- размер FAT в сектори;
      • __u32 общо_сект- размер на FAT дяла в сектори (ако секторите на полето == 0).
      • __u32 fat32_length- 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 attr- файлови атрибути;
    • __u8 ctime_ms- това поле посочва времето на създаване на файла до ms (използва се само FAT32);
    • __u16 cвреме- време за създаване на файл (използва се само FAT32);
    • __u16 cdate- дата на създаване на файла (използва се само FAT32);
    • __u16 adate- дата на последния достъп до файла (използва се само FAT32);
    • __u16 starthi- високи 16 бита от номера на първия клъстер на файла (използва се само FAT32);
    • __u16 час, дата, начало- час и дата на създаване на файла, номер на първия клъстер на файла;
    • __u32 размер- размер на файла (в байтове).
  3. Структура на елемент от директорията с дълго име:
    • __u8 id- Номер на артикул;
    • __u8 име0_4- знаци 1 - 5 от името;
    • __u8 attr- файлови атрибути;
    • __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 byte_per_cluster; // размер на клъстера в байтове

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

вътрешност мазнини;

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

int main ()

Int num;

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

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

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

Твърд = отворен (FAT16_PART_NAME, O_RDONLY);

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

Грешка (FAT16_PART_NAME);

Изход (-1);

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

Брой = 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;

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

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

Byte_per_cluster = fbs.cluster_size * 512

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

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

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

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

Printf ("Запазено -% d", fbs.reserved);

Printf ("FATs number -% 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;

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

Ако ((tmp_name_buff [n] == "/") || (tmp_name_buff [n] == "?")) (

I ++;

Пауза;

Tmp_name_buff [n] = "?";

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

< 0) {

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

Връщане -1;

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

Ако (get_dentry (& sn)< 0) {

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

Връщане -1;

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

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

Ако (read_directory (dentry.start)< 0) return -1;

Продължи;

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

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

Start_cluster = dentry.start;

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

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

Ако (n< 0) {

Perror ("отворен");

Връщане -1;

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

За (i = 0; i< num; i++) {

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

< 0) return -1;

< 0) {

Perror ("пишете");

Затвори (n);

Връщане -1;

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

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

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

#endif

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

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

#endif

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

Затвори (n);

Връщане ++ i;

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

Printf ("спри да четеш");

#endif

Върнете i;

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

int read_fbs ()

Ако (прочетете (твърдо, (__ u8 *) & fbs, sizeof (fbs))< 0) return -1;

Връщане 0;

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

int read_fat16 ()

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

Fat16 = (недействителен *) malloc (fat16_size);

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

Ако (! 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 seek = (__u64) (byte_per_cluster) * (cluster_num - 2) + data_start; // изчисляване на отместването към клъстера

< 0) return -1;

Връщане 0;

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

int read_directory (__ u16 start_cluster)

Int i = 1;

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

За (;; i ++) (

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

Ако (! Dir_entry) върне -1;

< 0) return -1;

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

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

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

Fat = отворен ("dir16", O_CREAT | O_WRONLY, 0600);

Напишете (fat, dir_entry, root_size);

Близки (мазнини);

#endif

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

Ако (следващ_клъстер и EOF_FAT16) се повреди;

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

Връщане 0;

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

Int i = 0;

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

за (;; i ++) (

Ако (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Пауза;

Ако (! 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 / включва

ФОНИЯ = чист

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-битовата дума от таблицата:

Търсене = (номер_клъстер * 3) / 2;

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

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

Ако (cluster_num% 2) клъст >> = 4;

Друга група & = 0x0FFF;

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

"xorw %% ax, %% ax"

"btw $ 0, %% cx"

"jnc 1f"

"shrw $ 4, %% dx"

"jmp 2f"

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

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

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

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

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

Обратна група;

Нека се спрем малко повече на самия алгоритъм. Да приемем, че файл е създаден на 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".

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

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

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

Таблицата на дяловете описва местоположението и характеристиките на наличните дялове на твърдия диск. Дисковите дялове могат да бъдат два вида - първични и разширени. Максималният брой първични дялове е четири. Задължително е да имате поне един първичен дял на диска. Разширеният дял може да бъде разделен на голям брой подсекции - логически устройства. Опростена структура на 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 са осем най-малко значими бита от номера на цилиндъра. Това е последвано от системния идентификатор, който идентифицира операционната система за този дял. Идентификаторът е един байт. Зад системния идентификатор се намират координатите на края на секцията - три байта, съдържащи съответно номерата на главата, сектора и цилиндъра. Следващите четири байта са броят на секторите преди дяла, а последните четири байта са размерът на дяла в сектори.

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

структура pt_struct (

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

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

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

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

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

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

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

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

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

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

#включи

#включи

#включи

#включи

#включи

MBR подпис:

#define ПОДПИС 0xAA55

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

#define DEVICE "/ dev / hda"

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

#define PT_SIZE 0x10

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

структурни системни типове (

U8 тип_част;

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

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

структура 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 fat32_size; // размер FAT32

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

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

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

U32 root_cluster; // ROOT cluster - начален коренен клъстер

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

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

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

int main ()

Int брой = 0;

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

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

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

Твърд = отворен (DEV_NAME, O_RDONLY);

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

Грешка (DEV_NAME);

Изход (-1);

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

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

Изход (-1);

Show_pt_info ();

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

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

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

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

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

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

Затвори (твърдо);

Връщане 0;

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

int get_pt_info (int hard)

Int i = 0;

U64 търсене;

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

Read_main_ptable (твърдо);

Ако (check_sign ()< 0) {

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

Връщане -1;

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

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

Ако ((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 *) & sign, (void *) (mbr + 0x1FE), 2);

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

#endif

Ако (знак! = ПОДПИС) върнете -1;

Връщане 0;

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

void read_ext_ptable (int hard, __u64 seek)

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

U8 smbr;

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

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

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

За (;; num ++) (

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

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

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

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

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

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

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

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

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

Ако (! (Pt_t.type_part)) прекъсва;

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

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

Връщане;

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

void show_pt_info ()

Int i = 0, n;

#ifdef ОТГРАНЯВАНЕ НА БЪГИ

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

#endif

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

Ако (! Pt_t [i] .type_part) прекъсва;

Printf ("\ nТип на секция% d -", i);

За (n = 0; n< PART_NUM; n++) {

Ако (pt_t [i] .type_part == i386_sys_types [n] .part_type) (

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

Пауза;

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

Ако (пълен_път! = "/") Връщане -1;

Четем сектора за зареждане:

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

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

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

Memcpy ((void *) & сектори, (void *) fbs.sectors, 2);

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

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

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

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

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:

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

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

Dir_entry = (__u8 *) malloc (byte_per_cluster);

Ако (! Dir_entry) върне -1;

Четем главната директория:

Ако (директория за четене (корен_клъстер)< 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];

Ако ((tmp_name_buff [n] == "/") || (tmp_name_buff [n] == "\ 0")) (

I ++;

Пауза;

Tmp_name_buff [n] = "\ 0";

Ако (split_name (tmp_name_buff, & sn)< 0) {

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

Връщане -1;

Ако (get_dentry (& sn)< 0) {

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

Връщане -1;

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

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

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

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

Ако (директория за четене (начален_клъстер)< 0) return -1;

Продължи;

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

Tmp_buff = (__u8 *) malloc (byte_per_cluster);

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

Ако (n< 0) {

Perror ("отворен");

Връщане -1;

Printf ("първият клъстер на файла - 0x% X ..", start_cluster);

За (i = 0; i< num; i++) {

Memset (tmp_buff, 0, byte_per_cluster);

Ако (read_cluster (start_cluster, tmp_buff)< 0) return -1;

Ако (пишете (n, tmp_buff, byte_per_cluster)< 0) {

Perror ("пишете");

Връщане -1;

Ако (следващ_клъстер == 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);

Ако (! Fat32) върне -1;

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

Връщане 0;

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

int read_cluster (__ u32 cluster_num, __u8 * tmp_buff)

U64 seek = (__u64) (byte_per_cluster) * (cluster_num - 2) + data_start + start_seek;

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:

Ако (read_cluster (start_cluster, dir_entry)< 0) return -1;

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

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

За (;; i ++) (

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

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

Ако (! Dir_entry) върне -1;

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

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

Ако ((следващ_клъстер == 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));

Ако (! (Memcmp (dentry.name, sn-> name, sn-> name_len)) &&

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

Пауза;

Ако (! 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++) {

Ако (! Memcmp (dent.name, name, dent.name_len)) прекъсва;

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 *) & dent, (buff + rec_len), sizeof (dent));

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

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

Ако (! Dent.name_len) върне -1;

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

Ако (! Memcmp (dent.name, name, strlen (name))) break;

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

Rec_len + = dent.rec_len;

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

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

литература:

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

Във връзка с

FAT файлови системи

FAT16

Файловата система FAT16 датира от преди MS-DOS и се поддържа от всички операционни системи на Microsoft за съвместимост. Името му File Allocation Table перфектно отразява физическата организация на файловата система, чиито основни характеристики включват факта, че максималният размер на поддържан том (твърд диск или дял на твърдия диск) не надвишава 4095 MB. В дните на MS-DOS твърдите дискове от 4 GB изглеждаха като невероятна мечта (20-40 MB бяха лукс), така че този марж беше напълно оправдан.

Том, форматиран за използване на FAT16, е разделен на клъстери. Размерът на клъстера по подразбиране зависи от размера на тома и може да варира от 512 байта до 64 KB. Таблица Фигура 2 показва как размерът на клъстера зависи от размера на обема. Имайте предвид, че размерът на клъстера може да бъде различен от стандартния, но трябва да бъде една от стойностите, показани в таблицата. 2.

Не се препоръчва използването на файловата система FAT16 на обеми по-големи от 511 MB, тъй като дисковото пространство ще се използва изключително неефективно за относително малки файлове (файл от 1 байт ще заеме 64 KB). Независимо от размера на клъстера, файловата система FAT16 не се поддържа за обеми по-големи от 4 GB.

FAT32

Започвайки с Microsoft Windows 95 OEM Service Release 2 (OSR2), към Windows беше добавена поддръжка на 32-битова FAT. За системи, базирани на Windows NT, тази файлова система се поддържа за първи път в Microsoft Windows 2000. Докато FAT16 може да поддържа обеми до 4GB, FAT32 може да обработва обеми до 2TB. Размерът на клъстера във FAT32 може да варира от 1 (512 байта) до 64 сектора (32 KB). Стойностите на клъстера FAT32 изискват 4 байта за съхранение (32 бита, а не 16, както в FAT16). Това означава по-специално, че някои файлови помощни програми, предназначени за FAT16, не могат да работят с FAT32.

Основната разлика между FAT32 и FAT16 е, че размерът на логическия дял на диска се е променил. FAT32 поддържа обеми до 127GB. В същото време, ако използването на FAT16 с 2 GB дискове изисква 32 KB клъстер, то във FAT32 клъстер от 4 KB е подходящ за дискове от 512 MB до 8 GB (Таблица 4).

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

Когато използвате FAT32, максималният размер на файла може да бъде до 4 GB минус 2 байта. Докато се използва FAT16, максималният брой записи в основната директория беше ограничен до 512, след това FAT32 позволява този брой да бъде увеличен до 65 535.

FAT32 налага ограничения върху минималния размер на тома - той трябва да бъде най-малко 65 527 клъстера. В същото време размерът на клъстера не може да бъде такъв, че FAT да заема повече от 16 MB – 64 KB / 4 или 4 милиона клъстера.

Когато използвате дълги имена на файлове, данните, необходими за достъп от FAT16 и FAT32, не се припокриват. Когато се създаде файл с дълго име на файл, Windows създава съответно име 8.3 и един или повече записа в директорията за съхраняване на дългото име (13 знака от дългото име на файла за всяко събитие). Всяко следващо събитие съхранява съответната част от името на файла във формат Unicode. Такива записи имат атрибутите "идентификатор на тома", "само за четене", "система" и "скрит" - набор, който се игнорира от MS-DOS; в тази операционна система файлът е достъпен от неговия "псевдоним" във формат 8.3.

Файлова система NTFS

Microsoft Windows 2000 включва поддръжка за новата версия на файловата система NTFS, която по-специално осигурява работа с директорийни услуги на Active Directory, точки за повторна обработка, инструменти за информационна сигурност, контрол на достъпа и редица други функции.

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

Когато файловата система NTFS е изградена, формататорът създава файл с основна файлова таблица (MTF) и други области за съхранение на метаданни. Метаданните се използват от NTFS за реализиране на файловата структура. Първите 16 записа в MFT са запазени от самата NTFS. Местоположението на файловете с метаданни $ Mft и $ MftMirr се записва в сектора за зареждане на диска. Ако първият запис в MFT е повреден, NTFS чете втория запис, за да намери копие на първия. Пълно копие на сектора за зареждане се намира в края на тома. Таблица 6 изброява основните метаданни, съхранявани в MFT.

Останалите MFT записи съдържат записи за всеки файл и директория, разположени в даден том.

Обикновено един файл използва един запис в MFT, но ако файлът има голям набор от атрибути или стане твърде фрагментиран, тогава може да са необходими допълнителни записи за съхраняване на информация за него. В този случай първият запис във файла, наречен основен запис, съхранява местоположението на другите записи. Малките файлове и директории (до 1500 байта) се съдържат изцяло в първия запис.

Файлови атрибути в NTFS

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

Ако файловите атрибути се вписват във файлов запис, те се наричат ​​резидентни атрибути. Тези атрибути винаги са името на файла и датата на създаването му. В случаите, когато информацията за даден файл е твърде голяма, за да се побере в един MFT запис, някои от атрибутите на файла стават нерезидентни. Резидентните атрибути се съхраняват в един или повече клъстери и представляват поток от алтернативни данни за текущия обем (повече за това по-долу). NTFS създава атрибут Attribute List, за да опише местоположението на резидентни и нерезидентни атрибути.

Таблица 7 показва основните файлови атрибути, дефинирани в NTFS. Този списък може да бъде разширен в бъдеще.

Файлова система CDFS

Windows 2000 осигурява поддръжка за файловата система CDFS, която отговаря на стандарта ISO'9660 за местоположението на информация на CD-ROM. Дългите имена на файлове се поддържат според ISO'9660 ниво 2.

Когато създавате CD-ROM за използване под Windows 2000, имайте предвид следното:

  • всички имена на директории и файлове трябва да са по-малко от 32 знака;
  • всички имена на директории и файлове трябва да съдържат само главни букви;
  • дълбочината на директорията не трябва да надвишава 8 нива от корена;
  • използването на разширения за имена на файлове не е задължително.

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

Microsoft Windows 2000 може да използва FAT16, FAT32, NTFS или техните комбинации. Изборът на операционна система зависи от следните критерии:

  • как се използва компютърът;
  • хардуерна платформа;
  • размера и броя на твърдите дискове;
  • информационна сигурност

FAT файлови системи

Както може би сте забелязали, числата в имената на файловите системи - FAT16 и FAT32 - показват броя на битовете, необходими за съхраняване на информация за номерата на клъстерите, използвани от файла. Така че във FAT16 се използва 16-битово адресиране и съответно е възможно да се използват до 2-16 адреса. В Windows 2000 първите четири бита от таблицата за местоположение на файловете FAT32 са необходими за тяхна собствена употреба, така че във FAT32 броят на адресите достига 2 28.

Таблица 8 показва размерите на клъстерите за файлови системи FAT16 и FAT32.

В допълнение към значителните разлики в размера на клъстера, FAT32 също така позволява на главната директория да се разшири (FAT16 ограничава броя на записи до 512 и дори може да бъде по-нисък при използване на дълги имена на файлове).

Предимства на FAT16

Сред предимствата на FAT16 са следните:

  • файловата система се поддържа от MS-DOS, Windows 95, Windows 98, Windows NT, Windows 2000, както и някои операционни системи UNIX;
  • има голям брой програми, които ви позволяват да коригирате грешки в тази файлова система и да възстановите данни;
  • ако има проблеми със зареждането от твърдия диск, системата може да се зареди от флопи диск;
  • тази файлова система е достатъчно ефективна за обеми под 256 MB.
Недостатъци на FAT16

Основните недостатъци на FAT16 включват:

  • основната директория не може да съдържа повече от 512 записа. Използването на дълги имена на файлове драстично намалява броя на тези елементи;
  • FAT16 поддържа максимум 65 536 клъстера и тъй като някои клъстери са запазени от операционната система, броят на наличните клъстери е 65 524. Всеки клъстер е с фиксиран размер за даден LUN. Когато максималният брой клъстери бъде достигнат при максималния им размер (32 KB), максималният поддържан обем е 4 GB (под Windows 2000). За да се поддържа съвместимост с MS-DOS, Windows 95 и Windows 98, обемът под FAT16 не трябва да надвишава 2 GB;
  • FAT16 не поддържа вградена защита и компресиране на файлове;
  • големите дискове се губят с много място чрез използване на максималния размер на клъстера. Мястото за файла се разпределя въз основа на размера не на файла, а на клъстера.
Предимства на FAT32

Сред предимствата на FAT32 са следните:

  • разпределението на дисковото пространство е по-ефективно, особено за големи дискове;
  • главната директория във FAT32 е редовна верига от клъстери и може да се намира навсякъде на диска. Поради това FAT32 не налага никакви ограничения върху броя на елементите в основната директория;
  • поради използването на по-малки клъстери (4 KB на дискове до 8 GB), заетото дисково пространство обикновено е с 10-15% по-малко, отколкото при FAT16;
  • FAT32 е по-надеждна файлова система. По-специално, той поддържа възможността за преместване на основната директория и използване на резервно копие на FAT. Освен това записът за зареждане съдържа редица данни, които са критични за файловата система.
Недостатъци на FAT32

Основните недостатъци на FAT32:

  • размерът на тома при използване на FAT32 под Windows 2000 е ограничен до 32 GB;
  • FAT32 томовете не са достъпни от други операционни системи - само от Windows 95 OSR2 и Windows 98;
  • Архивиране на сектора за стартиране не се поддържа;
  • FAT32 не поддържа вградена защита и компресиране на файлове.

Файлова система NTFS

Когато работите в Windows 2000, Microsoft препоръчва форматиране на всички дялове на твърдия диск за NTFS, с изключение на онези конфигурации, когато се използват няколко операционни системи (с изключение на Windows 2000 и Windows NT). Използването на NTFS вместо FAT ви позволява да използвате функциите, налични в NTFS. Те включват по-специално:

  • възможността за възстановяване. Тази възможност е вградена във файловата система. NTFS гарантира безопасността на данните поради факта, че използва протокола и някои алгоритми за възстановяване на данни. В случай на системна повреда, NTFS използва протокола и допълнителна информация за автоматично възстановяване на целостта на файловата система;
  • компресиране на информация. За NTFS томове, Windows 2000 поддържа компресиране на отделни файлове. Такива компресирани файлове могат да се използват от Windows приложения без предварително разопаковане, което се случва автоматично при четене от файл. Когато се затвори и запази, файлът се компресира отново;
  • в допълнение могат да се подчертаят следните предимства на NTFS:

Някои функции на операционната система изискват NTFS;

Скоростта на достъп е много по-висока - NTFS минимизира броя на достъпите до диска, необходими за намиране на файл;

Защита на файлове и директории. Само на NTFS томове е възможно да зададете атрибути за достъп до файлове и папки;

Когато се използва NTFS, Windows 2000 поддържа обеми до 2 TB;

Файловата система поддържа резервно копие на сектора за зареждане — той се намира в края на тома;

NTFS поддържа шифрованата файлова система (EFS), която предпазва от неоторизиран достъп до файловото съдържание;

С помощта на квоти можете да ограничите количеството дисково пространство, което потребителите използват.

Недостатъци на NTFS

Говорейки за недостатъците на файловата система NTFS, трябва да се отбележи, че:

  • NTFS томовете не са налични в MS-DOS, Windows 95 и Windows 98. В допълнение, редица функции, които са внедрени в NTFS под Windows 2000, не са налични в Windows 4.0 и по-стари;
  • малки томове, съдържащи много малки файлове, може да изпитат влошаване на производителността в сравнение с FAT.

Файлова система и скорост

Както вече разбрахме, за малки обеми FAT16 или FAT32 осигуряват по-бърз достъп до файлове в сравнение с NTFS, защото:

  • FAT има по-проста структура;
  • размерът на директориите е по-малък;
  • FAT не поддържа защита на файлове от неоторизиран достъп - системата не трябва да проверява разрешенията за файлове.

NTFS минимизира броя на достъпа до диска и времето, необходимо за намиране на файл. Освен това, ако директорията е достатъчно малка, за да се побере в един MFT запис, целият запис се чете наведнъж.

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

Когато се сравнява скоростта на операциите, извършвани за директории, съдържащи кратки и дълги имена на файлове, трябва да се има предвид, че скоростта на операциите за FAT зависи от самата операция и размера на директорията. Ако FAT търси несъществуващ файл, той търси в цялата директория - тази операция отнема повече време от търсенето в B-дървото на NTFS. Средното време, необходимо за намиране на файл, се изразява като функция от N / 2 в FAT и log N в NTFS, където N е броят на файловете.

Редица от следните фактори влияят върху скоростта на четене и запис на файлове под Windows 2000:

  • фрагментация на файла. Ако файлът е силно фрагментиран, NTFS обикновено изисква по-малко достъпи до диск от FAT, за да намери всички фрагменти;
  • размер на клъстера. И за двете файлови системи размерът на клъстера по подразбиране зависи от размера на тома и винаги се изразява като степен 2. Адресите във FAT16 са 16-битови, във FAT32 - 32-битови, в NTFS - 64-битови;
  • Размерът на клъстера по подразбиране във FAT се основава на факта, че таблицата за местоположение на файла може да има максимум 65 535 записа - размерът на клъстера е функция на обема, разделен на 65 535. По този начин размерът на клъстера по подразбиране за FAT том винаги е по-голям . от размера на клъстера за NTFS том със същия размер. Имайте предвид, че по-големият размер на клъстера за FAT томовете означава, че FAT томовете могат да бъдат по-малко фрагментирани;
  • местоположение на малки файлове. Когато използвате NTFS, малките файлове се съдържат в MFT записа. Размерът на файл, който се вписва в един MFT запис, зависи от броя на атрибутите в този файл.

Максимален размер на NTFS томовете

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

Едно такова ограничение е таблицата на дяловете. Индустриалните стандарти ограничават размера на таблицата за дялове 2 до 32 сектора. Друго ограничение е размерът на сектора, който обикновено е 512 байта. Тъй като размерът на сектора може да се промени в бъдеще, текущият размер дава ограничение за размера на един том - 2 TB (2 32 x 512 байта = 2 41). По този начин 2 TB е практическо ограничение за физически и логически обеми на NTFS.

Таблица 11 показва основните ограничения на NTFS.

Контрол на достъпа до файлове и директории

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

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

Под FAT16 и FAT32 също е възможно да зададете файлови атрибути, но те не предоставят разрешения за файлове.

Версията на NTFS, използвана в Windows 2000, въвежда нов тип разрешение за достъп - наследени разрешения. Разделът Защита съдържа опцията Разрешаване на наследствени разрешения от родител да се разпространяват към този файлов обекткойто е активен по подразбиране. Тази опция значително намалява времето, необходимо за промяна на правата за достъп до файлове и поддиректории. Например, за да промените правата за достъп до дърво, съдържащо стотици поддиректории и файлове, просто активирайте тази опция - в Windows NT 4 трябва да промените атрибутите на всеки отделен файл и поддиректория.

На фиг. 5 показва диалоговия прозорец Свойства и раздела Защита (Разширени раздел) - изброява разширените разрешения за файлове.

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

Компресиране на файлове и директории

Windows 2000 поддържа компресиране на файлове и директории, разположени в NTFS томове. Компресираните файлове са достъпни за четене и запис от всяко приложение на Windows. За това не е необходимо първо да ги разопаковате. Използваният алгоритъм за компресиране е подобен на този, използван в DoubleSpace (MS-DOS 6.0) и DriveSpace (MS-DOS 6.22), но има една съществена разлика - при MS-DOS се компресира цял първичен дял или логическо устройство, докато под NTFS можете да опаковате отделни файлове и директории.

Алгоритъмът за компресия в NTFS е проектиран да поддържа клъстери с размер до 4KB. Ако размерът на клъстера е по-голям от 4 KB, функциите за компресиране на NTFS стават недостъпни.

Самовъзстановяващ се NTFS

Файловата система NTFS се самовъзстановява и може да поддържа своята цялост чрез използването на протокола за извършени действия и редица други механизми.

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

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

В този преглед ние разгледахме различните файлови системи, поддържани в Microsoft Windows 2000, обсъдихме структурата на всяка от тях, отбелязахме техните предимства и недостатъци. Най-обещаващата файлова система е NTFS, която има голям набор от функции, които не са налични в други файлови системи. Новата версия на NTFS, поддържана от Microsoft Windows 2000, има още повече функционалност и затова се препоръчва за използване при инсталиране на операционната система Win 2000.

ComputerPres 7 "2000 г