Описание MBR-загрузчика

Данный загрузчик должен находиться в нулевом секторе первого жесткого диска (MBR) и предназначен для загрузки бутсектора активного раздела или же раздела с заданным номером на указанном жестком диске. MBR, загрузившись с первого жесткого диска, может выбрать, с какого жесткого диска продолжать загрузку дальше. На выбранном жестком диске загружается бутсектор активного раздела, либо раздела с определенным номером. Номер следующего жесткого диска и номер раздела на нем прописываются в двух байтах внутри сектора MBR на первом жестком диске. Активный раздел определяется по первому байту описателя раздела в таблице разделов (Partition table или PT). Если данное поле равно 80h, то раздел считается активным, если же оно равно 00h, то раздел неактивен.

Для загрузки с первичного (primary) или логического (logical) раздела с заданным номером предназначено поле BootPart в MBR-секторе, имеющее размер в

байт и расположенное в MBR по смещению 0x1bb от начала сектора. Данное поле прописывается в MBR при установке загрузчика. Если данное поле равно нулю, то это значит, что загрузчик должен определить активный primary-раздел жесткого диска, и загрузить с него бутсектор, передав ему управление. Если поле BootPart ненулевое, то это является указанием загрузчику принудительно выбрать загрузочный раздел, логический или первичный, не проверяя байт активности в таблице разделов. В этом случае проверяется значение байта BootPart. Если BootPart имеет значение от 1 до 4, то это число трактуется как номер primary-раздела. Если его значение от 5 и более, то BootPart - 4 является омером логического диска внутри Extended раздела.

Таким образом, так как максимальное значение байта BootPart равно 255, то число логических дисков может быть от 0 до 255 - 4 = 251. То есть, по-максимуму может быть 3 primary-раздела плюс 1 extended и 251 логический диск внутри extended.

Данный загрузчик использует LBA для загрузки секторов с жесткого диска в память, если LBA поддерживается. В противном случае используется функция BIOS для чтения секторов с помощью CHS.

Перед таблицей разделов, по смещению 0x1bd, находится байт ForceLBA. Если этот байт не равен нулю, то LBA используется принудительно.

Перед ForceLBA и после BootPart, по смещению 0x1bc, расположен байт BootDev. Он определяет физическое устройство, на котором искать загрузочный раздел с бутсектором. Значение этого байта равно номеру жесткого диска в формате int 13h. Например, первый жесткий диск имеет номер 80h, второй 81h и т. д. По умолчанию этот байт равен 80h, то есть, производится загрузка с первого жесткого диска в системе.

Таблица разделов расположена начиная со следующего за ForceLBA байта, по смещению 0x1be, и, согласно стандарту, состоит из 4-ех описателей разделов размером по 16 байт каждый.

Заканчивается сектор сигнатурой MBR, равной 0x55aa. Эти два байта предназначены для контроля целостности MBR, а также для удобства при поиске MBR и бутсекторов при восстановлении данных на рухнувшем жестком диске.

Данный загрузчик выводит в аварийных ситуациях два сообщения.

Первое общение – “R” (первая буква фразы “Read error”) выводится при ошибках чтения диска,

а именно, если ни LBA, ни CHS не дали успешного статуса при чтении сектора с диска.

Сообщение “P” означает “Partition not found” и выводится, когда:

Не найден активный раздел в таблице разделов

Не найден расширенный раздел и байт BootPart > 4

Просматривая цепочку EBR (Extended boot records), (!!! Fix it) загрузчик не нашел ссылки на следующую EBR и текущая EBR, согласно значению байта BootPart, не является последней.

Не найден описатель нужного раздела в EBR (должен быть помечен байтом активности 80h).

Описатель в MBR primary-раздела состоит из нулей и не описывает никакого раздела.

Загрузчик при запуске (BIOS int 19h загружает его по адресу 0x7c0:0x0) перемещает себя по адресу 0x60:0x0 и передает управление по новому адресу. Прежнее место загрузчика (от 0x7c0:0x0 до 0x7e0:0x0 размером в сектор) используется как буфер для загрузки секторов. В это место попеременно загружаются MBR первого жесткого диска, MBR следующего жесткого диска, 1-я EBR, 2-я EBR, …, n-я EBR и, наконец, бутсектор загрузочного раздела. После этого, управление передается бутсектору.

Пространство от 0x7e0:0 до 0x800:0 используется MBR-загрузчиком, а также бутсектором, для хранения некоторых переменных. Стек и MBR-загрузчиком, и бутсектором используется такой: ss = 0, дно стека инициализируется в 0x7bff.

Данный загрузчик, загрузив бутсектор,

“поправляет” значение hiddensectors в BPB, прибавляя к нему номер первого сектора данного логического диска (того самого сектора, где находится EBR, то есть за 63 сектора до бутсектора).

Также в соответствующие поля BPB бутсектора MBR-загрузчик заносит номер физического диска и номер, соответствующий букве логического диска.

Эти манипуляции выполняются для возможности загрузки OS/2 с логических дисков в Extended-разделе. Аналогичные операции выполняет OS/2 boot manager при загрузке OS/2 с логических дисков. Дело в том, что для логических дисков значение hiddensectors равно 63, а для primary-разделов оно равно смещению диска от начала физического диска. Поэтому обычно нормальная загрузка возможна только с primary-дисков. Чтобы OS/2 могла грузиться с логического диска и чтобы (если используется pre-LVM версия OS/2) назначалась правильно буква загрузочного диска, нужна помощь со стороны boot manager'а.

До данного момента существовало три бутменеджера, умеющих грузить OS/2 с логического диска:

OS/2 bootmanager

бутменеджер VPart от Veit'а Kannegieser'а

AirBoot от Martin'а Kiewitz'а.

Теперь список можно дополнить нашим MBR-загрузчиком, который выполняет роль мини-бутменеджера. Но наш MBR-загрузчик в отличие от настоящего бутменеджера не позволяет диалоговый выбор загрузочного раздела, вместо этого выбор загружаемого раздела у нас будет производиться из FreeLdr, который будет выполнять функции OS Loader'а и bootmanager'а одновременно и будет грузиться blackbox'ом. (То есть, это будет продвинутая замена одновременно для OS/2 bootmanager'а и os2ldr одновременно. Идея такого совмещенного bootloader'а и bootmanager'а впервые появилась в GNU GRUB, и мы хотим следовать аналогичному принципу. Преимущество такого подхода прежде всего в том, что можно из одного меню выбирать и ОС для загрузки, и различные параметры ОС, которые могут из лоадера передаваться дальше ядру через config.sys. Кроме того, мы сможем выбирать из лоадера несколько версий/сборок ядра и os2ldr, что также очень удобно.).

© osFree project, 2006, Oct 10.