如何在Linux上的NASM中创建UEFI内核

问题描述 投票:3回答:1

我一直在关注OS开发OS Development on Windows的这本指南

但是,我不喜欢Windows开发环境,因此我尝试将这些指令转移到我首选的Linux环境中。

我已经尝试过来自Rod's Books的教程,并且所有内容都编译正确,我收到了hello.efi文件......但是我如何从它启动?我使用命令qemu-system-x86_64 -bios OVMF.fd -kernel hello.efi -net none,但我得到了典型的EFI shell。

我真正想要的是拥有Linux版本的Hacker Pulp指南。

我也尝试过kalzlauskas的这个指南,以及来自osdev UEFI Bare Bones的指示。

x86 kernel qemu osdev uefi
1个回答
5
投票

TL; DR:主要问题是您不能直接使用QEMU的-kernel选项运行EFI应用程序。 -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.efipause提示按一个键。您不必指定pause,如果您运行的程序退出到shell,这很方便。您可以使用与以前相同的命令运行它:

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

© www.soinside.com 2019 - 2024. All rights reserved.