Коротко:

Препарируем MBR

12.11.1011:24

Препарируем MBR

Согласитесь, было бы заманчиво собственноручно поучаствовать в процессе загрузки операционной системы компьтором? А если и не поучавствовать, то хотя бы понимать процессы, происходящие в компьютере сразу после его включения, было бы полезно как программистам-системщикам, так и прикладникам. Сразу же оговорюсь: данный материал предполагает наличие у читателя хотя бы базовых знаний ассемблера, а также представления об аппаратном обеспечении современного ПК и программировании ASP.NET.

Давайте поставим перед собой конкретную задачу: обеспечить возможность одновременного использования на ПК двух операционных систем (MS-DOS 6.22 и MsWindows 95) с возможностью выбора загружаемой операционной системы.

Для начала - немного теории. С чего же начинается процесс загрузки компьютера? После включения питания и проведения необходимых опреаций по проверке аппаратуры BIOS обращается к первому физическому сектору жесткого диска (или другого устройства хранения информации, например, флеш-диска, дисковода, прочее). В первом секторе диска хранится MBR (Master Boot Record, "Главная загрузочная запись"). Содержимое этого сектора переносится в оперативную память (чаще всего начиная с адреся 0000h:7C00h). Загрузочная запись состоит из двух частей, как выяснили на форуме программистов. Первая часть размером 219 байт сожержит программный код, вторая часть - 66 последних байт - содержит данные об структуре диска (количестве разделов, активном разделе прочее). Остальной объем МВР заполнен нулями. После загрузки МВР программный код начинает выполняться. Во-первых, МВР анализирует свою вторую часть на предмет количества активных разделов. Во-вторых, определяется тип файловых систем на существующих разделах. И в-третьих, содержимое сектора, на который указывает запись об активном разделе, MBR грузит в память по адресу 0000h:7C00h и передает ему управление, после чего начинатеся загрузка операционной системы с раздела, являющегося активным.

Однако все гладко только на бумаге. На самом же деле, если в процессе анализа данных об разделах будет найдено более одного раздела с признаком "активный", то пользователю будет выдано сообщение об ошибке, загрузка прервется и компьютер зависнет. Один из вариантов решения этой проблемы может быть следующим.

Как известно, 16-е прерывание (обработка ввода с клавиатуры) становится активным с момента включения компьютера. Модифицируем МВР таким образом, чтобы при загрузке пользователю предоставлялся выбор, какой раздел жесткого диска сделать активным. После того, как пользователь выбор сделал, МВР должна модифицировать данные об структуре дисков (свои последние 66 байт) и записаться в уже модифицированном виде на свое законное место - в первый физический сектор жесткого диска. Таким же образом можно организовать загрузку и более чем двух операционных систем.

Более того, модифицировав МВР, мы можем сдеать так, что при загрузке той или иной операционной системы она не будет видеть другие разделы жесткого диска. Делается это путем изменения реального кода раздела, который необходимо скрыть, на значение 0х10. Разделы с таким кодом не видны ни DOS, ни Windows, ни Linux, чем можно воспользоваться для разграничения доступа к жесткому диску.

В заключение скажу, что, прочтя эту статью, не следует сломя голову сносить установленные у вас загрузчики (Lilo, Grub прочие) и начинать экспериментировать с МВР. Преследуемая цель была, скорее, показать пользователю процесс загрузки "изнутри" и подвигнуть его на более глубокое изучение данного вопроса.

Цены на рынке Симферополя (Цены указаны в рублях)
Абрикосы: 150 Баклажаны: 25 Бананы: 40
Батон: 21 Вода минеральная 1.5: 32 Говядина: 310-350
Дыня: 25 Капуста: 25 Картофель: 20
Клубника: 170 стакан Кукуруза: 15 Лук: 30
Малина: 110 стакан Морковь: 40 Нектарин: 90
Огурцы: 40 Перец: 30 Персики: 120
Помидоры: 40 Рыба: от 120 Свекла: 25
Свинина: 260-350 Смородина: 110 стакан Укроп\Петрушка: 10-15
Филе курицы: 230 Хлеб: 13-17 Чеснок: 130
Шампиньоны: 130 Яблоки: 50-100 Яйца: 50-60