Как создать ядро ​​UEFI в NASM на Linux - PullRequest
3 голосов
/ 29 марта 2019

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

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

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

Что мне действительно нужно, так это иметь Linux-версию руководства Hacker Pulp.

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

1 Ответ

5 голосов
/ 29 марта 2019

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


Поскольку ваш вопрос предполагает, что вам удалось скомпилировать и связать приложение 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.

...