我一直在遵循本指南进行操作系统开发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中的本说明。
答案 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
。