LINUX.ORG.RU
решено ФорумTalks

Загрузка ОС, MBR


1

2

Нашел статью про MBR: Здесь Так вот, функция MBR — «переход» в тот раздел жёсткого диска, с которого следует исполнять «дальнейший код» (непосредственно загрузчик ОС - GRUB или windows-загрузчик ?): 1) Произошла загрузка MBR в память:

 * BIOS проводит начальную инициализацию оборудования («железа»)
   
 * BIOS определяет, с какого устройства производить дальнейшую загрузку: дискета, флеш-накопитель, жёсткий диск и т. д. (выбор устройства зависит от версии и от настроек BIOS)

 * BIOS считывает один сектор (512 байт), который находится по адресу: «цилиндр 0, головка 0, сектор 1», и помещает его в область памяти по адресу 0000:7c00
   
 * BIOS проверяет, что этот сектор оканчивается сигнатурой 55ААh

 * BIOS передаёт управление по адресу 0000:7c00 (то есть сектору MBR)

Выбор загрузочного раздела и проверка целостности MBR:

* MBR копирует себя с адреса 0000:7c00 на адрес 0000:0600 (освобождая место для будущей загрузки уже собственно загрузчика ОС)

* MBR просматривает по очереди все записи о разделах и ищет первую запись об «активном» (== «загрузочном») разделе (то есть ищет раздел, отмеченный как 80h)

* В случае успеха (раздел, помеченный как 80h — найден) MBR запоминает номер этого раздела

    [если просмотрены все 4 записи и не найден раздел, помеченный как 80h, то вызывается INT 18h. Это возвращает управление обратно в BIOS, что может приводить либо к загрузке BASIC, либо к повторной попытке загрузить систему с диска, либо к перезагрузке компьютера — в зависимости от версии и реализации BIOS]


* MBR просматривает все оставшиеся записи и проверяет, что это единственный активный раздел (что больше разделов, помеченных 80h, на данном физическом диске не существует)

    [если находятся другие разделы, помеченные 80h, то MBR выводит сообщение об ошибке (обычно это что-то типа «Invalid partition table»), после чего система зависает в бесконечном цикле, из которого можно выйти только перезагрузкой компьютера]


* MBR проверяет, что в данном поле для всех 4-х разделов нет иных значений, кроме «00h» и «80h»

    [если находятся разделы, помеченные значением, отличным от 00h или 80h, то MBR выводит сообщение об ошибке («Invalid partition table»), система зависает, требуется перезагрузка компьютера]

На этом заканчивается проверка MBR и начинается подготовка к загрузке ОС:


* MBR считывает первый сектор логического диска, помеченного как «загрузочный» и помещает этот сектор по адресу 0000:7c00

Собственно вопросы:

  • Если у меня несколько ОС на разных разделах, следовательно несколько загрузочных разделов, помеченных как 80h? (или пометка 80h относится к загрузочному разделу с системой «загрузка по умолчанию»?).
  • С момента «MBR считывает первый сектор логического диска, помеченного как «загрузочный» и помещает этот сектор по адресу 0000:7c00» и «MBR передает управление по адресу 0000:7c00 (то есть загрузочному сектору выбранного логического раздела диска)» в память грузится Grub или загрузчик windows ? Но вначале при включении компьютера первое, что в вижу на жкране монитора - Grub.

Так как все происходит ? Заранее благодарен за ответы!

Если у меня несколько ОС на разных разделах, следовательно несколько загрузочных разделов, помеченных как 80h? (или пометка 80h относится к загрузочному разделу с системой «загрузка по умолчанию»?).

раздел может быть загрузочным, но метки на нем может не стоять.

да и вообще то что написано - относиться к временам ДОС и максимум windows 98.

dikiy ★★☆☆☆
()

С момента «MBR считывает первый сектор логического диска, помеченного как «загрузочный» и помещает этот сектор по адресу 0000:7c00» и «MBR передает управление по адресу 0000:7c00 (то есть загрузочному сектору выбранного логического раздела диска)» в память грузится Grub или загрузчик windows ?

грузится GRUB. Да и тем более при установке grub'а он сам прописывает кусок своего кода вместо стандартного MBR, афаик.

а если груба не было бы, то считался б ntldr например.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Все верно, добавлю только что и BIOS как такового уже тоже не существует.

