Как загружается FREEBSD из песочницы

*nix*
Для начала, опишем пациента. Я разбирал 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
1 ноября 2011, 15:22
79
blueboar2 10,0

комментарии (13)

0
main #
Что Вы использовали для анализа?
+1
blueboar2 #
IDA / Bochs
0
zorgzerg #
Bochs отличная штука, к дипломному проекту разрабатывал концепцию ОС, с частичной реализацией. Если б не BOCHS — даж не знаю что бы я делал. Интересная статья, спасибо )
+2
cadmi #
Парни, я мож чего-то не понимаю, но зачем IDA?
Не проще было в исходниках посмотреть?
0
blueboar2 #
Возможно я какой-то неправильный человек, но мне проще смотреть в IDA чем в C шном листинге. Хотя кого не спрошу говорят наоборот. Наверное тяжелое наследие Советских компов сказывается
0
sashkin #
Интересно было прочесть, но путанница с именами. Сначала грузиться /boot/loader, а потом снова LOADER? Это одно и то же? На счет заглушки тоже ниче не ясно на кой она нужна? Может заглушка запускается уже в защищенном режиме и является так сказать трамплином? Какой смысл двигать BTX по адресам. В общем хочется чуть больше подробностей, а то как то поверхностно немного :) Я вижу шаги загрузки, но не вижу в чем смысл некоторых шагов.
0
blueboar2 #
Да, /boot/loader и LOADER это одно и то же.
Да, заглушка в защищенном режиме, и трамплин.

Извиняюсь за неточности.
0
BreatheInMyVoid #
Спасибо за статью. Только нужно бы уточнить: Как загружается FREEBSD на x86 ;)
0
blueboar2 #
Да. Конечно.
0
Zelgadis #
Тогда уж еще точнее: Как загружается FreeBSD на x86.
0
TaN #
Кстати, начиная с 9.0 BTX работает в реальном режиме. Так что теперь, наконец-то, пропадёт большинство проблем загрузки с USB.
0
blueboar2 #
Хм. Интересно. Надо будет изучить.
0
afiskon #
Интересно. Надеюсь на продолжение.

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