Смекни!
smekni.com

Програма для роботи з файловою системою (стр. 2 из 3)

Додаткові копії FAT є резервними й використаються в випадку ушкодження первинної FAT; типові гнучкі й жорсткі диски тримають звичайно 2 FAT. Ці таблиці розташовуються послідовно за сектором початкового завантаження, а між ними іноді є резервна копія. Як правило, MS DOS використає первинну FAT, однак, при появлені в ній змін коректуються всі таблиці. Крім того, MS DOS порівнює всі таблиці при першому звертанні до диска, щоб переконатися, що вони відповідають один одному.

MS DOS підтримує два типи FAT: один використає 12-бітові посилання; іншої застосовується у версії 3.0 для включення в більші фіксовані диски більше 4087 кластерів і використає 16-бітові посилання.

Два перших входи FAT завжди резервуються й містять копію дескриптора носія даних (1 байт) і два (для 12-бітової FAT) або три (для 16-бітової FAТ) байти OFFH, як показано на прикладі наступних дампів перших 16 байтів FAT:

12-бітова FAT:

F9 FF FF 03 40 00 FF 6F-00 07 F0 FF 00 00 00 00

16-бітова FAT:

F8 FF FF FF 03 00 40 00-FF FF 06 00 07 00 FF FF

Інші входи FAT перебувають у взаємо-однозначній відповідності с кластерами в області файлів даних. Стан кожного кластера відмічається відповідним значенням в FAT (програма FORMAT спочатку позначає вхід FAT для кожного кластера, як вільний). Стан кластера може приймати одне з наступних значень:

Якщо вхід FAT містить ненульове значення, що відповідає кластер вже зайнятий. Вільний кластер можна знайти, скануючи FAT з початку до виявлення першого нульового значення. Дефектні кластери звичайно идентифицируются в процесі форматування. На мал.3-8 зображена типова ланцюжок FAT.

Вільні входи FAT містять нульове значення посилання; одиниця, як значення посилання, ніколи не використається. Таким чином, першим номером посилання, пов'язаним з першим доступним кластером в області файлів даних, є 2; цей номер ставиться до першого фізичного кластеру в області файлів даних. На мал.3-9 показаний зв'язок між файлами, входи FAT і кластери в області файлів даних.

Не існує логічного розходження між обробкою 12-бітових й 16-бітових входів FAT; розходження ставляться тільки до пам'яті й методів доступу. Оскільки процесор 8086 особливо призначений для эфективний обробки 8- або 16-бітових величин, то процедура доступу для 12-бітової FAT є більше складної, чим для 16-бітової.

_____________________________________________________________________

12-бітовий 16-бітовий Значення |

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і|

000H 0000H Вільний кластер |

001H 0001H Код не використається |

FF0-FF6H FFF0-FFF6H Резерв |

FF7H FFF7H Дефектний кластер |

(не використається) |

FF8-FFFH FFF8-FFFFH Останній кластер в |

файлі |

Всі інші значення Посилання на наступний |

кластер у файлі |

____________________________________________________________________|

Вхід FAT

0 1 2 3 4 5 6 7 8 9

___________________________________________________________________

| FFDH| FFFH| 003H| 005H| FF7H| 006H| FFFH| 000H| 000H| 000H|

| 4093| 4095| 3 | 5 | 4087| 6 | 4095| 0 | 0 | 0 |

|___________________________________________________________|______

| | | |

| | | |

| | | |

| | | |__ не використаний:

| | | доступний кластер

| | |

| | |_____ використати не можна

| |

| |______ не використається: не доступний

|

|

|______ диск двосторонній з подвійною щільністю

Розподіл пам'яті в FAT для типового диска MS DOS

FAT є високоефективною "бухгалтерською" системою, однак тут можуть виникнути різні проблеми й необхідність компромісних рішень. Одна із проблем пов'язана з наявністю частково заповненого кластера наприкінці файлу. При цьому виникає проблема ефективності, пов'язана з використанням кластера більшого розміру, коли відбувається виділення цілого кластера, незалежно від числа содержащихся в ньому байтів. Наприклад, десять 100-байтовых файлів на диску із кластерами розміром по 16 Кбайт, займає 160 Кбайт дискової пам'яті; ті ж файли на диску із кластерами розміром 1 Кбайт займають тільки 10 Кбайт – різниця становить 150 Кбайт, що означає зменшення обсягу пам'яті в 15 разів при використанні кластерів меншого розміру. З іншого боку, програма для 12-бітової FAT, показана на мал.3-10, демонструє складність (а отже, низьку швидкість) переміщення у великому файлі, які мають довгий список посилань між невеликими кластерами. Таким образом, необхідно враховувати характер даних: додатка більших баз даних працюють ефективніше всього із кластерами більшого розміру; використовують кластери меншого розміру, можна розмістити на диску безліч невеликих текстових файлів драйвер, що розробляє, для дискового програміст звичайно встановлює розмір кластера).

Внаслідок відключення електроенергії або безладного виконання програм виникають проблеми руйнування каталогів або таблиць розміщення файлів, які , не будучи виправлені, можуть привести до більше серйозним проблемам. Програма MS DOS CHKDSK може виявляти й фіксують деякі дефекти. (см. КОМАНДИ КОРИСТУВАЧА CHKDSK). Наприклад, однієї з типових проблем є наявність списків "повислих" посилань (dangling allocation lists), викликане тим, що в каталозі відсутній покажчик на початок списку. Подібна ситуація часто буває, коли не був обновлений вхід у каталог, тому що не відбулося закриття файлу перед вимиканням або перезавантаженням комп'ютера. Наслідки цього досить необразливі: дані недоступні, однак це обмеження не впливає на інші операції по розміщенню файлів. Команда CHKDSK може вирішити цю проблему, створивши новий вхід каталогу й зв'язавши його зі списком.

