Как правило, не приходится задумываться о структуре, а тем более о расчете таблицы разделов жесткого диска. Мы привыкли полагаться на Fdisk, PQMAGIC и им подобные программы. Но что делать, если они «отказываются» работать, а такое, увы, иногда случается. Бывают, например, случаи, когда BIOS поддерживает 8-Гбайт жесткий диск, а вы купили емкостью 10 Гбайт или сильно повреждена его физическая поверхность, и тогда вам, возможно, потребуется «вручную» рассчитать и создать разделы. Возникают подобные проблемы и при сдвиге таблицы разделов диска.

Во всех перечисленных выше случаях надо знать структуру таблицы разделов и уметь ее рассчитывать.

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

В первом секторе жесткого диска хранятся программа его загрузки и данные о разбиении на разделы. Вся эта информация называется MBR (Master Boot Record) — главная загрузочная запись (в некоторых источниках к MBR относят только исполняемый код, хранящийся в данном секторе). Определим раздел как часть физического диска, служащую контейнером для логических дисков. Существует два вида разделов: основной и расширенный. Первый «вмещает» один логический диск, а лучше сказать, сам им является. А второй (расширенный) действительно служит контейнером логических дисков. (Под логическим диском будем понимать некоторый участок физического диска, распознаваемый ОС как самостоятельный накопитель, имеющий уникальное имя.)

Завершается сектор MBR, как, впрочем, и любой другой, содержащий таблицу разделов, сигнатурой Uk(55 AA). (Интересно, что каждый загрузочный сектор DOS также должен заканчиваться данной сигнатурой). При включении питания ПК или его перезагрузке BIOS именно данный сектор загружает в память и запускает на выполнение хранящуюся в нем программу, — правда, к сожалению, иногда это бывает и вирус.

Первый сектор физического диска (цилиндр — 0, головка — 0, сектор — 1) — самый важный. Если он по каким-либо причинам оказывается поврежденным, то диск можно просто выбросить.

Нас интересует таблица разделов (табл. 1 и 3).

Она начинается со смещения 1BEh (446) загрузочного сектора, занимает 64 байт и представляет собой последовательность четырех 16-байт записей. Каждые 16 байт описывают один раздел, что накладывает ограничение на число последних: их не может быть более четырех. Но ограничение на число логических дисков снимается путем использования расширенного раздела.

Каждая запись в таблице, очевидно, должна содержать указание на начало, конец и величину логического диска или раздела. Полный формат записи, описывающей раздел, приведен в табл. 2.

В табл. 3 показан пример таблицы разделов, записанной в MBR для 3,2-Гбайт диска с разделами файловой системы FAT 16.

Элементы табл. 2 и табл. 3 связаны, эту связь отражает следующая цепочка: 1->2; 2->3; 3->4,5; 4->1; 5->6; 6->7,8; 7->9; 8->10. Здесь значение слева — номер строки табл. 2, значение справа — номер столбца табл. 3.

Если в разделах установлена файловая система FAT 32, то в табл. 3 текстовое значение 1-го столбца в зависимости от версии программы DiskEdit может быть одним из следующих: FAT 32, FAT 32x, BIGDOSx, EXTENDx.

Значения 4, 3, 5-го столбцов основного раздела должны указывать на загрузочный сектор, но уже логического диска (его также называют DOS-сектором). Он содержит загрузочную запись (или ее начало) этого логического диска. А значения тех же столбцов для расширенного раздела должны указывать на сектор, содержащий подобную таблицу разделов, в которой могут быть как основной, так и расширенный разделы. И так далее по цепочке.

Значения столбцов с 3-го по 8-й мы «выбираем» сами и этим задаем начало и завершение логического диска (раздела). Однако данные в 9-м и 10-м столбцах необходимо вычислить по следующей формуле:

(1)

где H — число головок в цилиндре (указывается, как правило, на его корпусе);
S — число секторов на дорожке (также указывается на корпусе); обычно S = 63;
C, Nhead , Nsect. — координаты сектора.

