Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
А загрузка на ARM будет?
Теперь запускается BIOS; после инициализации и проверки оборудования BIOS необходимо найти загрузочное устройство. Порядок загрузки сохраняется в конфигурации BIOS.
Так что если ваша цель — не потратить несколько лет на разборки с этими механизмами, а загрузить какую-нибудь OS… то лучше сделать вид, что мы вернулись в 1980е и у нас простой и бесхитростный 80386й «под капотом».
А вот чтобы взаимодействовать с EFI — вам нужна масса весьма сложного кода, который, от того, что вы его скачали с сайта и запустили «не глядя» проще не становится.
Не нужна там никакая масса кода, все взаимодействие идет через EFI_SYSTEM_TABLEА этот EFI_SYSTEM_TABLE где висит? В воздухе? Уже для того, чтобы собрать бинарник, который EFI признает «своим» нужна масса тулов, просто в hexeditor'е вы этого не сделаете.
Ничего хитрого в работе с EFI нет, и взаимодействовать с ним можно и в машинном коде, и на ассемблере, и на чем угодно.Нет. «На чём угодно» не получится. «Hello, world» для EFI — сложнее, чем весь BIOS первых 80386х! Во всяком случае у меня слодилось такое впечатление.
Придется узнать немного о формате PE, и соглашении о вызовах Microsoft x64, и о том, что зачем нужен ExitBootServices(), но это все значительно проще, чем BIOS Interrupt Call с его магическими номерами, магическими адресами, нереальным режимом, управлением адресной линией А20, ресетом через порт клавиатуры и ручным пробросом VGA через мосты.Я бы не сказал, что оно проще. Скорее подходящее слово «привычнее». Тот же «ресет через порт клавиатуры» — это, я извиняюсь, пара простых команд на ассемблере. Проблемы возникли из-за того, что этот механизм не был частью официальных спецификаций и разные производители не до конца его скопировали.
Вы, мне кажется, смотрите на GNU EFI SDK или EDK2 и думаете, что они необходимы и без них с EFI нельзя договориться. Если так — вы ошибаетесь.Было бы интересно посмотреть. Вот прямо так — как с нуля, условно говоря, в Hex Editor'е создать OS, загружающуюся в EFI-системе.
Приходится ехать на том, что есть, и на вот этом ехать с EFI значительно веселее, чем без него, на мой взгляд.Веселее — дооо, очень весело. Невозможность защитить систему от малвари — это ж так весело.
А этот EFI_SYSTEM_TABLE где висит? В воздухе? Уже для того, чтобы собрать бинарник, который EFI признает «своим» нужна масса тулов, просто в hexeditor'е вы этого не сделаете.Висит в памяти, вывесил DxeCore, вам отдадут указательна на нее вторым параметром точки входа (т.е. в регистре EDX).
Нет. «На чём угодно» не получится. «Hello, world» для EFI — сложнее, чем весь BIOS первых 80386х! Во всяком случае у меня сложилось такое впечатление.Это именно впечатление. «Hello World» для EFI выглядит вот так:
SystemTable->ConOut->OutputString(gST->ConOut, L"Hello World!");Т.е. от языка нужны следующие возможности: генерация файла PE/COFF и вызов функции с MS x64 ABI. Т.е. от языка нужны следующие возможности: генерация файла PE/COFF и вызов функции с MS x64 ABI.Что уже сильно сложнее интерйейса BIOS. Там нужно было два байта в нужное место написать (пресловутые 55 AA) и всё — можно вызывать прерывания.
Про проблемны реализации EFI спорить не готов, потому что выйдет очень длинно, но проблемы именно с CMOS/NVRAM — они исключительно от желания снизить стоимость решения (т.е. не ставить дорогой CMOS SRAM заметного объема) при возросшых требованиях к нему (железо усложнилось кратно).Я прекрасно понимаю почему простое и надёжное решение было заменено этой кучей… гуано: мартышек, которые могут как-то суметь в IDE вызвать функции с MS x64 ABI на рынке больше, чем людей, которые могут работать в BIOS. А уже проблемы с реализациями — они отсюда и следуют: если мы вместо нормальных разработчиков наняли мартышек, то остаётся радоваться что результирующее чудо брикает систему не всегда, а через раз.
Вам, видимо, не нравится тот факт, что EFI пытается абстрагировать сложность оборудования от пользователя, и делает это громадным количеством кода, который вам бы не хотелось запускать, а он все равно запускается и повлиять на это крайне не просто.Нет, мне не нравится тот факт, что это громадное количество кода не абстрагирует сложность оборудования от пользователя.
Альтернатив тут несколько, но выстрелить может, на мой взгляд, только одна — LinuxBoot, который сейчас развивают Google и Facebook. Там ребята выкинули из EFI весь верхний уровень (тот самый Extensible Firmware Interface) и заменили его ядром Linux, которое основную систему затем загружает kexec'ом без всяких интерфейсов, и умирает после этого практически без следа.Это тоже немного странное поделие (нафига вам два ядра Linux в одной системе?), но, хотя тут налицо явное дублирование бинарного кода, но, по крайней мере, исходный код не дублирован… так что это шаг в правильном направлении…
Идея отличная и работает замечательно, но для загрузки произвольной ОС (которой нужен ACPI, к примеру) не подходит, а если начать подводить — снова получится EFI, и далеко не факт, что во второй раз получится лучше.Для загрузки произвольной OS надо бы отделить драйвера от операционки… что в Linux невозможно сделать по политическим причинам.
Вот уж точно, что все относительно. Я делаю на Си структуру данных trie и считал это низким уровнем. :-)
0x000B8000 — 0x000BFFFF — видеопамять цветного режима
Жесть, я думал, что GRUB уже в рельном режиме гурзит ядро.Реальный режим может адресовать только 1MB, а ядро уже давно гораздо больше. Его просто некуда загружать в реальном режиме.
QEMU получает команду использовать двоичный файл boot, который мы только что создали как образ диска. Так как двоичный файл, сгенерированный выше, удовлетворяет требованиям загрузочного сектора (начало в 0x7c00 и завершение магической последовательностью), то QEMU будет рассматривать двоичный файл как главную загрузочную запись (MBR) образа диска.
Загрузка ядра Linux. Часть 1