Загальна характеристика системи FAT
Система FAT була розроблена для ОС MS-DOS. Це проста файлова система з сегментованим розміщенням, без багатокористувацької захисту. Структура каталогів - деревоподібна, причому на кожному дисковому томі створюється окреме дерево. Для вказівки місця розташування файлу може використовуватися його повне ім'я. що містить букву диска, шлях по дереву каталогів і власне ім'я файлу, наприклад: «C: \ UTILS \ ARCH \ RAR.EXE».
В ОС Windows також можливе використання FAT, особливо виправдане для дискет. Для жорстких дисків великого обсягу система FAT стає малоефективною і поступово витісняється більш потужною системою NTFS.
Структури даних на диску
При форматуванні дискети або розділу жорсткого диска в системі FAT все дисковий простір розбивається на наступні області, показані на рис. 3 # 8209; 2.
· BOOT-сектор містить основні кількісні параметри дискового тому і файлової системи, а також може містити програму початкового завантаження ОС.
· Таблиця FAT (File Allocation Table) - містить інформацію про розміщення файлів і вільного місця на диску. З огляду на критичну важливість цієї таблиці вона завжди зберігається в двох примірниках, які мають бути ідентичні [4]. Кожна операція, яка зраджує вміст FAT, повинна однаковим чином змінювати обидва примірника.
· ROOT - кореневої каталог системи, що містить дані про файлах і про підкаталогах верхнього рівня, кожен з яких в свою чергу може містити файли і підкаталоги.
· Область даних - масив кластерів, що містить всі файли і все каталоги (крім кореневого).
Розглянемо докладно, як зберігається вся інформація про фото, наявна в системі FAT.
При створенні файлу в одному з каталогів файлової системи створюється запис, що зберігає основний обсяг інформації про цей файл. Кожен каталог, крім кореневого, також є файлом особливого виду, і запис про нього міститься в батьківському каталозі. Каталожна запис завжди займає 32 байта, її структура показана в табл. 3.1.
Структура запису каталогу файлової системи FAT
Розмір поля (в байтах)
Як видно з таблиці, ім'я файлу може займати не більше 8 символів плюс ще 3 символи розширення. На початку 80-х років здавалося, що цього цілком достатньо. Пізніше це обмеження охрестили «прокляттям 8 + 3», і позбавити від нього файлову систему FAT вдалося тільки в Windows 95.
Байт атрибутів містить набір бітів, що характеризують властивості файлу. Поряд з практично марними атрибутами «прихований», «системний» і «архівний», там містяться і важливі: «тільки для читання», «каталог» і «мітка тому». Атрибут «тільки для читання» забороняє системі видаляти файл або відкривати його для запису. Атрибут «каталог» означає, що даний запис описує не звичайний файл, а каталог. Атрибут «мітка тому» може міститися тільки в кореневому каталозі, такий запис не описує жодної файл, а замість цього містить в полях імені та розширення 11-символьну мітку (ім'я), присвоєну даному дисковому тому.
В цілому, запис каталогу містить майже всі, що системі відомо про фото, а якщо розмір файлу не перевищує одного кластера, то повністю все. Якщо ж файл містить більше одного кластера, то номери інших можна знайти в таблиці FAT.
Таблиця FAT складається з записів, кількість яких дорівнює кількості кластерів в області даних, а розмір одного запису може бути дорівнює 12, 16 або 32 бітам. Відповідно говорять про різновиди файлової системи FAT-12, FAT-16 або FAT-32. Розмір запису повинен бути таким, щоб в ній можна було записати максимальний номер кластера. Наприклад, для стандартної тридюймової дискети ємністю 1.44 Мб досить використовувати FAT-12, оскільки це дозволяє мати 2 12 = 4096 кластерів (насправді, трохи менше), і навіть при кластерах розміром в 1 сектор (512 байт) цього більш ніж достатньо: 4096 '512 = 2 Мб.
Записи FAT «з історичних причин» нумеруються, починаючи з 2 і закінчуючи максимальним номером кластера, кожен запис FAT описує відповідний кластер з тим же номером. Запис може набувати таких значень:
· Якщо кластер належить деякому файлу (або каталогу) і є останнім (або єдиним) в цьому файлі, то запис FAT містить спеціальне значення - все одиниці (FFF16 для FAT-12 або FFFF16 для FAT-16);
· Якщо кластер належить деякому файлу (або каталогу), але не є останнім у файлі, то запис FAT містить номер наступного кластера того ж файлу;
· Якщо кластер вільний, то запис містить всі нулі;
· Якщо кластер дефектний (тобто при перевірці диска з'ясувалося, що даний кластер містить хоча б один дефектний сектор), то запис містить спеціальне значення FF716 для FAT-12 або FFF716 для FAT-16.
Тепер ми знаємо, яким чином в системі FAT зберігається інформація про розміщення сегментированного файлу. Номер першого кластера файлу зберігається в записі каталогу, а решта кластери можна послідовно визначити по записах таблиці FAT.
У кожному каталозі, крім кореневого, перші два записи містять спеціальні імена: ім'я «.» Означає сам даний каталог, ім'я «..» - батьківський каталог.
Створення та видалення файлу
Щоб завершити вивчення структур даних системи FAT, розглянемо, як змінюються ці структури при операціях створення і видалення файлу.
Коли ОС виконує функцію створення файлу з заданим ім'ям в заданому каталозі, то вона, перш за все, знаходить даний каталог в дереві каталогів файлової системи. (Як вона його знаходить - опустимо для стислості. Спробуйте розібратися самі.) Прочитавши каталог, система перевіряє, чи немає в ньому вже записи з заданим ім'ям (тобто чи немає вже такого файлу). Якщо є, то чи не встановлений у цього файлу атрибут «тільки для читання»? Якщо встановлено, то новий файл створений бути не може, попередньо треба зняти атрибут. Якщо не встановлено, то старий файл видаляється. Потім система знаходить в каталозі вільну запис. Якщо в каталозі немає вільного місця, то він може бути збільшений ще на один кластер, цей факт відбивається в таблиці FAT. Нарешті, знайшовши вільне місце, система заповнює поля записи про новий файл: його ім'я і розширення, дату і час останньої зміни, атрибути. Розмір і номер першого кластера встановлюються нульовими, тому що файл поки що не містить даних.
Надалі, при виконанні першої операції записи в файл, система знайде будь-який вільний кластер по таблиці FAT, відзначить його в FAT як останній кластер файлу, заповнить номер першого кластера в каталожної записи, виконає запис і занесе кількість записаних байт в поле розміру файлу в каталозі .
При видаленні файлу насамперед по каталожної записи перевіряється, чи можна його видалити (чи не встановлений атрибут «тільки для читання»), а потім робляться дві речі:
· Перший байт імені файлу, що видаляється замінюється на спеціальний символ з кодом E516 (він відображається як російська буква «х»; ймовірно, розробники системи FAT вважали, що цей код не може зустрітися в імені файлу);
· Всі записи таблиці FAT, відповідні кластерам файлу, що видаляється, заповнюються нулями, тобто кластери оголошуються вільними.
Як видно з описаної процедури, в момент видалення файлу його дані не стираються з диска, проте інформація про розміщення файлу псується. Якщо розмір файлу перевищував один кластер, то немає гарантії, що його вдасться відновити в разі ненавмисного видалення, навіть якщо користувач схаменеться відразу ж.
Робота з файлами в MS-DOS
Для роботи з файлами і каталогами системи FAT в MS-DOS передбачений досить багатий набір функцій. Всі вони викликаються за допомогою команди програмного переривання int 21h, а конкретна функція визначається числом, занесеним до реєстру AH. Ці функції дозволяють, зокрема:
· Створювати файл, вказуючи його повне ім'я;
· Змінювати атрибути файлу;
· Перейменовувати файл або переміщати його в інший каталог того ж диска [5];
· Шукати в заданому каталозі всі файли, імена яких відповідають заданим шаблоном (наприклад, шаблоном «XYZ. C *» відповідають всі файли, імена яких починаються з «XYZ» і містять рівно 5 символів, а розширення починається з букви «C»);
· Створювати і видаляти каталоги;
· Задавати поточний диск і поточний каталог;
· Відкривати файл, отримуючи доступ до його даних, і закривати файл.
У MS-DOS існує два різних набору функцій, що дозволяють працювати з даними файлів. Один з них, заснований на використанні блоку управління файлом (FCB), навряд чи кимось використовувався в останні 20 років, однак зберігається з міркувань сумісності з версією MS-DOS 1.0. Загальноприйнятий метод роботи з файлами заснований на використанні хендлом [6].
Хендл - це деяке число, яке система повертає користувача програмі при вдалому виконанні операції відкриття або створення файлу. Значення цього числа не грає ролі для програми. Важливо лише те, що при наступних зверненнях до відкритого файлу програма повинна передавати цей хендл системі як покажчик на цей файл.
MS-DOS надає цілком достатній набір функцій для роботи з відкритими файлами. Сюди включаються функції читання і запису довільного числа байт, функція переміщення покажчика в довільну точку файлу, функції установки і зняття блокування фрагментів файлу, примусового очищення кеш-буферів файлу (зазвичай очищення виконується тільки при закритті файлу або при нестачі буферів, см. П.2.6 .6; примусове очищення гарантує негайне збереження змін на диску).
При виконанні функції відкриття файлу можна замість імені файлу вказати ім'я будь-якого символьного пристрою, наприклад, «PRN:». При цьому також повертається хендл, з яким можна виконувати операції запису так само, як якщо б цей хендл вказував на дисковий файл. Зрозуміло, не можна відкрити принтер для читання, а також не можна виконувати переміщення покажчика назад.
При запуску будь-якої програми вона отримує «в подарунок» від MS-DOS п'ять уже відкритих хендлом з номерами від 0 до 4. З них найбільш важливими є хендл 0, який за визначенням вказує на стандартне введення програми, і хендл 1 - стандартний висновок. Хендл 2 означає стандартний пристрій для виведення повідомлень про помилки, хендл 3 - стандартний пристрій послідовного введення / виводу (COM-порт), хендл 4 - стандартний принтер.
Вище, в п. 2.2, давалося інше визначення стандартного введення і виведення, як пристроїв, що використовуються «за замовчуванням». Тут немає протиріччя. Компілятори мов програмування, зустрічаючи виклики процедур введення / виведення без вказівки файлу, транслюють їх в виклики системних функцій MS-DOS з хендлом, відповідно, 0 або 1.
Якщо програма запускається з командного рядка MS-DOS, то зазвичай хендл 0 вказує на клавіатуру (точніше, на пристрій CON :), а хендл 1 - на екран монітора (теж пристрій CON. Але працює на висновок). Однак користувач може використовувати символи перенаправлення стандартного введення (знак «<») и вывода (знаки «>»І« >> »). Наприклад, програма, запущена за допомогою команди «MY_PROG
Перенаправлення стандартного введення і виведення може бути виконано і програмою користувача. Зазвичай це робиться перед тим, як дана програма запускає якусь іншу програму, передаючи їй переслані стандартні хендлом.
Структури даних в пам'яті
Для забезпечення доступу до відкритих файлів MS-DOS використовує системні таблиці двох типів.
Таблиця SFT (System File Table) містить записи про всіх файлах, в даний момент відкритих програмами користувача і самої ОС. Ця таблиця зберігається в системній пам'яті, число записів в ній визначається параметром FILES в файлі конфігурації CONFIG.SYS, але не може перевищувати 255.
Якщо один і той же файл був відкритий кілька разів (неважливо, однією і тією ж програм ой або різними програмами), то для нього буде кілька записів в SFT.
Кожен запис містить детальну інформацію про фото, достатню для виконання операцій з ним. Зокрема, в запису SFT містяться:
· Копія каталожної інформації про фото;
· Поточне положення вказівника читання / запису;
· Режим доступу, заданий при відкритті.
Крім того, у записі SFT міститься значення лічильника посилань на даний запис з усіх таблиць JFT, мова про які піде нижче. Коли цей лічильник стає рівним нулю, запис SFT стає вільною, оскільки файл закритий.
На відміну від єдиної SFT, таблиці JFT (Job File Table) створюються для кожної програми, що запускається, тому одночасно може існувати кілька таких таблиць. (А звідки в однозадачной MS-DOS можуть взятися одночасно кілька програм? Найпростіша відповідь: коли одна програма запускає іншу, то в пам'яті присутні обидві. Детальніше див. П. 4.4.3.) Таблиця JFT має найпростішу структуру: вона складається з однобайтових записів , причому значення кожного запису є індекс (номер запису) в таблиці SFT. Невикористані записи містять значення FF16. Розмір таблиці за замовчуванням становить 20 записів (байт), але може бути збільшений до 255.
Тепер про хендлом. Прикладна програма використовує хендлом як деякі умовні номери відкритих файлів, конкретне значення хендлом при цьому не має ніякого значення (за зрозумілим винятком стандартних хендлом з 0 по 4). Насправді ж значення хендлом являє собою не що інше, як індекс записи в таблиці JFT даної програми. Перший запис таблиці відповідає хендлом 0.
На рис. 3 # 8209; 3 показано зв'язок між хендлом, таблицями JFT, таблицею SFT і відкритими файлами / пристроями.
У прикладі, показаному на малюнку, стандартні хендлом процесу A використовуються так, як це за замовчуванням робить MS-DOS: хендлом 0, 1 і 2 вказують на запис SFT, відповідну консольного пристрою CON, хендл 3 - на запис про влаштування COM1, хендл 4 -на запис про принтер. У процесу B стандартний висновок перенаправлений на принтер, що відображено в значенні елемента 1 з JFT цього процесу. Хендлом 3 і 4 для процесу B не показані, щоб не захаращувати малюнок. Решта показані на малюнку елементи JFT обох процесів вказують на записи SFT, що описують відкриті файли на дисках.
Зауважимо, що з файлом PICTURE.BMP пов'язані два записи в таблиці SFT. Це означає, що даний файл був відкритий в кожному процесі окремо (але, очевидно, з використанням одного з режимів поділу файлу).
У чому сенс такої двоступеневої схеми? Чи не простіше було, щоб хендл вказував безпосередньо на запис SFT? Можна привести, принаймні, два очевидних аргументу на користь застосування JFT.
· Використання JFT дає можливість відокремити логічне поняття стандартного пристрою (зокрема, стандартний ввід - хендл 0 і стандартний висновок - хендл 1) від конкретних пристроїв. Перенаправлення стандартних пристроїв виконується шляхом зміни значень відповідних елементів JFT.
Нові версії системи FAT
У Windows 95 було подолано прикре обмеження довжини імені файлу - знамените правило «8 + 3». Здавалося б, при розмірі записи каталогу в 32 байта важко сподіватися на довгі імена файлів. Проте, було знайдено забавне рішення цієї проблеми.
Розробники з Microsoft звернули увагу, що ті записи каталогу, в яких зустрічається безглузда комбінація бітових атрибутів «прихований + системний + тільки читання + мітка тому», просто-напросто ігноруються як системними програмами MS-DOS, так і поширеними утилітами інших розробників. Це дало можливість використовувати записи з такою комбінацією для зберігання довгого імені файлу. Як і раніше для кожного файлу в каталозі є основний запис в звичайному, старому форматі, що містить атрибути файлу, номер першого кластера і обов'язкове «короткий» ім'я. Однак якщо користувач при створенні файлу вказує ім'я, що не вкладається в стандарт «8 + 3» або містить малі літери, то перед основним записом буде вставлено потрібну кількість додаткових записів з розбитим на шматочки «довгим ім'ям» в кодуванні UNICODE (по 2 байта на символ , що дозволяє використовувати будь-який відомий алфавіт). Довжина імені, згідно з документацією, може досягати 255 символів (насправді, трохи менше).
Починаючи з Windows 98, з'явилася можливість використовувати новий різновид файлової системи - FAT-32. Її відмінність від FAT-12 і FAT-16 полягає не тільки в більшій розрядності номера кластера (хоча і це дуже важливо для великих дисків), але і в тому, що Microsoft нарешті зважилася використовувати 10-байтовий резерв, який невідомо для яких цілей зберігався незайнятим в кожного запису каталогу. Завдяки цьому з'явилася можливість додати до дати / часу останньої модифікації файлу ще два тимчасових штампа: дату / час створення (насправді, це дата / час останнього зміни каталожної записи) і дату останнього доступу до файлу.