XVilka ★★★★★
()
Ответ на: комментарий от dikiy

MBR это же программа? Код то бишь? То есть при наличии Linux, Win7, Win XP вначале загрузки bios по адресу: «цилиндр 0, головка 0, сектор 1» будет как раз кусок Grub? Который потом не проверяет наличие метки 80h? То есть Grub считывает первые сектора логических дисков, помеченных как «загрузочные» и показывает ин-фу о загрузчиках, находящихся на них. Потом пользователь выбирает что хочет грузить ,и выбранный сектор помещается по адресу 0000:7c00 (например по этому адресу)? Где вообще находятся коды загрузчиков ? В первых секторах логических дисков?

thunriv
() автор топика

BIOS занимается поиском устройства, который помечен парой байтов как загрузочный. После нахождения такового, он загружает первый сектор в память и передаёт управление на него. Дальнейший ход загрузки зависит от поведения загрузчика. В случае windows происходит примерно так, как описано в статье (MBS->чтение таблицы разделов в поисках активного раздела->запуск загрузчика из раздела). В случае GRUBа - он читает свои части в том месте, где установлен и выполняет их.

sched
()
Ответ на: комментарий от thunriv

MBR это же программа? Код то бишь? То есть при наличии Linux, Win7, Win XP вначале загрузки bios по адресу: «цилиндр 0, головка 0, сектор 1» будет как раз кусок Grub? Который потом не проверяет наличие метки 80h? То есть Grub считывает первые сектора логических дисков, помеченных как «загрузочные» и показывает ин-фу о загрузчиках, находящихся на них.

да. только с учетом того, что если на диске находится ОС - он совершенно не обязательно (и обычно таки не помечен) должен быть помечен как загрузочный.

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

Стоит кстати заметить, что может быть и наоборот. GRUB можно записать не в MBR, а в загрузочный сектор логического диска. То есть стандартный MBR загрузится, найдет диск с пометкой 80h, и втупую будет грузить то что там есть. А там GRUB :)

dikiy ★★☆☆☆
()
Ответ на: комментарий от sched

BIOS занимается поиском устройства, который помечен парой байтов как загрузочный.

BIOS же вроде ничего не ищет, а промто читает сектор в память с того устройства, которое первое стоит в его настройках очередности.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Где вообще находятся коды загрузчиков ? В первых секторах логических дисков?

по разному. В виде и ДОСе - да. А в линухе уже давно нет (хотя раньше можно было сделать cat vmlinuz > /dev/fd0 и дискета становилась загрузочной).

К примеру LILO запоминает при своей установке _физические_ сектора диска, на которых находится vmlinuz и при загрузке вычитывает именно их, и передает им управление. В GRUB чуть ли не драйвер FS находится. Он сам может найти в каком месте в дереве каталогов лежит ядро и загрузить его.

dikiy ★★☆☆☆
()
Ответ на: комментарий от sched

Что вы имеете в виду под «читает свои части в том месте, где установлен» ? Вообще, стало интересно разобраться с MBR, потому что сейчас стоят на разных разделах win xp, 7 и дебиан ну и подумал снести уже xp. Но дело в том, что снеся эту ос, как бы не перестал грузиться загрузчик окон и как пункт «windows loader» пропадет из Grub.

thunriv
() автор топика
Ответ на: комментарий от sched

Если первое устройство не загрузочное, то он переходит к следующему. Это и есть поиск.

только это к 80h не имеет никакого отношения. гугл вещает, что загрузочный сектор (будь-то MBR или кусок груба) должен начинаться с AA55h.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Что вы имеете в виду под «читает свои части в том месте, где установлен»

ну читает с жесткого диска то, что не влезло в 512 байт.

dikiy ★★☆☆☆
()

Если у меня несколько ОС на разных разделах, следовательно несколько загрузочных разделов, помеченных как 80h? (или пометка 80h относится к загрузочному разделу с системой «загрузка по умолчанию»?).

Это справедливо для классического загрузчика, который использовался в DOS и Windows (до какой-то версии). В никсах этот классический загрузчик переписывает LILO/GRUB и он уже работает совсем по-другому.
Естественно сама таблица разделов жесткого диска остается. На счет bootable раздела - его оставляют для совместимости с другими ОС. Если на винте только Линукс - можешь забыть про эту метку. А вот как Windows среагирует на то, что она загрузилась с жесткого диска, на котором нет ни единого booable раздела, я не знаю.
Говоря по-простому: если на винте есть Винда - в любом случае ставь на ее раздел. Если винды нет - забей вообще на эту метку.