Інші труднощі виникають, якщо розмір файлу у вході каталогу не збігається з його довжиною, що обчислює за допомогою перегляду списку посилань в FAT. Це може викликати невірне виконання програми і повідомлення про помилки MS DOS.

Більше складна й рідше виникаюча проблема зустрічається, коли вхід каталогу заданий правильно, однак список посилань (весь або деяка його частина) використаний також іншим входом каталогу. Виникає важка ситуація, тому що запис або додавання в один файл змінює вміст іншого. Ця помилка звичайно викликає серйозне руйнування даних й/або каталогу й приводить до краху системи.

Подібна проблема зустрічається, коли список зв'язків завершується вільним кластером замість номера останнього кластера. Якщо вільний кластер розподілений до виправлення цієї помилки, ситуація наприкінці кінців перетворюється в описаний вище випадок. Пов'язана із цим труднощі виникає, коли зустрічається значення посилання 1 або значення, перевищує розмір FAT.

Крім CHKDSK, для обслуговування FAT можна використати безліч комерційно доступних сервісних програм. Наприклад, програми реорганізації диска (disk reorganizers) можна застосовувати для зміни структури FAT й упорядкування каталогу так, щоб всі файли на диску були розміщені послідовно в області файлів даних й, зрозуміло, в FAT.

12-бітовий FAT FFFH 007H 000H

003H _____ ____ ____

Резерв _____ | | _|_ | _|__ |

____|____ _|__ | __|_ | 00 |07| | |00| |

| | | | | 00 | FF | 6F |____| F0 FF 0

F9 FF FF 03 40 |___| | | | |__|

| | | | | |

| | | | | |

|______| |_____| |___|

004H

16-бітовий FAT

Резерв

| 0003H

____________ _____ ____ ____ _____ ____ _____ _____

| | | | | | | | | | | | | | | |

F8 FF FF FF 03 00 04 00 FF FF 06 00 07 00 FF FF 00 00

Вхід FAT

__________________________________________________

12-бітовий FAT |резерв| 003H| 004H| FFFH| 006H| 007H| FFFH| 000H|

16-бітовий FAT | |0003H|0004H|FFFFH|0006H|0007H|FFFFH|0000H|

|______|_____|_____|_____|_____|_____|_____|_____|

Вхід каталогу ____________

(указує на |FILE1.TXT |

2 вхід FAT) |___________|

(указує на ____________

5 вхід FAT) |FILE2.TXT |

|___________|

Область файлів даних Відповідний вхід FAT

__________________________________

| FILE1.TXT | 2

|________________________________|

| FILE1.TXT | 3

|________________________________|

| FILE1.TXT | 4

|________________________________|

| FILE2.TXT | 5

|________________________________|

| FILE2.TXT | 6

|________________________________|

| FILE2.TXT | 7

|________________________________|

| не використається (доступний) | 8

|________________________________|

Відповідність між FAT й областю файлів даних

;-і-і-і Одержати номер наступного посилання з 12-бітової FAT

;Параметри:

; ax = поточний номер ліворуч

; ds:bx = адреса FAT (повинна бути безперервної)

;

; Повертає:

; ax = номер наступного посилання

;

; Використає ax, bx, cx

next 12 proc near

add bx,ax /ds:bx - частковий індекс

shr ax,1/ax = зсув /2

/ зрушення не потрібний

pushf / зберегти зрушення

add bx,ax /ds:bx - індекс номера наступного кластера

mov ax,|bx| /ax = індекс номера наступного кластера

popf / зрушення не потрібний

jc shift / пропустити при використанні більше 12 біт

and ax,0fffh / менш 12 біт

ret

shift: mov cx,4/ cx = лічильник зрушень

shr ax,c1 /cx =

ret

next12 endp

Ассемблерная програма для доступу до 12-бітового FAT

Корневий каталог

Входи каталогу, як у кореневому, так й у підкаталогах, мають довжину 32 байта. Кожен вхід включає ім'я файлу й розширення, розмір файлу, початковий вхід в FAT , час і дату створення або останньої модифікації файлу і його атрибути. Ця структура нагадує формат блоків управління файлом (file control blocks - FCBs) для СР/М, використовуваний у файловій системі MS DOS, версії 1.х.

Угода про найменування файлів в MS DOS відбувається також з СР/М: восьмисимвольне ім'я файлу й наступний за ним трьохсимвольний тип файлу, вирівняні ліворуч і при необхідності доповнені пробілами. В межах обмежень символьного ряду ім'я й тип є абсолютно довільними. Час і дата задаються у форматі, використовуваному іншими функціями MS DOS і відбивають час останнього запису файлу.

Показаний дамп сектора каталогу обсягом 512 байт, що тримає 16 входів (кожен вхід у цьому прикладі займає два рядки). Байт зі зсувом ОАВН, що містить значення 10Н позначає, що вхід починаючи з адреси 0А0Н, ставиться до підкаталогу. Байт зі зсувом

;-і-і-і Одержати номер наступного посилання з 16-бітової FAT

;Параметри:

; ax = поточний номер ліворуч

; ds:bx = адреса FAT (повинна бути безперервної)

;

; Повертає:

; ax = номер наступного посилання

;

; Використає ax, bx, cx

next 16 proc near

add ax,ax /ax = зсув ліворуч

add bx,ax /ds:bx - індекс номера наступного посилання

mov ax,|bx| /ax = номер наступного посилання

ret

next16 endp

Ассемблерная програма для доступу до 16-бітового FAT