Как стать автором
Обновить

Как загружается FREEBSD

Время на прочтение2 мин
Количество просмотров3.7K
Для начала, опишем пациента. Я разбирал FREEBSD 8.0 Stable, а именно самый минимальный образ для загрузки с CD-ROM (44 мб). Я выбрал именно его, так как он самый маленький и удобный (для разбирательств).
Итак, начало для загрузки стандартное — по адресу 0000:7C00 грузится загрузочный сектор (только не забываем что у CD-ROM сектора по 2 Кб), и запускается на выполнение. Как оказалось, у данного CD-ROM, этот сектор является одновременно файлом /boot/cdboot, размером 1201 байт. Состоит этот файл из двух частей — основной и небольшой заглушки, которая понадобится позже. То есть карта памяти у нас такая:

image



Что делает этот файл CDBOOT? Довольно много всего. Во-первых, грузит файл /boot/loader по адресу 0000:9000, но сразу же переносит его в область под два мегабайта (00200000). Файл этот состоит из трех частей. Назовем их BTXLDR, BTX и LOADER.

image

Потом он переносит BTX обратно (на адрес 0000:9000).

image

Потом он переносит заглушку на адрес 0000:A000 и запускает программу BTX (с адреса 0000:9000). Все, CDBOOT больше не работает, поэтому рисовать его не будем:

image

Дальше работает BTX. Единственная задача данной программы — настроить среду защищенного режима и запустить другую программу (с адреса A000). Поэтому BTX настраивает прерывания, таблицу дескрипторов, сегмент задачи и другие премудрости защищенного режима и запускает программу с адреса A000. А там, как вы видите, у нас заглушка. Вот она и запускается.
Заглушка она на то и заглушка, что практически ничего не делает. Она вызывает прерывание 30H с EAX=1, передавая параметром адрес 00200000. Это прерывание перехватывается BTX и она начинает его обрабатывать. Это прерывание в BTX означает функцию EXEC, то есть «запустить программу с данного адреса». Так как адрес — 00200000, то запускается BTXLDR.
BTXLDR нужен для того, чтобы решить одну проблему: файл LOADER — это стандартный ELF-файл, типичный для FREEBSD (и не только). Но только ядра еще нет, и обрабатывать такие файлы некому. Поэтому BTXLDR просто преобразует ELF файл в обычный набор кодов, без всяких заголовков. После этого LOADER переносится на адрес 0000:A000.

image

А дальше… Происходит переход на адрес 0000:9000. Там у нас BTX. Да! BTX работает во второй раз. Как вы помните — он настраивает защищенный режим и запускает программу с адреса 0000:A000. Вот только там уже не заглушка, а полноценная программа — LOADER, без всяких заголовков, только код.
Чтобы рассказать что такое LOADER надо не одну статью, а эту мы на этом закончим. Если кого-то заинтересовало, то статьи про LOADER скоро появятся.
Теги:
Хабы:
+51
Комментарии13

Публикации