Info Guide #07
31 мая 2005

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

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



Другие статьи номера:

Классика - Альманашник. А. С. Пушкин.

For Coderz - Распознавание и вычисление арифметических выражений по их символьной записи.

Inferno - Авторы журнала.

For Coderz - О дисциплине при создании больших проектов.

Интервью - Вопросы Константину Свиридову (Conan) о сайте zxnext.narod.ru.

Ликбез - Принципы конвертирования графики PC-ZX.

For Coderz - Программирование смены диска/дисковода на Скорпионе.

Sofтинка - DNA_OS v0.431 - пакет утилит для работы с винчестерами, RAM-дисками и дискетами.

For Coderz - Программирование под DNA_OS ZET-9, пакет утилит для работы с устройствами хранения данных.

Sofтинка - Проблемы и недоработки пакета утилит для работы с устройствами хранения данных DNA_OS.

Ликбез - Подробно о дисковых форматах, имеющих FAT.

Inferno - Вступление от редактора.

Inferno - Ошибки в предыдущих номерах.

For Coderz - Маленькие программерские хитрости.

Gameland - О новых играх: Oneyroid, Dizzy forever, Dridlock.

For Coderz - Пишем архиватор. Практические принципы LZ упаковки.

Gameland - Прохождение новых отгрузок для игры "Чёрный Ворон".

For Coderz - Программирование для видеорежима 384x304.

Inferno - Письма в редакцию.

Звук - Идеи Megus'а по поводу трекера для AY/YM.

Inferno - Об оболочке.

For Coderz - Основы оптимизации под процессор Z80.

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

Gamedev - 3D проецирование пола/трассы в играх.

Звук - Дикие идеи для AY трекеров.

Реклама - Реклама от Романа Чунина.

Реклама - Реклама от В. Богдановича

For Coderz - Как делается крупная перемещаемая программа.

Ремонт - Неисправности Pentagon 128+ и их ремонт.

Inferno - Содержание номера.

Разное - Мысли о конкурсе на лучший софт.

Others - Перенос программного обеспечения на ZX Spectrum с PC.

Видео - Об упаковке видео для ZX Spectrum.


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

Похожие статьи:
EventS Overview - Surv!v0r о событиях и фактах: Открытие Спектрумовской банерной сети, у POS появился сайт, обзор демок с СС'2000, переименование Eternity Industry, результаты Final Shoque'2k, ЧВ2 не будет, закрытие газеты Born Dead, группа LFG распалась.
Обзор - O новых программах: Narc, The Hundred, Heavy Metal Mover, Quick Draw McGraw, Iice Climber (Альпинист), Super Cars, Lode Runner 3, Down Town, Страна Мифов, Gremlin 2, Sword of Bane, Turbo Skate Fighter, Assault Course, Mercs, Darkman. Десятка лучших игр.
News games - Алгоритм прохождения игры UFO-2 v2.10 Дьяволы бездны от COPPER FEET.
Презинтация - Презинтация игры "Mortal Kombat".
Белый_попугай - Автошкола.

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