Таблиця розділів диска
Початковий сектор жорсткого диска містить головну кореневу запис, яка завантажується в пам'ять і виконується.
Остання частина цього сектора містить таблицю розділів - 4-елементну таблицю з 16-байтовими елементами. Цією таблицею маніпулює програма FDISK (або еквівалентна утиліта в іншій операційній системі).
Під час завантаження ROM-BIOS завантажує головну кореневу запис і передає управління на її код. Цей код зчитує таблицю розділів, щоб визначити розділ, позначений як активний. Потім в пам'ять зчитується коректний кореневої сектор і виконується.
Таблиця 1. Структура головної кореневої запису і таблиці розділів
Коренева запис (MSB)
Описувач розділу 1 (див. Табл.2)
Описувач розділу 2
Описувач розділу 3
Описувач розділу 4
Підпис таблиці розділів (значення AA55h)
Таблиця 2. Структура описателя розділу
Ознака активності розділу (0 - не активний, 80h - активний)
Номер поверхні диска, з якої починається розділ
Номер циліндра і номер сектора, з яких починається розділ
Код розділу (див. Табл.3)
Номер поверхні диска, на якій закінчується розділ
Номер циліндра і номер сектора, на яких закінчується розділ
Абсолютний (логічний) номер початкового сектора розділу
Розмір розділу (число секторів)
Код розділу використовується для визначення наявності та положення на диску основного і розширеного розділів. Після виявлення потрібного розділу його розмір і координати можна витягти з відповідних полів опису. Якщо в поле коду розділу записаний 0, то описатель вважається порожнім, тобто він не визначає на диску ніякого розділу.
Таблиця 3. Коди розділів операційних систем Microsoft
Вони впорядковані так, що, коли ви завантажуєте CX 16-бітовим значенням, воно готове для виклику переривання INT 13h для читання потрібної порції диска. Таким чином, після читання Головною записи завантаження в область пам'яті sect_buf. код
перевірить, чи активний перший розділ, а код
завантажить CX для виклику INT 13h для читання кореневого сектора розділу № 1.
Розділи починаються з парного номера циліндра, за винятком першого розділу, який може починатися з циліндра 0, головки 0, сектора 2 (оскільки сектор 1 зайнятий Головною записом завантаження).
Коли коренева запис розділу отримує управління, DS: SI вказує на відповідний елемент таблиці розділів.
Структура кореневого сектора
Таблиця 4. Формат кореневого сектора дискети або розділу жорсткого диска
NEAR-перехід на код завантаження
OEM-ім'я компанії і версія системи
число байтів в секторі (завжди 512)
число секторів в кластері
число резервних секторів (секторів перед FAT # 1)
число таблиць FAT
число 32-байтових елементів кореневого каталогу (для FAT32 - 0)
загальне число секторів на носії (розділ DOS)
тип носія інформації (те саме, що 1-й байт FAT)
число секторів в одній FAT
число секторів на доріжці
число прихованих секторів (ісп. в схемах поділу)
всього секторів, якщо розмір> 32 Мб
ID томи (серійний номер)
ID файлової системи (FAT12)
початок коду і даних завантаження
зауваження:
- Типи носіїв інформації:
- F0h - гнучкий диск, 2 сторони, 18 секторів на доріжці;
- F8h - жорсткий диск;
- F9h - гнучкий диск, 2 сторони, 15 секторів на доріжці;
- FCh - гнучкий диск, 1 боку, 9 секторів на доріжці;
- FDh - гнучкий диск, 2 сторони, 9 секторів на доріжці;
- FEh - гнучкий диск, 1 сторона, 8 секторів на доріжці;
- FFh - гнучкий диск, 2 сторони, 8 секторів на доріжці.
Таблиця параметрів дискети
Таблиця 5. Формат таблиці параметрів дискети
Перший байт специфікації:
біти 0-3 - час завантаження головок;
біти 4-7 - тривалість кроку головок
Таблиця розподілу файлів (FAT)
Розмір файлу може змінюватися з часом. Якщо допустити зберігання файлу тільки в суміжних секторах, то при збільшенні розміру файлу ОС повинна повністю переписати його в іншу відповідного обсягу (вільну) область диска. Щоб спростити і прискорити виконання операції додавання нових даних в файл, в сучасних ОС застосовуються таблиці розподілу файлів (File Allocation Table, скорочено FAT), які дозволяють зберігати файл у вигляді кількох несуміжних ділянок.
При використанні FAT область даних логічного диска розділена на ділянки однакового розміру - кластери. Кластер може складатися з одного або декількох послідовно розташованих на диску секторів. Число секторів в кластері має бути кратним 2 N і може приймати значення від 1 до 64 (розмір кластера залежить від типу використовуваної FAT і обсягу логічного диска).
Кожному кластеру поставлений у відповідність власний елемент таблиці FAT. Перші два елементи FAT є резервними - якщо на диску є K кластерів даних, то число елементів FAT дорівнюватиме K + 2. Тип FAT визначається значенням K.- якщо K <4085 - используется FAT12;
- якщо 4084> K <65525 - используется FAT16;
- якщо 65524> K - використовується FAT32.
Назва типів FAT походять від розміру елемента. Так елемент FAT12 має розмір 12 біт, FAT16 - 16 біт, FAT32 - 32 біта. Слід враховувати, що в FAT32 чотири старших двійкових розряди зарезервовані і ігноруються в процесі роботи ОС (тобто значущими є тільки сім молодших шістнадцятирічних розрядів елемента).
FAT - це зв'язний список, який ОС використовує для відстеження фізичного розташування даних на диску і для пошуку вільної пам'яті для нових файлів.
В каталозі файлів (змісті) для кожного файлу міститься номер початкового елемента в таблиці FAT, що відповідає першому кластеру в ланцюжку розподілу файлу. Відповідний елемент FAT або вказує кінець ланцюжка, або посилається на наступний елемент, і т.д. приклад:
Ця діаграма ілюструє основні концепції FAT. З неї видно, що:- MYFILE.TXT займає 10 кластерів. Перший кластер - це кластер 08, останній кластер - 1Bh. Ланцюжок кластерів - 08h, 09h, 0Ah, 0Bh, 15h, 16h, 17h, 19h, 1Ah, 1Bh. Кожен елемент вказує на наступний елемент ланцюжка, а останній елемент містить спеціальний код (див. Табл. 7).
- Кластер 18h позначений як дефектний і не входить в ланцюжок розподілу.
- Кластери 06h, 07h, 0Ch-14h і 1Ch-1Fh порожні і доступні для розподілу.
- Ще один ланцюжок починається з кластера 02h і закінчується кластером 05h. Щоб дізнатися ім'я файлу, потрібно відшукати елемент змісту з початковим номером кластера 02h.
Таблиця 7. Значення елементів FAT
Номер кластера наступного елемента в ланцюжку
FAT зазвичай починається з логічного сектора 1 в розділі DOS (тобто її можна прочитати по INT 25h з DX = 1). У загальному випадку спочатку треба прочитати корневой_сектор (DX = 0) і взяти зміщення 0Eh. Там вказано, скільки кореневих і резервних секторів стоять перед FAT. Використовуйте потім це число (зазвичай 1) як вміст DX. щоб прочитати FAT через INT 25h.
Може існувати кілька копій FAT. Зазвичай підтримуються дві ідентичних копії. У цих випадках все копії розташовані безпосередньо один за одним.
зауваження:
- За загальним омані вважається, що 16-бітова FAT не дозволяє DOS працювати з дисками, великий 32 мегабайт. Насправді, обмежує те, що INT 25h / 26h не здатне працювати з сектором, номери яких більше 65535. Оскільки розмір сектора зазвичай 512 байт, або половина кілобайти, то це диктує 32-мегабайтовий ліміт. З іншого боку, ніщо не забороняє вам мати сектори більшого розміру, так що теоретично DOS може працювати з будь-якими дисками.
зауваження:
- 12-бітовий елемент може перетинати кордони двох секторів, так що будьте уважні, якщо зчитуєте по одному сектору FAT.
16-бітові елементи простіше - кожен елемент містить 16-бітовий зсув (від початку FAT) наступного елементу в ланцюжку.
32-бітові елементи - кожен елемент містить 32-бітовий зсув наступного елемента в ланцюжку.
У програмах, написаних на асемблері, для виконання множення на 3 замість команди MUL часто застосовується алгоритм "зрушення і складання": ісхродное число копіюється, над копією числа виконується зрушення вліво на один розряд (множення на 2), а потім обидва числа складаються (x + 2x = 3x). Замість команди DIV використовується зрушення вправо на один розряд.
Дискета (або розділ жорсткого диска) структурована таким чином:- кореневої і резервні сектори;
- FAT # 1;
- FAT # 2;
- кореневої каталог (не існує в FAT32);
- область даних.
Кожна секція в цій структурі має змінну довжину, і для коректного перетворення номера кластера в номер сектора необхідно знати довжину кожної такої секції.
Щоб отримати номер початкового сектора кластера з номера кластера ClustNum (лічений з відповідного поля в елементі каталогу або в ланцюзі FAT), ви можете використовувати недокументовані функцію ОС 32h або прочитати кореневої сектор і застосувати такі формули:
корневих_секторов = (RootSiz * 32) / 512 начало_данних = ResSecs + (FatSize * FatCnt) + корневих_секторов нач_сектор = начало_данних + ((ClustNum - 2) * ClustSiz).
де значення змінних: RootSiz. ResSecs. FatSize. FatCnt. ClustSiz витягуються з кореневого сектора або з BPB (див. Табл.4).
Встановіть DX = нач_сектор перед операцією читання INT 25h або записи INT 26h.
Каталоги файлів
Каталог файлів являє собою масив 32-байтних елементів - описателей файлів. З точки зору операційної системи все каталоги (крім кореневого каталогу в системах FAT12 та FAT16) виглядають як файли і можуть містити будь-яку кількість записів.
Кореневої каталог (Root Directory) - це головний каталог диска, з якого починається дерево підкаталогів. Для кореневого каталогу в FAT12 і FAT16 в системній області логічного диска виділено спеціальне місце фіксованого розміру (16 Кбайт), розраховане на зберігання 512 елементів. В системі FAT32 кореневої каталог є файлом довільного розміру.
Таблиця 8. Структура елемента каталогу
При створенні файлів відлік дат ведеться від початку епохи MS-DOS, тобто від 01.01.1980. Біти 9-15 містять номер року мінус 1980 (допустимо значення від 0 до 127).
Довгі імена файлів
Починаючи з Windows 95 файлу можна привласнити (на додаток до короткого імені) так зване довге ім'я. Для зберігання довгого імені використовуються порожні елементи каталогу, суміжні з основним елементом - описателем файлу. Наявність одиниць в розрядах 0-3 байта атрибутів є ознакою того, що вільний елемент каталогу використовується для зберігання ділянки довгого імені файлу (для описателей файлів і каталогів таке поєднання неможливо). Коротке і довге імена файлу є унікальними, тобто не повинні зустрічатися двічі на одному каталозі.
Довге ім'я записувати не ASCII-символами, а в форматі Unicode, де кожному національному алфавітом відповідає набір кодів. Розплатою за універсальність Unicode є зниження щільності зберігання інформації - кожен символ займає два байти (16-розрядне слово). У порожні елементи каталогу довге ім'я записується в розрізає на шматочки вигляді (см. Табл.9).
Таблиця 9. Структура елемента каталогу, що зберігає фрагмент довгого імені файлу
Перша ділянка фрагмента імені
Контрольна сума короткого імені
Друга ділянка фрагмента імені
Номер першого кластера (має дорівнювати 0)
Третя ділянка фрагмента імені
Довге ім'я записується в каталог першим, причому фрагменти розміщуються в порядку отримання, починаючи з останнього:
Останній фрагмент довгого імені
Другий фрагмент довгого імені
Перший фрагмент довгого імені
Стандартний описатель файлу
Блок інформації диска формується недокументовані функції DOS 32h.
Таблиця 10. Схема блоку інформації диска
Номер диска (0 = A, 1 = B і т.д.)
Номер субустройства з заголовка пристрою (один драйвер може управляти декількома дисками)
Розмір сектора в байтах
Число секторів на кластер -1 (максим. Сектор в кластері)
Зрушення кластера в сектор (кластер = 2№ секторів) (секторів на кластер в ступенях двійки: 2 для 4, 3 для 8)
Число резервних секторів (кореневі, початок кореневого ОГЛ.) (N першого сектора FAT)
Число таблиць FAT