Kroz ★★★★★
()

Так как все происходит ?

В MBR находится Grub фаза 1. Фаза 1 должна занимать 512 байт, один сектор: только его подгрузит БИОС. Много логики туда не впинешь (да еще и про таблицу не забудь), поэтому её основная задача - подтянуть следующую фазу Grub. Но с файловой системы это не получится сделать, потому что а 512 байт не впихнешь драйвер, например ext3; поэтому следующий кусок должен находиться в месте не занятом ФС, и такое место есть: около 32кб сразу после MBR - это фаза 1.5. Вот тут можно развернуться. Задача Grub фаза 1.5 - найти на нужной файловой системе и запустить Grub фазу 2, которая уже выдаст менюху и загрузит ядро ОС.
http://www.pixelbeat.org/docs/disk/

Это про Grub; в другом загрузчике - другая логика.

Kroz ★★★★★
()
Ответ на: комментарий от thunriv

MBR - ИМХО первые 64 сектора в случае жёсткого диска, из которых первый сектор состоит из 446 байтов кода, 64 байтов таблицы разделов и 2 байтов сигнатуры. Если на устройстве находится несколько систем, загрузка определяется загрузчиком в этих первых 446 байтах . Может быть будет GRUB, может быть Microsoft - смотря что последнее устанавливалось.

GRUB вроде не ищет в таблице разделов активный раздел, а загружает свои части, которые лежат либо в оставшихся первых 64 секторах, либо в первых секторах раздела, куда он был установлен. Потом он читает свои настройки.

Загрузчик Microsoft ищет активный раздел и передаёт управление на его начало. Если выбранный раздел отформатирован в NTFS, там находится файл $BOOT, который является загрузчиком раздела. Он ищет ntldr/bootmgr и т.д.

А вообще в гугле много подобного материала, который кстати указан в примечании в статье.

sched
()
Ответ на: комментарий от Kroz

А вот как Windows среагирует на то, что она загрузилась с жесткого диска, на котором нет ни единого booable раздела, я не знаю.

я знаю. ms-dos, Windows 95 и 98 отказывались грузиться (а IBM PC-DOS емнип прохавывал и так). поэтому если у тебя была винда на одном разделе и дос на другом, то в lilo.conf надо было специальную опцию прописывать и lilo перед загрузкой дос/винды ставил на соответствующий раздел метку 80h.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Но дело в том, что снеся эту ос, как бы не перестал грузиться загрузчик окон и как пункт «windows loader» пропадет из Grub.

не пропадет. grub может загрузить семерку самостоятельно.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Вообще, стало интересно разобраться с MBR, потому что сейчас стоят на разных разделах win xp, 7 и дебиан ну и подумал снести уже xp. Но дело в том, что снеся эту ос, как бы не перестал грузиться загрузчик окон и как пункт «windows loader» пропадет из Grub.

Если загрузчик Grub, то можешь Винду сносить смело. Потом из /boot/grub/menu.lst просто удалишь соотв. пункт (это для grub1).
А вот люди сносят Линукс и получают небутабельный комп. А все потому, что они по факту снесли Grub фазу 2, которая находилась на одном разделов Линукс.

Kroz ★★★★★
()
Ответ на: комментарий от dikiy

А причём тут 80h? BIOS при загрузке имеет список по приоритету устройств, среди которых он ищет загрузочное. Если первое устройство без сигнатуры 55AAh, он обращается ко второму и т.д, т.е. ищет загрузочное устройство.

sched
()
Ответ на: комментарий от dikiy

надо было специальную опцию прописывать и lilo

Да, что-то было. Или сохранять старую версию MBR и делать chainloader +1 , что-то типа того.

Kroz ★★★★★
()
Ответ на: комментарий от sched

А причём тут 80h? BIOS при загрузке имеет список по приоритету устройств, среди которых он ищет загрузочное. Если первое устройство без сигнатуры 55AAh, он обращается ко второму и т.д, т.е. ищет загрузочное устройство.

