Yoda писал(а):
EBR работает в связке с MBR. Порознь сделать сложно и возрастает вероятность неприятных ошибок. Код EBR выполняет функции, сходные с MBR (загрузка boot-сектора активного раздела), но с поправкой на замороченную структуру расширенного раздела. Необходимые для своей работы начальные данные он получает от MBR.
Меня как раз и интересовало, как EBR реагирует на присутствие стороннего MBR-загрузчика (сообщает ли об ошибке, если используется сторонний MBR-загрузчик, способный передать некорректные "начальные данные") и наоборот. Тут опять всплывает тема обнаружения, которую мы с тобой уже затрагивали. У меня явная передача управления коду EBR, когда расширенный раздел помечен как основной (активный) или как альтернативный источник загрузки, является ошибочной ситуацией. Передача управления "стороннему"/отсутствующему коду EBR также является ошибочной ситуацией. Т.е. при дефолтной загрузке код EBR может получить управление только в случае отсутствия активного раздела в таблице, а при альтернативной загрузке - только в случае явного указания в качестве загрузочного раздела дополнительного раздела внутри расширенного (5-255), но не напрямую расширенного раздела (1-4). В обоих случаях проверяется присутствие "родного" EBR. Кстати, представь себе ситуацию перезаписи твоего MBR-загрузчика другим, способным передать управление EBR-загрузчику (с моей точки зрения в общем это очень плохая "способность", но к сожалению такое случается). В этой ситуации корректность никаких "начальных данных" не гарантируется - эту ошибку нужно отлавливать. Есть два элегантных способа это сделать:
1) в начале EBR (я чаще говорю EPR) разместить заглушку для отлавливания ошибки, а управление передавать в "середину" EBR;
2) использовать похожий или полностью аналогичный моему способ идентификации (проверки корректности) передаваемых данных - можем даже выйти на единый стандарт и сделать наши MBR- и EBR-загрузчики взаимозаменяемыми.
Цитата:
Противоречия ожиданиям пользователей и здравому смыслу я пока не вижу. Во времена DOS много чего было по-другому, это не причина оставаться на месте. Спецификации BBS 96 года как раз, на мой взгляд, разумная попытка навести порядок. Int 18 продолжает загрузку по цепочке и ничего неожиданного в этом нет. Конечно, при ошибках загрузки ожидается нажатие клавиши. Выбор в данном случае из двух альтернатив - Ctrl+Alt+Del или Any key. Первый случай как раз и даст перезагрузку с начала цепочки.
Я сказал не "во времена DOS", а "со времен DOS". Зачем продолжать загрузку по цепочке, если произошла ошибка загрузки с
ожидаемого загрузочного раздела/устройства, тем более не предупредив об этом пользователя? Чтобы он увидел вместо повторной загрузки загрузку того, что ему совершенно не было нужно, плюнул и нажал Reset? Да, у Ctrl-Alt-Del и int 18h более широкая вариативность выполнения дальнейших действий в целом. Но зато у Ctrl-Alt-Del и int 19h более широкая вариативность выполнения ожидаемых дальнейших действий. Мы все привыкли видеть "Press Ctrl-Alt-Del to
restart..." (MBR-загрузчики) и "Press any key to
reboot..." (первичные загрузчики). Но как ты назовешь действие по продолжению загрузки, чтобы тебя поняли пользователи, и как им объяснишь, что альтернатива в виде перезагрузки все-таки возможна, это еще тот вопрос!
Цитата:
Какая именно?
Подробности реализации, естественно. Также интересно, поддерживаются ли оба типа расширенных разделов DOS (5, 0Fh) или нет. Как ты реагируешь на возможное перемешивание вложенных расширенных разделов разных типов? Корректируешь ли BR дополнительного раздела (логического диска) внутри расширенного раздела типа 5? Если да, то для каких ФС? Как ты определяешь загрузочный дополнительный раздел внутри расширенного?