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

时间:2019-03-28 23:35:23

标签: x86 kernel qemu osdev uefi

我一直在遵循本指南进行操作系统开发OS Development on Windows

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

我已经尝试过Rod's Books上的教程,并且一切都可以正确编译,并且我收到hello.efi文件...但是如何从中引导?我使用命令<script src="http://d3js.org/d3.v4.min.js" charset="utf-8"></script> <script src="http://d3js.org/topojson.v1.min.js"></script> <script src="https://d3js.org/d3-queue.v2.min.js"></script>,但是我只得到了典型的EFI Shell。

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

我还尝试了kalzlauskas中的本指南和osdev UEFI Bare Bones中的本说明。

1 个答案:

答案 0 :(得分: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.efi,并且pause提示按一个键。您不必指定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