Структура жесткого диска
Таблица разделов диска
Начальный сектор диска имеет главную корневую запись, которая грузится в память и выполняется. Последняя часть этого сектора имеет таблицу разделов — 4 элементную таблицу с 16-байтовыми элементами. Такой таблицей руководит программа FDISK. При загрузке ROM-BIOS загружает этот сектор с записью про таблицу. Это делается для того, что бы определить активный раздел. Затем считывается корректный корневой сектор в память и выполняется.
Таблица 1 — Структура главной корневой записи и таблицы разделов
Смещение | Длина | Содержимое |
---|---|---|
000h | 446 | Корневая запись — MSB |
1BEh | 16 | Описатель раздела 1 (табл. 2) |
1CEh | 16 | Описатель раздела 2 |
1DEh | 16 | Описатель раздела 3 |
1EEh | 16 | Описатель раздела 4 |
1FEh | 2 | Подпись таблицы разделов (значение = АА55h) |
Таблица 2 — Структура описателя раздела
Смещение | Длина | Содержимое |
---|---|---|
00h | 1 | Признак активности раздела (0 — не активен, 80h — активен) |
01h | 1 | Номер поверхности диска, где начинается раздела |
02h | 2 | Номер цилиндра и номер сектора, с которых начинается раздел |
04h | 1 | Код раздела (табл. 3) |
05h | 1 | Номер поверхности диска, на которой заканчивается раздел |
06h | 2 | Номер цилиндра и номер сектора, на которых заканчивается раздел |
08h | 4 | Абсолютный (логический) номер начального сектора раздела |
0Ch | 4 | Размер раздела (число секторов) |
Код раздела предназначен для определения и положения на диске расширенного и основного разделов. После обнаружения раздела его размер и координаты можно прочитать из определенных полей. Если в поле кода раздела 0, то описатель можно считать пустым, и будет определенно, что на диске нет никакого раздела.
Таблица 3 — Коды разделов ОС Microsoft
Код | Вид раздела | Размер | Тип FAT | ОС |
---|---|---|---|---|
01h | Основной | 0-15 Мбайт | FAT12 | MS-DOS 2.0 |
04h | Основной | 16-32 Мбайт | FAT16 | MS-DOS 3.0 |
05h | Расширенный | 0-2 Гбайт | — | MS-DOS 3.3 |
06h | Основной | 32 Мбайт — 2 Гбайт | FAT16 | MS-DOS 4.0 |
0Bh | Основной | 512 Мбайт — 2 Гбайт | FAT32 | OSR2 |
0Ch | Расширенный | 512 Мбайт — 2 Гбайт | FAT32 | OSR2 |
0Eh | Основной | 32 Мбайт — 2 Гбайт | FAT16 | Windows 95 |
0Fh | Расширенный | 0 — 2 Гбайт | — | Windows 95 |
За ОС других фирм зарезервированы следующие коды:
- 02h — раздел СР/М
- 03h — раздел Xenis
- 07h — раздел OS/2 (HPFS)
Номера цилиндра и сектора занимают 10 и 6 бит:
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c | c | c | c | c | c | c | c | c | c | s | s | s | s | s | s |
Они запакованы так, что, когда загружается СХ 16-битовым значением, оно готово для вызова прерывания INT 13h для чтения определенной порции диска. После чтения главной записи загрузки в область памяти sect_buf функция:
CMP byte ptr sect_buf [01BEh], 80h
проверит, активен ли первый раздел. А следующий алгоритм загрузит СХ для вызова INT 13h для чтения корневого сектора раздела №1.
MOV CX, sect_buf[01C0h]
Параметры относительного сектора по смещению 08h в каждом разделе равен головке, сектору и цилиндру начального адреса раздела. Относительный номер сектора прирастает сначала по каждому сектору на головке, затем по каждой головке и наконец по каждому цилиндру. Формула:
отн_сек = (#Цил * сек_на_цил * головок) + (#Гол * сек_на_цил) + (#Сек -1)
Разделы стартуют с четного номера цилиндра, за исключением первого раздела.
Структура корневого сектора
Формат корневого сектора дискеты или раздела жесткого диска показан на рис.1.
Рисунок — 1
Таблица параметров жесткого диска
Такая 16-байтовая структура располагается по адресу вектора прерывания INT 41h (4-байтовый адрес в 0:0104). Характеристики для второго жесткого диска (если он существует) располагаются по адрес вектора INT 46h.
Таблица 5 — Формат таблицы жесткого диска
Смещение | Длина | Содержимое |
---|---|---|
00h | 2 | Число цилиндров |
02h | 1 | Число головок |
03h | 2 | Не используется (всегда 0) |
05h | 2 | Номер начального цилиндра предкомпенсации |
07h | 1 | Максимальная длина блока коррекции ошибок ECC |
08h | 1 | айт контроля: биты 0-2 — не используются (всегда 0); бит 3 — установлен, если число головок больше 8; бит 4 — не используется (всегда 0); бит 5 — установлен, если изготовитель разместил карту дефектов на цилиндре с номером «максимальный рабочий цилиндр + 1»; бит 6 — запрет повторного контроля ECC; бит 7 — запрет контроля ECC |
09h | 1 | Не используется (всегда 0) |
0Ah | 1 | Не используется (всегда 0) |
0Bh | 1 | Не используется (всегда 0) |
0Ch | 2 | Номер цилиндра зоны парковки |
0Eh | 1 | Число секторов на дорожке |
0Fh | 1 | Резерв |
Таблица распределения файлов (FAT)
Размер файла может меняться со временем. Если предположить хранения файла только в смежных секторах, то при увеличении размера файла ОС должна полностью переписать его в другое место диска. Для упрощения задачи, в современных ОС реализованы таблицы распределения файлов (File Allocation Table — FAT), которые разрешают хранить файл в виде нескольких раздельных участков.
В FAT область данных логического диска поделена на участки одинакового размера — кластеры. Число секторов в кластере кратное 2N и может принимать значения от 1 до 64. В каталоге файлов для каждого файла имеется номер начального элемента в таблице FAT, равен первому кластеру в цепочке файла. Пример показан на рис.2. Из рисунка видно:
- MYFILE.TXT занимает 10 кластеров. Первый кластер это — 08, а последний 1Вh. Цепочка кластеров — 08h, 09h, 0Ah, 0Bh, 15h, 16h, 17h, 19h, 1Ah, 1Bh. Каждый компонент цепочки указывает на следующий компонент цепочки, это показано в табл.6.
- Кластер 18h помечен как дефектный, и не входит в цепочку
- Кластеры 06h, 07h, 0Ch-14h и 1Ch-1Fh пусты и доступны для других цепочек
Таблица 6 — Значение элементов FAT
Значение | FAT12 | FAT16 | FAT32 |
---|---|---|---|
Свободный кластер | 0 | 0 | 0 |
Зарезервированный кластер | FF0h-FF6h | FFF0h-FFF6h | FFFFFF0h-FFFFFF6h |
Дефектный кластер | FF7h | FFF7h | FFFFFF7h |
Конец цепочки распределения | FF8h-FFFh | FFF8h-FFFFh | FFFFFF8h-FFFFFFFh |
Номер кластера следующего элемента в цепочке | 002h-FEFh | 0002h-FFEFh | 0000002h-FFFFFEFh |
FAT начинается с логичного сектора 1 в разделе DOS. Впринципи нужно прочитать корневой сектор DX=0, и взять смещение 0Eh. Там уже узнаем количество корневых и резервных секторов которые стоят перед FAT. Чтобы прочитать любой компонент FAT по цепочке, нужно прочитать всю FAT и получить из оглавления начальный номер кластера, и в случае FAT12:
- умножить номер кластера на 3
- разделить результат на 2
- прочитать из FAT 16-разрядное слово, используя в качестве адреса результат предыдущего круга
- Если номер элемента четный, но нужно выполнить AND над словом и маской 0FFFh. Если же нечетный, то сдвинуть значение вправо на 4 бита.
Рисунок — 2
Смотрите также: