Загрузчик

Материал из wikixw
Перейти к навигации Перейти к поиску

Загрузчик - это программа, написанная для загрузки более сложного ядра. Подробности реализации собраны в разделе Запуск вашего собственного загрузчика

Что делает загрузчик[править]

Загрузчик в конечном счете должен:

Перенесите ядро (и все, что нужно ядру для начальной загрузки) в память

  • Предоставьте ядру информацию, необходимую для правильной работы
  • Переключитесь на среду, которая понравится ядру
  • Передать управление ядру
На x86 загрузчик выполняется в реальном режиме. Следовательно, он имеет легкий доступ к ресурсам и функциям BIOS. Следовательно, это хорошее место для выполнения определения карты памяти, доступных видеорежимов, загрузки дополнительных файлов и т.д. Загрузчик соберет эту информацию и представит ее в виде, понятном ядру.

Загрузка вашего ядра[править]

Биты вашего ядра находятся где-то на каком-то диске (предположительно, на загрузочном диске, но это не обязательно). Вопрос в том, где на диске? Это обычный файл на разделе в формате FAT? Это набор последовательных секторов в "зарезервированной области" файловой системы FAT (в этом случае вам может понадобиться специальный инструмент для форматирования диска и установки на него ядра)? Или диск / раздел просто оставлен неформатированным, а ядро вставлено напрямую с помощью инструмента создания образа диска?

Возможны все вышеперечисленные варианты. Возможно, я бы выбрал сам - зарезервировать достаточно места в файловой системе FAT для хранения списка секторов, используемых файлом ядра. Зарезервированные для полей сектора в BPB - идеальное место для этого. "Преимущество" полнофункциональности заключается в том, что вам не нужно перезаписывать bootsector каждый раз, когда вы переписываете ядро.

То, что необходимо загрузить, в основном зависит от того, что находится в вашем ядре. Для Linux, например, требуется дополнительный файл 'initrd', который будет содержать 'процесс инициализации' (на уровне пользователя). Если ваше ядро модульное и некоторые модули понимают файловые системы, вам необходимо загрузить модули вместе с ядром. То же самое касается "служб микроядра", таких как службы диска / файлов / памяти и т.д.

Предоставление ядру его информации[править]

Для запуска некоторых ядер требуется некоторая дополнительная информация. Например, вам нужно указать Linux корневой раздел для запуска. Довольно полезная информация - это карта адресного пространства, фактически карта того, где есть физическая память, а где ее нет. Другие популярные запросы касаются режимов видео.

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

Создание среды[править]

Для большинства ядер требуется защищенный режим. Для этих ядер вам придется

Включить A20

  • Загрузите GDT
  • Войдите в защищенный режим
  • прежде чем передать управление ядру.

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

Примечание: найдите время, чтобы подумать о том, включать здесь подкачку или нет. Имейте в виду, что отладка кода инициализации подкачки без помощи обработчиков исключений может быстро превратиться в кошмар!

Дизайн загрузчика[править]

Практически любой загрузчик соответствует общему дизайну.

Одноступенчатый загрузчик[править]

Одноступенчатый загрузчик состоит из одного файла, который полностью загружается BIOS. Затем этот образ выполняет описанные выше действия для запуска ядра. Однако на x86 вы обычно ограничены 512 байтами для первого этапа (исключением является отсутствие эмуляции El-Torito), что не так много. Кроме того, значительная часть этого размера может быть посвящена структурам bios и заголовкам FAT, что оставляет еще меньше места для работы

Двухэтапный загрузчик[править]

Двухэтапный загрузчик фактически состоит из двух следующих друг за другом загрузчиков. Первый является небольшим с единственной целью загрузки второго. Затем второй может содержать весь код, необходимый для загрузки ядра. GRUB использует два (или, возможно, три) этапа.

Смешанный загрузчик[править]

Другой способ избежать барьера в 512 байт - разделить загрузчик на две части, где первая половина (512 байт) может загрузить остальное. Этого можно достичь, вставив разрыв в 512 байт в ASM-коде, убедившись, что остальная часть загрузчика помещена после bootsector.

Загрузка нескольких операционных систем[править]

Самый простой способ загрузить другую ОС - это механизм, называемый chainloading. Windows хранит нечто похожее на загрузчик второго уровня в загрузочном секторе раздела, в который он был установлен. При установке Linux также можно записать, например, LILO или GRUB в загрузочный сектор раздела вместо MBR. Теперь, что может сделать ваш загрузочный сектор MBR, это переместить себя (скопировав из 0x0000: 0x7c00 в, традиционно, 0x0060: 0x0000), проанализировать таблицу разделов, отобразить какое-то меню и позволить пользователю выбрать, с какого раздела загружаться. Затем ваш (перемещенный) загрузочный сектор MBR загрузит загрузочный сектор этого раздела в 0x0000: 0x7c00 и перейдет туда. Загрузочный сектор раздела не будет знать о том, что ранее уже был загружен загрузочный сектор, и фактически может загрузить еще один загрузочный сектор - вот почему это называется загрузкой по цепочке.

Вы видите, что при отображении меню некоторым понятным способом и принятии нажатий клавиш такой многовариантный загрузчик может довольно быстро стать довольно сложным. Мы даже не касались темы загрузки с расширенных разделов, что потребовало бы последовательного чтения и анализа нескольких таблиц расширенных разделов перед распечаткой меню.

Доведенные до крайности, подобные программы управления загрузкой могут стать такими же сложными, как и простая ОС, хорошим примером чего является GRUB: он предлагает чтение из различных файловых систем, загрузку мультизагрузочных ядер, загрузку по цепочке, загрузку с ramdisks initrd и т.д. и т.п.

Смотрите также[править]

Статьи

  • BootProg может загружать программы COM / MZ из FAT12/16/32- форматированный носитель
  • Bootf - это небольшой загрузчик гибких дисков FAT12 для образов ОС в защищенном режиме
  • Gujin - это GPLed загрузчик для ПК
  • GRUB - огромный раздутый загрузчик Grand Unified, используемый многими операционными системами
  • BOOTBOOT для загрузки 64-разрядных ядер в BIOS, UEFI, El Torito CDROM и т.д.
  • Limine - это загрузчик, способный изначально загружать 64-разрядные ядра и Linux
  • SysLinux - это загрузчик ядра Linux
  • Запуск собственного загрузчика
  • Bootloader

Пруф[править]

wiki.osdev.org/Bootloader