Данная формула позволяет определить число секторов между секторами с параметрами Cstart , Nhead start , Nsect. start и Cend , Nhead end , Nsect. end . При расчете смещения DOS-загрузчика от MBR используются следующие значения: Cstart = 0, Nhead start = 0, Nsect. start = 1, что соответствует координатам 1-го сектора диска (0,0,1). Координаты Cend , Nhead end , Nsect. end отвечают 1-му сектору логического диска, причем Nsect. end чаще всего равен единице. Эти координаты берутся из 4, 3, 5-го столбцов табл 3. Таким образом,

(2)

где H и S определяются физическими характеристиками жесткого диска.

Формула 2 справедлива только для расчета смещения начала логического диска (раздела) относительно сектора MBR, в остальных случаях следует пользоваться формулой 1. Причем нужно помнить, что обычно Cstart , Nhead start и Nsect. start — координаты сектора, содержащего таблицу разделов. Как правило, значения Cstart , Nsect. start соответствуют значениям 4-го и 5-го столбцов, а значение Nhead start берется на единицу меньшим значения 3-го столбца табл. 3.

Величина раздела (логического диска) определяется так:

(3)

где значения Cend , Nhead end , Nsect. end берутся из 7, 6, 8-го столбцов табл. 3. Следует заметить, что параметры Cend , Nhead end , Nsect. end в формулах 2 и 3 берутся из разных столбцов.

Полученные значения для DS и DL заносятся соответственно в 9-й и 10-й столбцы.

Итак, мы рассмотрели первичную структуру организации хранения информации на жестком диске, познакомились с ее форматом и способом расчета. Важно понять, что разделы можно расположить в любом месте диска. Это бывает нужно при разбросанных по поверхности жесткого диска очагах повреждения.

Литература

Нортон П., Уилтон Р. IBM PC и PS/2. Руководство по программированию. М: Радио и связь, 1994.

Идея исследования и некоторые материалы взяты с http://stein.nm.ru.


Пример расчета таблицы разделов

Предположим, что есть жесткий диск с физическими характеристиками C = 621, H = 64, S = 63 и его загрузочный сектор (0,0,1) не поврежден. В интервалах с 1-го цилиндра по 250-й и с 516-го по 525-й имеются множественные повреждения. Программа Fdisk с этим диском, скорее всего, не сладит.

Наша цель — вручную организовать разделы. Для работы, если нет второго жесткого диска, возьмем дискету. Где-нибудь «достаем» MBR — это делается с помощью программы DiskEdit (записываем физический сектор (0,0,1) рабочего диска в файл). Затем, воспользовавшись опять же DiskEdit, запишем приобретенный файл с Master Boot Records в сектор (0,0,1) уже на нашем жестком диске. Теперь необходимо откорректировать таблицу разделов (опять же с помощью DiskEdit) в соответствии с нашими задачами (это можно сделать и в файле, а затем уже записывать его в сектор) — заполняем с 1-го по 10-й столбцы таблицы (за шаблон берем табл. 3) значениями для нашего диска.

Выбираем систему: пусть это будет BIGDOS — раздел с FAT 16.

Определяем признак загрузки — во 2-м столбце ставим «Да/Yes».

Устанавливаем начало нашего раздела/диска — заполняем столбцы с 3-го по 5-й значениями 1, 254 и 1 соответственно. Вводим завершение раздела/диска: заполняем столбцы с 6-го по 8-й значениями 63, 512, 63 соответственно.

До и после поврежденных участков задаем некоторый промежуток. Значение для 9-го столбца рассчитаем по формуле 2:

Cend и Nhead end берем из 4-го и 3-го столбцов соответственно, т. е. Cend = 254, Nhead end = 1, а H = 64, S = 63. Таким образом,

Параметр 10-го столбца высчитываем по формуле 3:

Здесь H и S не изменяются, а Cend, Nhead end, Nsect. end взяты из 7-го, 6-го и 8-го столбцов.

Так как создание других разделов мы не планируем, то все остальные строки заполняем нулями. Получаем итоговую таблицу (табл. 4).