Написание ОС с UEFI

В последнее время я не слишком много программировал из-за школы, но решил, что хочу снова заняться разработкой ОС. Однако недавно я услышал материал об EFI как о замене BIOS. Я хочу разработать ОС для платформы, которая использует EFI, а не BIOS. У меня проблемы с выяснением, с чего начать. Может кто-то указать мне верное направление? Возможно, объясните, что означает EFI для разработки ОС, и, возможно, расскажите, какие среды тестирования (желательно виртуальные) я могу использовать. Честно говоря, я не совсем уверен, что такое EFI. Также я должен потратить время на изучение сборки ARM? Я знаю сборку x86, но чувствую, что она тоже устарела. Я действительно потерян, и я хотел бы услышать ваш вклад.

Спасибо

3 ответа

Решение

EFI является предшественником UEFI, который люди фактически используют, хотя иногда они все еще называют это EFI. Вы можете получить спецификации на сайте uefi.org.

Спецификация UEFI определяет все, что может потребоваться загрузчику. Спецификации PI определяют интерфейсы, которые производители кремния используют для переносимости своего кода в отрасли. Таким образом, вы услышите об ОС, такой как Win8, требующей соответствия определенной версии спецификации UEFI, такой как 2.3.1c, для работы некоторых функций, таких как безопасная загрузка. Все это говорит о том, что EFI не столько заменяет BIOS, сколько становится стандартом, которому должен соответствовать BIOS для поддержки некоторых операционных систем.

Чтобы начать работу (после того, как вы получите копию спецификаций), вам нужно обратиться к проекту TianoCore на SourceForge. Один из проектов - OVMF, который является целью виртуальной машины для UEFI. Вы также можете посмотреть на цель NT32 для запуска командной строки под Windows. Это действительно замечательные инструменты, которые можно использовать, когда вы хотите создать приложение, такое как загрузчик, которое располагается поверх интерфейсов UEFI.

Что касается изучения сборки, я не рекомендую начинать там. Существует так много информации, и одна из причин, по которой мы создали UEFI, заключается в том, что новые программисты могут работать на C вместо ASM. В UEFI есть несколько мест, где мы используем ASM, но система сборки обрабатывает детали для их интеграции, и вам, как правило, не требуется сложный контроль состояния процессора или производительности, которую вы получили бы от написания КАК М. Единственная другая причина, по которой вы это сделаете, - это размер, и, поскольку остальная часть BIOS будет в C, она в некотором роде откажется от цели, если вы не перепишите все это в ASM, что никто не собирается делать. Сосредоточьтесь на изучении спецификаций и их использовании для написания собственных приложений UEFI.

Поздний ответ на этот вопрос, но я могу добавить следующие моменты, если вы не обнаружили их в это время:

Может быть, объяснить, что EFI означает для разработки ОС

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

Плюс в том, что если вы готовы использовать загрузчик, который соответствует multiboot 2, вам на самом деле ничего не нужно знать о UEFI - загрузчик загрузит вас в соответствии со спецификацией multiboot, затем вызовите ExitBootServices() который в терминах UEFI разрушает среду прошивки.

Можно создать ядро ​​Linux, которое имеет заглушку EFI и, следовательно, загружается "без" загрузчика - этот блог покажет вам, как это сделать. Вы можете сделать это для своего ядра - вам просто нужно создать ядро ​​PE/COFF, соответствующее разрядности прошивки.

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

Если вы можете позволить себе VMWare Workstation, это вам очень поможет. Помимо заглушки gdb, позволяющей отлаживать любую часть чего-либо, вы также можете редактировать файлы определений виртуальной машины (*.vmx), чтобы они содержали

firmware="efi"

и вуаля, VMWare загрузит полностью рабочую среду UEFI. Работает с Linux и Windows.

В различных публикациях в Интернете упоминаются настройки QEMU и, конечно, VirtualBox. Я никогда лично не загружал ни одну существующую систему на платформе VirtualBox EFI, и я не пробовал QEMU, хотя я верю в это и, возможно, работают другие эмуляторы.

Также я должен потратить время на изучение сборки ARM?

Это зависит от ваших целей. По вопросу сборки, я думаю, вы должны знать, чтобы написать ОС. Я не думаю, что имеет значение для какой платформы вы пишете - на самом деле, я думаю, что написание для нескольких людей сделает вас более благодарными за различия между машинами.

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

Вы можете использовать qemu для разработки / тестирования приложений UEFI. Смотрите это для получения дополнительной информации

Кроме того, я бы настоятельно рекомендовал ознакомиться с UEFI и попытаться разработать драйвер / приложение в модели UEFI. Вы можете попробовать такие вещи, как запуск сетевого стека из загрузчика, инфраструктура сетевой загрузки, возможно, настройка более аккуратного пред-ОС GUI. Это не только поможет вам в uefi, но и поможет понять детали платформы.

Это мое мнение, но комментарии выше полезно иметь в виду.

Другие вопросы по тегам