Как создать ядро ​​UEFI в NASM в Linux

Я следовал этому руководству по разработке ОС. Разработка ОС в Windows

Однако мне не нравится среда разработки Windows, поэтому я пытаюсь перенести эти инструкции в свою предпочтительную среду Linux.

Я попробовал руководство из Книги Рода, и все компилируется правильно, и я получить файл hello.efi ... но как с него загрузиться? Я использую команду qemu-system-x86_64 -bios OVMF.fd -kernel hello.efi -net none, но у меня просто обычная оболочка EFI.

Чего я действительно хотел бы, так это иметь версию руководства Hacker Pulp для Linux.

Я также пробовал это руководство от kalzlauskas и эти инструкции от osdev UEFI Bare Bones.


person Jonathan Dewein    schedule 28.03.2019    source источник


Ответы (1)


TL; DR: основная проблема заключается в том, что вы не можете запустить приложение EFI напрямую с параметром QEMU -kernel. -kernel предназначен для запуска исполняемых файлов, совместимых с Multiboot, или для загрузки файлов bzImage Linux.


Поскольку ваш вопрос предполагает, что вам удалось скомпилировать и связать приложение EFI с одним из руководств, в этом ответе основное внимание будет уделено методам его запуска с помощью QEMU. Какое руководство или метод вы использовали для создания самого приложения EFI, не имеет значения.

Используйте эту команду в каталоге проекта, чтобы создать серию подкаталогов для использования в качестве загрузочного диска EFI:

mkdir -p bootdrv/EFI/BOOT/

Вам нужно создать каталоги только один раз. Как только они будут созданы, скопируйте ваш hello.efi файл в файл с именем bootdrv/EFI/BOOT/BOOTX64.EFI. EFI/BOOT/BOOTX64.EFI - это файл загрузки по умолчанию для 64-разрядного UEFI. В 32-битном UEFI загрузочный файл по умолчанию - EFI/BOOT/BOOTIA32.EFI. Выполните следующую команду, чтобы запустить вашу программу EFI:

qemu-system-x86_64 -bios OVMF.fd -net none -drive file=fat:rw:bootdrv,format=raw

При этом каталог bootdrv монтируется как файловая система FAT в эмуляторе в качестве первого жесткого диска. 64-битная EFI должна автоматически запустить файл EFI/BOOT/BOOTX64.EFI


В качестве альтернативы вы можете скопировать свой hello.efi файл в каталог bootdrv/EFI/BOOT/ и создать сценарий запуска с именем bootdrv/EFI/BOOT/startup.nsh, содержащий следующие команды:

\EFI\BOOT\hello.efi
pause

EFI/BOOT/startup.nsh - это сценарий запуска по умолчанию, который будет запускаться при отсутствии приложения EFI по умолчанию. Файл должен содержать пустую строку после последней команды. Команда \EFI\BOOT\hello.efi запускает hello.efi и pause предлагает нажать клавишу. Вам не нужно указывать pause, просто удобно, если программа, которую вы запускаете, выходит обратно в оболочку. Вы можете запустить его той же командой, что и раньше:

qemu-system-x86_64 -bios OVMF.fd -net none -drive file=fat:rw:bootdrv,format=raw

При этом каталог bootdrv монтируется как файловая система FAT в эмуляторе в качестве первого жесткого диска. EFI загрузит EFI/BOOT/startup.nsh как сценарий запуска и выполнит содержащиеся в нем команды. Это должно автоматически запуститься hello.efi.

person Michael Petch    schedule 29.03.2019
comment
Это для учебника «Книги Рода»? - person Jonathan Dewein; 29.03.2019
comment
@JonathanDewein: Это не зависит от конкретного урока. Поскольку вы сказали, что смогли создать приложение EFI под названием hello.efi, я сосредоточился на вашей реальной проблеме его запуска. После того, как вы создали свой файл EFI (независимо от того, как вы его создали или какое руководство) - описанный выше метод позволит вам запустить его в Linux. Вы не можете использовать параметр QEMU -kernel для прямого запуска приложения EFI. - person Michael Petch; 29.03.2019
comment
Потрясающие! Спасибо большое за вашу помощь. Сначала я был сбит с толку, потому что меня привели к своего рода диспетчеру загрузки. Как только я загрузился в EFI Shell и запустил fs0: ',' hello.efi ', ​​он запустил мое приложение EFI hello world. Следующий шаг ... разработка ядра с UEFI. Есть ли у вас какие-нибудь предложения? В настоящее время я читаю спецификации и некоторые интересные официальные документы на uefi.org. - person Jonathan Dewein; 29.03.2019
comment
@JonathanDewein У меня нет реальных рекомендаций относительно реальных руководств по разработке ОС с использованием EFI. Вероятно, поиск существующего кода на Github, который делает это, станет отправной точкой. - person Michael Petch; 29.03.2019