ru:docs:boot:mbr

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ru:docs:boot:mbr [2014/05/21 22:30] (current)
Line 1: Line 1:
 +===== Описание 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, что также очень удобно.).
 +
 +(c) osFree project, ​
 +2006, Oct 10.
  

ru/docs/boot/mbr.txt · Last modified: 2014/05/21 22:30 (external edit)