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