"Человек - самое уязвимое место в системе безопасности.."

Структура жесткого диска

Таблица разделов диска

Начальный сектор диска имеет главную корневую запись, которая грузится в память и выполняется. Последняя часть этого сектора имеет таблицу разделов — 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

Смотрите также: