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

X86 如何在Linux上的NASM中创建UEFI内核,x86,kernel,qemu,osdev,uefi,X86,Kernel,Qemu,Osdev,Uefi,我一直遵循这个操作系统开发指南 但是,我不喜欢windows开发环境,因此我尝试将这些指令转移到我喜欢的Linux环境中 我已经尝试了来自的教程,所有内容都编译正确,我收到了hello.efi文件。。。但我如何从它启动?我使用命令qemu-system-x86_64-bios OVMF.fd-kernel hello.efi-net none,但我只得到了典型的efi外壳 我真正想要的是有一个Linux版本的黑客指南 我还尝试了osdev的本指南和本说明。TL;DR:主要问题是您不能直接使用QE

我一直遵循这个操作系统开发指南

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

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

我真正想要的是有一个Linux版本的黑客指南


我还尝试了osdev的本指南和本说明。

TL;DR:主要问题是您不能直接使用QEMU的
-kernel
选项运行EFI应用程序<代码>-内核用于启动多引导兼容的可执行文件或加载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程序:

这会将
bootdrv
目录作为FAT文件系统装载到emulator中作为第一个硬盘驱动器。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
提示按键。您不必指定
暂停
,只要您运行的程序退出到shell中就很方便了。您可以使用与以前相同的命令运行它:

qemu-system-x86_64 -bios OVMF.fd -net none -drive file=fat:rw:bootdrv,format=raw

这会将
bootdrv
目录作为FAT文件系统装载到emulator中作为第一个硬盘驱动器。EFI将加载
EFI/BOOT/startup.nsh作为启动脚本,并执行其中包含的命令。这应该会自动运行
hello.efi

这是“罗德的书”教程吗?@JonathanDewein:它不依赖于特定的教程。既然你说你能够构建一个名为
hello.EFI
的EFI应用程序,我就把重点放在运行它的真正问题上。一旦您构建了EFI文件(不管您是如何构建的,也不管是什么教程),上面的方法将允许您在Linux上运行它。您不能使用QEMU
-kernel
选项直接运行EFI应用程序。太棒了!非常感谢你的帮助。一开始我很困惑,因为我被带到了一个类似“引导管理器”的地方。一旦我启动到EFI Shell并运行“fs0:”、“hello.EFI”,它就会运行我的EFI hello world应用程序。下一步…使用UEFI进行内核开发。你有什么建议吗?我目前正在uefi.org上阅读规范和一些有趣的白皮书。@JonathanDewein我没有关于使用EFI开发操作系统的实际教程的真正建议。也许在Github上找到现有的代码就是一个起点。
qemu-system-x86_64 -bios OVMF.fd -net none -drive file=fat:rw:bootdrv,format=raw