тем, что MBR сам по себе потом отдельно ищет загрузочные разделы с меткой 80h. ТС может запутаться. Поэтому я и указал на это различие.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Kroz

А вот люди сносят Линукс и получают небутабельный комп. А все потому, что они по факту снесли Grub фазу 2, которая находилась на одном разделов Линукс.

и вот это одна из причин, почему я до сих пор пользуюсь LILO - он не убиваемый. LILO сможет загрузить ядро даже если ты ФС форматнул, так как номера физических секторов-то он уже запомнил :)

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от sched

BIOS при загрузке имеет список по приоритету устройств, среди которых он ищет загрузочное

BIOS нашла устройство с сигнатурой, загрузило MBR, отдало ему управление, а в таблице разделов не указано ни одного бутабельного. Что произойдет?

Kroz ★★★★★
()
Ответ на: комментарий от dikiy

Так, ещё раз:

BIOS же вроде ничего не ищет, а промто читает сектор в память с того устройства, которое первое стоит в его настройках очередности.

ИМХО, BIOS таки ищет. Если в списке устройств первое не помечено сигнатурой 55AA, то он обращается ко второму и далее по списку.

Иначе в ситуации 1) DVD 2)жёсткий диск, когда вставлена пустая болванка, компьютер бы вообще не загружался.

sched
()
Ответ на: комментарий от dikiy

управление вернется в BIOS и он начнет пищать :)

Нет, ЕМНИП просто повиснет черным экраном. Хотя, судя по этому, напишет что-то вроде Missing Operating System.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от dikiy

Grub может грузить семерку самостоятельно ? Разве? Он вроде chainloader делает на виндовый загрузчик и тот потом грузит винду. А виндовый загрузчик как раз на диске с вин ХП, которую я хочу снести.

thunriv
() автор топика
Ответ на: комментарий от Kroz

Нет, ЕМНИП просто повиснет черным экраном. Хотя, судя по этому, напишет что-то вроде Missing Operating System.

это от BIOS зависит. Он возвращает управления в БИОС, а тот уже висит, или васик пускает, или пищит.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Grub может грузить семерку самостоятельно ? Разве? Он вроде chainloader делает на виндовый загрузчик и тот потом грузит винду.

а на диске с семеркой его нет чтоли?

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Lilo может и найдет все ОС на харде.

лило ничего не найдет, если ты ему не пропишешь.

dikiy ★★☆☆☆
()

Если у меня несколько ОС на разных разделах, следовательно несколько загрузочных разделов, помеченных как 80h? (или пометка 80h относится к загрузочному разделу с системой «загрузка по умолчанию»?).

Ты привел описание работы загрузочного кода MBR Microsoft. Другие MBR-загрузчики эти флаги игнорируют и вообще работают совершенно иначе.
GRUB, например, пользуется тем, что после MBR до начала первого раздела идут 2047 неиспользуемых сектора и хранит основной код там (stage2), а в эти в эти самые 446 байт загрузочной области MBR записывает stage1, который всего лишь загружает stage2 и передает ему управление. Ну, а в stage2 уже даже драйвера файловых систем влезают.
http://thestarman.pcministry.com/asm/mbr/index.html

shatsky ★★
()
Ответ на: комментарий от dikiy

Это невалидный источник. Там по неясной причине называется кусок кода от Microsoft от ms-dos 3 до win95 стандартом. С таким же успехом можно обозвать стандартным загрузчик от любых других систем. Код варьируется по версиям операционной системы и по типу файловой системы. Microsoft это не документирует (во всяком случае я не встречал такой документации), не говоря уже о том, с каких пор Microsoft стала определять стнадарты MBR.

По поводу возвращения управления назад в BIOS: в статье упомянут вызов 18 прерывания. Это передача управления только технически (как и вызов функции для чтения диска загрузчиком), а я говорил про общую логику загрузки.

sched
()
Ответ на: комментарий от sched

Это невалидный источник. Там по неясной причине называется кусок кода от Microsoft от ms-dos 3 до win95 стандартом.

ну вызови fdisk /mbr и скинь сюда первый сектор. а мы его дизассембируем.

По поводу возвращения управления назад в BIOS: в статье упомянут вызов 18 прерывания. Это передача управления только технически

это передача в BIOS и технически и фактически.

С таким же успехом можно обозвать стандартным загрузчик от любых других систем.

