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
.