Inferno #07
31 мая 2005

Ликбез - Расположение разделов на винчестере.

           Расположение разделов
              на винчестере
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
;Идентификатор доп.сектора. 




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Non Possumus - Сеть... Что же это такое на самом деле?
Обзо игр - GUMMY, After Burner, MURK 3320, BIGNOSE.
Авторы - авторы газеты.

В этот день...   22 сентября