При попытке начать кодировать на голом железе (x86_64) встал вопрос о загрузчике. Напрашиваются следующие варианты:
1. Самописный BIOS-загрузчик
Плюс: Всё просто и понятно.
Минусы: Гемморой ручной загрузки ядра, переключения real mode -> long mode. Устаревшая технология
2. Использование multiboot specification + GRUB2
Плюс: Вся работа загрузки снимается с плеч.
Минусы: Не могу оценить трудозатраты на поддержку этой спецификации. Один и тот же образ ядра может загружаться как через BIOS, так и через (U)EFI?
3. Оформить образ ядра как UEFI-application, так чтобы он напрямую загружался железом.
Плюс: Не нужен специальный загрузчик.
Минусы: Нельзя отделить сборку ядра от сборки UEFI-образа, что повлечёт проблемы переносимостью сборки (сложные Makefiles, требование наличия правильных компиляторов и инструментов).
4. Реализовать самописный UEFI-загрузчик для своего ядра
Плюс: нет геммороя сборки загрузчика, может распространяться в бинарном виде
Минусы: необходимость глубоко разбираться с UEFI API, что не сильно мне улыбается.
Какой из методов кажется вам более правильным, менее трудоёмким и более перспективным? И почему? Спасибо.
Ну да.
Можно вообще прикинуться ядром линукса, то бишь реализовать свой код так, чтобы его мог грузить какой-нибудь ЛиЛо, чтобы не бросаться сразу весь стандарт реализовывать.
Мой голос — за multiboot. Кстати, он поддерживается как grub2 так и grub1. И в исходном коде grub есть пример минимального multiboot-ядра, на основе которого очень удобно писать дальше.
Гемморой ручной загрузки ядра, переключения real mode -> long mode
Это ж не так сложно, да и вроде(?) всё равно придётся самому потом расписывать таблицы страниц.
Но всё равно, куда красивее, правильнее, универсальнее прикинуться ядром линукса.
P.S. а grub2 передаёт управление ядру x86_64 в protected mode или long mode?