но таки стандартным загрузчиком обзывают именно загрузчик dos/win9x. Потому что он дожил аж до сегодняшнего дня.

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

ну вызови fdisk /mbr и скинь сюда первый сектор. а мы его дизассембируем.

То, что он сегодня на какой-то конкретной машине такой, не значит что завтра он будет таким же. Microsoft с бодуна захочет и поменяет свой загрузчик и кинет всех тех, кто рассчитывает на определённые, взятые ниоткуда предположения о том, что такое «стандартный_загрузчик».

это передача в BIOS и технически и фактически.

В таком смысле можно утверждать, что на BIOS передаётся управление не только в случае отсуствия активного раздела, но по нескольку раз во время чтения диска вызовом 13ого прерывания.

но таки стандартным загрузчиком обзывают именно загрузчик dos/win9x. Потому что он дожил аж до сегодняшнего дня.

Юзер на форуме обзывает? Где валидные доказательства того, что Microsoft определяет «стандартные загрузчики» и что «стандартный загрузчик» - это тот, который в dos 3.

sched
()
Ответ на: комментарий от sched

но таки стандартным загрузчиком обзывают именно загрузчик dos/win9x. Потому что он дожил аж до сегодняшнего дня.

Юзер на форуме обзывает? Где валидные доказательства того, что Microsoft определяет «стандартные загрузчики» и что «стандартный загрузчик» - это тот, который в dos 3.

Кроме тебя одного все всё поняли. Уймись.

это передача в BIOS и технически и фактически.

В таком смысле можно утверждать, что на BIOS передаётся управление не только в случае отсуствия активного раздела, но по нескольку раз во время чтения диска вызовом 13ого прерывания.

int 13 и int 18 это совсем разные вещи.

dikiy ★★☆☆☆
()

Фу. Грубы, нтлдры... То ли дело фряшный бутменеджер. Целиком и полностью в МБР сидит и мультибут умеет при этом.

GateKeeper ★★
()
Ответ на: комментарий от dikiy

Кроме тебя одного все всё поняли. Уймись.

Это не аргумент. Давай доказательства. Без них твои выводы основаны на «больших достижениях» Василиев Пупкиных по дизассемблированию кусков кода, которому придаются «божественные» характеристики стандарта.

int 13 и int 18 это совсем разные вещи.

You don't say?

sched
()
Ответ на: комментарий от sched

ты этот код можешь и сам дизассемблировать, если не веришь «Пупкиным». Но я отлично знаю, что ты там найдешь :)

В общем - свободен, трололо.

dikiy ★★☆☆☆
()
Последнее исправление: dikiy (всего исправлений: 1)
Ответ на: комментарий от dikiy

Он на диске с XP вроде как. Сначала устанавливался ХП, потом на другой основной раздел ставилась 7-ка и потом уже ставился Debian на третий основной раздел. Загружался Grub, который не видел винд, а только Дебиан. Помогло update-grub, после чего в списке загрузки Gruba появился загрузчик винды, через который можно загрузить или вХП или в7. P.S. На лэплопе вообще если смотреть ин-фу о разделах, есть раздел C, являющийся основным и при этом он в зеленой рамке( доп. раздел тобишь) и + он логический диск. Как такой может быть? Ведь основной раздел и доп. раздел это не одно и то же. При этом, так как он основной, я могу на него ОС поставить, но при этом он логический диск, а на лог. диск нельзя поставить ОС...

thunriv
() автор топика
Ответ на: комментарий от dikiy

ты этот код можешь и сам дизассемблировать

Угу. Даже менял - делал самопальный загрузчик для 2х win98, русской и японской. Утрамбовывал в 1 сектор.

cadaber ★★
()
Ответ на: комментарий от thunriv

но при этом он логический диск, а на лог. диск нельзя поставить ОС...

нельзя, если эта ОС от мелкософта. Остальные ОС можно.

dikiy ★★☆☆☆
()
Ответ на: комментарий от thunriv

Помогло update-grub, после чего в списке загрузки Gruba появился загрузчик винды, через который можно загрузить или вХП или в7.

update-grub должен был chainloader от каждой винды отдельно продетектить. Так что они независимы.

dikiy ★★☆☆☆
()

Ну мысли понятны. Спасибо за ссылки на полезные ресурсы! Всем спасибо!

thunriv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.