ru:docs:boot:mbr
no way to compare when less than two revisions

Differences

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


ru:docs:boot:mbr [2014/05/21 20:30] (current) – created - external edit 127.0.0.1
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.