Расположение разделов
на винчестере
ZET-9
12.03.2005
Last edit 22.05.2005
Информация получена опытным путем и ча─
стично из книг по MS-DOS.
Касается стандартных пц-винтов,т.е.вин─
тов,разделы на которых создавались на пц с
помощью программ fdisk, Partition magic и
подобных им.
Лирическое отступление
Стандартное создание разделов на пц
программой fdisk.
fdisk.exe - это стандартная программа,
она есть на загрузочной дискете MS-DOS.
После работы этой программы на винте
ВСЯ ИНФОРМАЦИЯ БУДЕТ УНИЧТОЖЕНА!
1) Создаём основной раздел (он называет─
ся "первый"). Если он будет единственным,
отводим под него весь винт. Если нужны ещё
разделы, то отводим под него часть винта -
например, 20%.
В программе fdisk можно создать только
один основной раздел. Поэтому, если нужны
ещё разделы, переходим к созданию дополни─
тельных.
2) Создаём дополнительный раздел - под
него обычно отводится вся оставшаяся часть
винта.
Теперь начинаем создавать ещё разделы -
они будут созданы как бы внутри дополните─
льного раздела. В программе fdisk они на─
зываются логическими дисками.
3) Создаём логические диски в любом ко─
личестве (по одному), главное,чтобы их об─
щий объём не превышал объём дополнительно─
го раздела (программа всё равно это не по─
зволит сделать).
В итоге получаем на винте один основной
раздел и несколько дополнительных разде─
лов.
С помощью программы Partition Magic мо─
жно делать много всякого, при этом в неко─
торых случаях инфа на винте остаётся - это
главное отличие её от fdisk. И ещё одно
отличие: можно создать несколько основных
разделов - максимум 4 (если не создавать
дополнительных разделов),или на уже сущес─
твующем винте (на котором есть 1 основной
раздел и несколько дополнительных) создать
ещё 2 основных раздела (например, за счёт
уменьшения длины первого основного разде─
ла) - тогда на винте будет 3 основных и
несколько дополнительных разделов.
Основные разделы
Самый первый сектор на винте - это MBR
(главная загрузочная запись - Master Boot
Record ).
В самом начале сектора может быть ка─
който пц-шный загрузчик длиной #01BE байт.
По смещению #01BE от начала этого (пер─
вого) сектора располагается таблица разде─
лов длиной 64 байта. Последние 2 байта в
секторе - #55,#AA. Если их нет,значит,этот
винт "нестандартный" (для пц), и определи─
ть,какие есть разделы на винте,скорее все─
го, не получится, но можно попробовать.
Таблица разделов
Её длина 64 байта.Всего в ней отводятся
записи для четырех разделов.На каждый раз─
дел - по 16 байт. Запись содержит в себе
несколько полей с данными.
Смещение Длина Название поля
от начала поля,
таблицы байт
0 1 Признак активности
раздела - флаг.
;Принимает значения 0 (неактивный) или #80
(активный).Активным может быть только один
из разделов. BIOS на пц будет производить
загрузку кода из этого раздела.
1 3 Начало раздела в
формате CHS.
;Эти 3 байта содержат значения для регист─
ров цилиндра,головки и сектора (Cyl, Head,
Sec - сокращенно CHS),которые надо заслать
на винт для чтения первого сектора этого
раздела:
- 1-й байт - это номер головки (использу─
ется 4 младших бита);
- 2-й байт:
младшие 6 бит - номер сектора;
биты 6, 7 - это биты 8, 9 номера цилиндра
для регистров цилиндра (они соответствуют
битам 0, 1 в регистре Cylinder Hi );
- 3-й байт - это биты 0..7 номера цилинд─
ра для регистров цилиндра (этот байт зано─
сится в регистр Cylinder Low ).
Смещение Длина Название поля
от начала поля,
таблицы байт
4 1 Системный байт.
;Байт указывает на тип раздела. Значения:
0 - необычный раздел;
1 - первичный раздел DOS(FAT12)(основной)
размером 0..15 Мбайт;
4 - первичный раздел DOS(FAT16)(основной)
размером 16..32 Мбайт;
5 - расширенный разд.DOS (дополнительный)
размером 0..2 Гбайт;
6 - "огромный" разд.DOS(>32Мb) (основной)
размером 32 Мбайт..2 Гбайт (FAT16);
#0B - основной (FAT32),
размер 512 Мбайт..2 Терабайта
(это значение использовалось в OS/2);
#0C - основной (FAT32),
размер 512 Мбайт..2 Терабайта
(это значение используется сейчас во всех
Windows для больших винтов);
#0E - основной (FAT16),размер 32 Мб..2Г;
#0F - расширенный (дополнительный),0..2Г;
#83 - так обозначается основной раздел
при разбивке винта в системе Linux;
#85 - так обозначается раздел для свопа
при разбивке винта в системе Linux.
Смещение Длина Название поля
от начала поля,
таблицы байт
5 3 Конец раздела
в формате CHS.
;Эти 3 байта значения для регистров голов─
ки, сектора и цилиндра указывают на конец
раздела:
- 1-й байт - это номер головки (использу─
ется 4 младших бита);
- 2-й байт:
младшие 6 бит - номер сектора;
биты 6, 7 - это биты 8, 9 номера цилиндра
для регистров цилиндра (они соответствуют
битам 0, 1 в регистре Cylinder Hi );
- 3-й байт - это биты 0..7 номера цилинд─
ра для регистров цилиндра (этот байт зано─
сится в регистр Cilinder Low ).
Смещение Длина Название поля
от начала поля,
таблицы байт
8 4 Число секторов до
начала раздела.
;Число секторов по 512 байт, которое надо
пропустить до начала этого раздела.Это по─
ле используется в режиме LBA вместо знач-й
из поля "начало раздела в формате CHS".
Фактически это номер блока в режиме LBA-
адресации (блоки нумеруются от нуля).
12 4 Количество секторов
в данном разделе.
;Длина раздела в секторах по 512 байт.
Вот такие 16 байт в каждой записи для
каждого из существующих разделов.
Разделы можно определять по системному
байту: если он равен 0 - значит, раздела
нет; если он равен 5 - значит,это дополни─
тельный раздел; другое значение - основной
раздел.
По координатам начала раздела (CHS или
LBA) нужно загрузить сектор - это первый
сектор раздела, называется он Boot Record
(загрузочная запись) или Boot Sector (заг─
рузочный сектор). Формат Boot-сектора рас─
смотрен в конце статьи.
Дополнительные разделы
Для работы с дополнительными разделами
необходимо:
1) В MBR,в таблице разделов найти раздел
со значением системного байта, равным 5
(или #0C, или #0F ) - это байт по смещению
4 от начала записи об этом разделе;
2) Взять информацию о начале раздела из
поля "начало раздела" (в формате CHS или
LBA). Эта информация для дополнительного
раздела указывает не на начало дополните─
льного раздела, а на сектор,который содер─
жит SBR (Secondary Boot Record).
При работе в режиме LBA нужно запомнить
это значение, оно понадобится нам позже.
Назовём его ADRES_LBA;
3) Загрузить сектор SBR.Этот сектор име─
ет структуру почти такую же,как MBR, но не
содержит загрузчика, и в таблице разделов
(расположенной по смещению #01BE от начала
этого сектора) используются только первые
две записи (в отличие от MBR, где исполь─
зуются 4 записи) по 16 байт каждая.
Последние 2 байта сектора SBR равны
#55,#AA. Записи содержат поля, аналогичные
полям в MBR. При этом первая запись содер─
жит информацию об этом дополнительном раз─
деле, а вторая запись указывает на следую─
щую SBR (при наличии нескольких дополните─
льных разделов).В SBR для последнего допо─
лнительного раздела используется только
первая запись;
4) Если это тот дополнительный раздел,
который нам нужен, переходим к пункту 5.
Иначе:
ищем следующий дополнительный раздел;
берём из 2-й записи в таблице разделов
значение "начало раздела" из соответствую─
щего поля, причём,если режим CHS, то сразу
загружаем следующую SBR. В режиме LBA
надо сложить это значение со значением
ADRES_LBA и присвоить полученный результат
переменной ADRES_LBA - и только после это─
го загрузить SBR. Далее переход на началo
этого пункта;
5) Берём из 1-й записи в таблице разде─
лов начало этого раздела из соответствую─
щих полей и загружаем Boot-сектор этого
раздела.
Внимание! Поле "начало раздела в фор─
мате CHS" (по смещению 1 от начала записи)
указывает на первый сектор этого дополни─
тельного раздела.Просто используем его для
загрузки Boot-сектора.
Поле "начало раздела в формате LBA" (по
смещению 8 от начала записи) содержит чис─
ло секторов до начала дополнительного раз─
дела, но не от начала винчестера (!), а от
значения ADRES_LBA. Поэтому,чтобы получить
реальное количество секторов до начала до─
полнительного раздела, складываем эти два
значения и потом загружаем Boot-сектор.
Теперь, когда загружен Boot-сектор нуж─
ного нам раздела, из него берём всю инфор─
мацию о файловой системе FAT на этом раз─
деле.
Структура раздела такая.
- 1-й сектор раздела - это Boot-сектор;
- Несколько неиспользуемых секторов (они
могут отсутствовать - их кол-во узнаем из
двух байт по смещению 14 от начала в Boot-
секторе);
- 1-я копия FAT;
- 2-я копия FAT;
- Корневой каталог;
- Данные.
Примечание:
При использовании винчестера с другой
файловой системой (не FAT) необходимо в
драйвере винчестера запомнить значение ко─
личества секторов до начала раздела (если
используется формат CHS, то надо пересчи─
тать начало раздела в CHS в формат LBA), и
при обращении к разделу драйвер будет при─
бавлять это значение к номеру сектора, ко─
торый необходимо загрузить/записать. Точно
так же делать это при работе с дополните─
льными разделами FAT (см.примечание к сме─
щению #1C в Boot-секторе).
Формат Boot-сектора
Внимание! Формат этого сектора справед─
лив для файловых систем FAT12 и FAT16.
Здесь длина сектора - 512 байт.
Boot-сектор - это первый сектор на дис─
кете с файловой системой FAT12 (дискета
MS-DOS). На винчестере с файловой системой
FAT12 или FAT16 это первый сектор раздела
(не путать с первый сектором винчестера, в
котором расположена MBR).
Содержит следующие данные:
Смещение Длина Hазначение
0 3 Команда перехода на код
загрузчика.
3 8 Идентификатор системы (имя
программы - форматера).
;Обычно "MSWIN4.1".
#0B 2 Длина сектора в байтах.
;Обычно 512.
#0D 1 Количество секторов в
кластере.
;Для дискеты =1;
;Для HDD (FAT12) =8;
;Для HDD (FAT16) может быть 4,8,16,32,64.
#0E 2 Количество зарезервирован─
ных секторов.
;Это число секторов до 1-й копии FAT (на
дискете это фактически номер сектора, где
FAT; на винчестере - количество секторов
от начала раздела).Не может быть равным 0.
#10 1 Количество FAT.
;Обычно 2.
#11 2 Максимально возможное
количество файлов в
корневом каталоге.
;Для дискеты обычно 56;
;Для HDD обычно 512.
#13 2 Общее количество секторов
на диске.
;Для дискеты и для винчестера объёмом до
32 Мбайт; если >32 Мбайт,то это поле соде─
ржит 0, 0 ).
#15 1 Код формата
(байт-описатель типа диска)
──────────────────────────────────────────
Значение этого байта такое:
#F0 - Гибкий диск,2 стороны,18 секторов
на дорожке;
#F8 - Жёсткий диск;
#F9 - Гибкий диск,2 стороны,15 секторов
на дорожке;
#FC - Гибкий диск,1 сторона,9 секторов
на дорожке;
#FD - Гибкий диск,2 стороны,9 секторов
на дорожке;
#FE - Гибкий диск,1 сторона,8 секторов
на дорожке;
#FF - Гибкий диск,2 стороны,8 секторов
на дорожке.
──────────────────────────────────────────
#16 2 Число секторов в
одной FAT.
#18 2 Количество секторов на
одной дорожке.
;Для дискеты =9;
;Для HDD - это параметр Sec.
#1A 2 Количество головок на
диске.
;Для HDD - это параметр Head.
#1C 4 Количество специальных
(скрытых) секторов.
;Очень важный параметр для винчестера -
это количество секторов до начала раздела.
Внимание! Для основных разделов это реаль─
ное число секторов от начала винчестера до
этого раздела. Для дополнительных разделов
это число совпадает со значением поля "Ко─
личество секторов до начала раздела", взя─
тым из таблицы разделов в SBR.
#20 4 Кол-во секторов на диске.
;Используется,если размер винчестера >32M.
#24 1 ID накопителя (номер диска
для винчестера в BIOS).
;первый =#80.
#25 1 Резерв.
#26 1 Сигнатура расширенного
сектора, т.е. только то,
что пишет DOS 4.0 и выше,
содержит здесь #29.
#27 4 Порядковый номер тома.
;Серийный номер - пишется при форматирова─
нии диска, содержит индивидуальный номер и
дату.
#26 11 Имя диска.
#36 8 Содержит "FAT12 " или
"FAT16 ".
Дополнение:
Было замечено, что винчестеры,поддержи─
вающие режим LBA, при создании на них раз─
делов получают следующий параметр.
Начало первого основного раздела ВСЕГДА
имеет значение #3F (в поле "количество се─
кторов до начала раздела") и цилиндр 0,
головка 1,сектор 1 (в поле "начало раздела
в формате CHS").
Такое наблюдалось на следующих винтах:
DHAA-2270 (258 Mb);
IBM-DB0A-2540 (541 Mb);
IBM-20 (20 Gb);
Maxtor (40 Gb);
Western Digital (160 Gb).
Как следствие - на некоторых винтах
(маленьких - 200-500 метров) нельзя в ре─
жиме CHS использовать поле "начало раздела
в формате CHS", так как на самом деле на─
чало раздела не там, но можно использовать
поле "количество секторов до начала разде─
ла", но только в том случае,если винт под─
держивает режим LBA (т.е. работать с ним в
режиме LBA).
Ещё про Boot-сектор
Под Boot-сектором буду понимать все се─
ктора до начала первого основного раздела.
На винтах с FAT16 используется только
самый первый сектор, остальные сектора до
начала раздела свободны.
На винтах с FAT32, кроме самого первого
сектора, ещё используется сектор 6 - там
хранится копия самого первого сектора (ко─
пия таблицы разделов),а в секторе 2 содер─
жится дополнительная информация от количе─
стве свободного места на диске, о первом
свободном кластере на диске.
Содержимое 2-го сектора (считая сектора
с первого):
Смещение Длина Значение
0 4 #41,#61,#52,#52
;Идентификатор доп.сектора.
4 480
;Поле зарезервировано (нули).
#01E4 4 #61,#41,#72,#72
;Идентификатор доп.сектора.
#01E8 4
;Свободно кластеров на диске.Если это поле
имеет значение #FFFFFFFF - надо вычислять.
#01EC 4
;Номер кластера на диске, с которого начи─
нать поиск свободного кластера. Если это
поле имеет значение #FFFFFFFF - значит,
надо вычислять.
#01F0 12
;Поле зарезервировано (нули).
#01FC 4 #00,#00,#55,#AA
;Идентификатор доп.сектора.