Смекни!
smekni.com

Розробити програму-аналог програми Doc Undelete (стр. 2 из 4)

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

Коли диск перший раз форматується операційною системою MS-DOS і кілька файлів копіюються на цей диск, інформація, поміщена в секторах таблиці FAT, використовується операційною системою MS-DOS для визначення адреси кожної частини файлу. Звертання до файлів іде через таблицю FAT в одиницях "кластер". Файл завжди займає, принаймні, один кластер, а, якщо він досить великий, займає кілька кластерів. Кластер у дійсності є частиною розподілу і складається з одного сектора даних на однобічних гнучких дисках і двох секторів даних на двосторонніх гнучких дисках. Деякі тверді диски використовують кластера, кожний з який складається з восьми секторів. Уся область збереження даних на диску (за винятком області для даних по початковому завантаженню таблиці FAT.

Декодування елементів таблиці FAT.

Значення в елементі 0 таблиці FAT завжди вказує на формат диска. Елемент 1 завжди встановлений у значення (F) FFF, щоб виступати в ролі чи перешкоди заповнювача між елементом 0 і елементом 2. Усі наступні елементи таблиці FAT використовуються для відображення диска. Кожний з цих елементів містить один із чотирьох типів інформації:

наступний номер кластера у файлі;

маркер кінця файлу;

невикористаний кластер;

кластер, позначений, як зарезервований, чи зіпсований.

У таблиці 1 перераховані значення, що можуть бути присутнім в елементах таблиці FAT.

Усі елементи таблиці FAT містять або 3 - або 4-числові, шістнадцяткові номера. Це значить, що елемент таблиці FAT містить або 12-бітове, або 16-бітове значення. Усі диски, що містять 4085 чи менше кластерів (більшість гнучких дисків і інших змінних носіїв) використовують 12-бітові елементи таблиці FAT, у той час, як диски, що мають більш 4085 кластерів (більшість твердих дисків і деякі змінні диски) використовують 16-бітові елементи таблиці FAT.


Таблиця 1

Значення елементів таблиці FAT, що керують розміщенням файлів

Шістнадцяткове значення елемента Значення таблиці FAT
(0) 000 Кластер не використовується і доступний для розміщення нового файлу
З (F) FF0 до (F) FF6 Зарезервований кластер (недоступний для звичайного збереження файлів)
(F) FF7 Кластер позначений, як зіпсований, операційною системою MS - DOS і не використовується збереження файлів
З (F) FF8 до (F) FFF Останній кластер, зайнятий файлом
(X) XXX Будь-яку інше значення вказує номер кластера в ланцюги, що визначає порядок розміщення файлу

Чому існує два різних формати таблиці FAT? До того, як була введена підтримка твердих дисків під керуванням операційної системи MS-DOS (версія 2.0 операційної системи MS-DOS), розроблювачі операційної системи MS-DOS намагалися мінімізувати розмір пам'яті, необхідний для розміщення таблиці FAT. Оскільки максимальний розмір кластерів для гнучких дисків менше числа 4085 (2847 кластерів на 1,44 3,5-дюймових дисках), дисковий простір буде витрачатися дарма, якщо будуть використовуватися 16-бітові елементи таблиці FAT, а максимальна кількість кластерів, що може бути відображене при 8-бітових елементах буде дорівнювати 255, що не відповідає вимогам використання пам'яті. Тому для того, щоб декодувати значення елементів таблиці FAT, спочатку потрібно визначити загальна кількість кластерів на диску.

Обробка 12-бітових елементів таблиці FAT.

Схема операційної системи MS-DOS розміщення чисел, що мають 1,5 байта в довжину, в елементах таблиці FAT на гнучких дисках може показатися дивної. Але треба знати, що операційна система MS-DOS була спроектована з метою швидкого декодування цих байтів. Спосіб, яким операційна система MS-DOS зберігає інформацію в таблиці FAT, полягає в зашифровці елементів таблиці FAT парами, у яких два 1,5-байтовых елементи об'єднані в невелику 3-байтову пару. Якщо ми хочемо визначити номер кластера в елементі 2 таблиці FAT, ми також повинні подивитися на елемент 3 таблиці FAT. Якщо ми хочемо подивитися на номер кластера в елементі 3 таблиці FAT, ми повинні повернутися назад і подивитися на елемент 2 таблиці FAT. Елементи 4 і 5 таблиці FAT будуть теж здвоєні, як і елементи 6 і 7, 8 і 9 і так далі.

Якщо з номера кластера витягається тільки три цифри, чому ж друга по старшинству цифра номера першого кластера переставляється на місце молодшої цифри другого кластера? Схема перестановок працює швидше, коли машина сама декодує байти і витягає інформацію. Цифри з'являються вже в переставленому виді тільки тоді, коли користувач читає таблицю FAT через DEBUG.

Для декодування інформації у 12-бітових елементах таблиці FAT на чи папері усередині програми потрібно користатися представленою нижче послідовністю дій:

1. Помножити номер елемента таблиці FAT чи кластера на 1,5 байтів (спочатку множте число на 3, а потім поділяєте результат на 2).

2. Використовуйте результат як зсув у таблицю FAT, що вказує на елемент, що відбиває тільки що використовувався кластер. Цей елемент містить номер наступного кластера, займаного тим же файлом.

3. Завантажите слово (2-байтове число), розташоване з цим зсувом, у регістр

4. Тепер у регістрі знаходяться чотири шістнадцяткові цифри. Оскільки нам потрібно тільки три цифри для тризначного елемента таблиці FAT, варто визначити, чи є номер елемента таблиці FAT парним чи непарним числом.

5. Якщо номер елемента представлений парним числом, у регістрі варто зберігати три молодші цифри шляхом виконання операції логічного додавання "И" із зсувом 0FFF. Якщо номер елемента представлений непарним числом, варто зберегти три старші цифри шляхом зрушення регістра вправо на чотири біти командою SHR.

6. Якщо результуючі три цифри являють собою число від FF8 до FFF, це значить, що ви досягли кінця файлу. У противному випадку ці три цифри являють собою номер наступного кластера, зайнятого тим же файлом.

Обробка 16-бітових елементів таблиці FAT.

Робота з номерами кластерів і елементами таблиці FAT на дисках, що використовують 126-бітові елементи таблиці FAT, значно полегшується в порівнянні з роботою, у якій використовуються 12-бітові елементи таблиці FAT, тому що всі елементи таблиці FAT тут вирівняні на границю слова, тобто, кожен елемент таблиці FAT може чи зчитуватися записуватися, як ціле повне слово. При цьому не потрібно піклуватися про сусідні елементи таблиці FAT.

Для декодування інформації у 12-бітових елементах таблиці FAT на чи папері усередині програми потрібно користатися представленою нижче послідовністю дій:

1. Одержати початковий кластер файлу з елемента каталогу

2. Помножити використовуваний номер кластера на 2 (байти; 1 слово).

3. Використовуйте результат як зсув у таблицю FAT, що вказує на елемент, що відбиває тільки що що використовувався кластер. Цей елемент містить номер наступного кластера, займаного тим же файлом.

4. Завантажите слово (2-байтове число), розташоване з цим зсувом, у регістр

5. Якщо результуючі чотири цифри являють собою число від FFF8 до FFFF, це значить, що ви досягли кінця файлу. У противному випадку ці чотири цифри являють собою номер наступного кластера, зайнятого тим же файлом.

Перетворення кластерів у логічні сектори.

Якщо ви пишете програму, що буде звертатися до області збереження даних на диску, ви знайдете, що такі засоби операційної системи MS-DOS, як переривання "int 25h" (Абсолютне зчитування з диска) і переривання "int 26h" (Абсолютний запис на диск), а також програма-отладчик DEBUG, вимагають, щоб ви вказували номери логічних секторів. Незважаючи на те, що на ілюстраціях структур диска вказується перший сектор диска, як сторона 0, доріжка 0, сектор 1, перший сектор у дійсності дорівнює логічному сектору 0. Усі наступні логічні сектори являють собою послідовні зсуви від 0. Таким чином, логічний сектор 1 буде представлятися, як сторона 0, до ріжка 0, сектор 2, а логічний сектор 2 буде представлятися, як сторона 0, доріжка 0, сектор 3. Оскільки кожен елемент таблиці FAT, відповідно до результатів, отриманим після виконання зазначених вище п'яти дій, завжди створює номер кластера, перераховані нижче дії покажуть вам, як потрібно перетворювати номер кластера в номер логічного сектора:

1. Відняти 2 із номера кластера.

2. Помножити отриманий результат на кількість векторів, використовуваних у кластері, у такий спосіб:

а. Для всіх однобічних форматів гнучких чи дисків для двостороннього 80-трекового, 5,25-дюймового формату диска підвищеної щільності запису зробити множення на 1.

б. Для всіх двосторонніх 40-трекових, 5,25-дюймових форматів дисків підвищеної щільності запису зробити множення на 2.

в. Для двосторонніх 8-дюймових гнучких дисків підвищеної щільності запису зробити множення на 4.

м. Для твердих дисків варто використовувати одне з 4 вищенаведених чи значень інше число, що залежить від формату диска.

3. Додати результат до номера логічного сектора початку області збереження даних.

Застосовуючи відповідну послідовність дій у правильному порядку, ви тепер можете перейти від елемента каталогу до елемента таблиці FAT, до номера кластера, до номера логічного сектора. А якщо є такий засіб, кому потрібна операційна система MS-DOS?! Ви і самі можете зчитувати файли сектор за сектором!