Введення у файлові системи, страница 37

Процедура одержання номеру кластеру з FAT залежить від формату таблиці розміщення файлів.

Виконувати операції з елементами таблиць типів FAT16 і FAT32 дуже легко, оскільки ці таблиці являють собою масиви 16-розрядних і 32-розрядних слів відповідно. Працювати з елементами FAT12 менш зручно, тому що для доступу до елементу масиву приходиться виконувати ряд допоміжних дій:

помножити номер початкового кластера на 3;

розділити результат на 2 (тому що кожен елемент таблиці має довжину 1,5 байта);

прочитати 16-бітове слово з FAT , використовуючи як зсув значення, отриманий після ділення на 2;

якщо номер початкового кластера парний, на обране з FAT слово треба накласти маску 0FFFh, залишивши молодші 12 біт, якщо ж номер початкового кластера непарний, обране з FAT значення необхідно зсунути вправо на 4 біти, залишивши старші 12 біт;

отриманий результат - це номер наступного кластера в ланцюжку, при цьому значення 0FFFh (чи інше в діапазоні від 0FF8h до 0FFFh) відповідає кінцю ланцюжка кластерів.

При записі елементу в FAT12 порядок дій такий:

помножити номер елемента на 3;

розділити результат на 2;

витягти з FAT 16-розрядне слово, використовуючи як адресу результат попередньої операції (адресу слова запам'ятати);

якщо номер елементу парний, виконати операцію AND над отриманим словом і маскою 0F000h, а потім операцію OR над отриманим результатом і значенням записуваного елементу. Якщо номер непарний, виконати операцію AND над ліченим словом і маскою 0F000h, а потім здвинути значення елементу вліво на 4 розряди і виконати OR з результатом попередньої операції;

записати отримане 16-розрядне слово знову у FAT. У програмах, написаних на ассемблері, для виконання множення на 3 замість команди MUL часто застосовується алгоритм «здвигу і додавання»: вихідне число копіюється, над копією числа виконується зсув вліво на один розряд (множення на 2), а потім ці числа складаються (х + 2х = 3х). Замість команди DIV при діленні на 2 використовується зсув вправо на один розряд. Елемент FAT містить номер кластеру, але при роботі з дисками на «низькому рівні» адресуємою одиницею даних є сектор, а не кластер.

Номер початкового сектору кластеру SectorNum зв'язаний з номером кластеру ClusterNum наступною формулою: