【问题标题】:How to create bootable application image (efi)?如何创建可启动应用程序映像 (efi)?
【发布时间】:2021-05-16 04:14:01
【问题描述】:

我尝试在 UEFI 环境中启动精灵微内核。所以我编译了一个最小的引导加载程序并创建了一个 ESP 映像。如果我通过 HDD 引导,这工作正常,但我想通过 q​​emu -kernel 选项直接引导它(这是我使用 AMD SEV 时的一些特殊要求)。这不起作用。

如果我使用包含胖映像的 grub mkimage,我可以像这样使用 grub 启动内核,例如:

mcopy -i "${basedir}/disk.fat" -- "${basedir}/kernel" ::kernel
mcopy -i "${basedir}/disk.fat" -- "${basedir}/module" ::module

grub-mkimage -O x86_64-efi 
             -c "${basedir}/grub-bootstrap.cfg" 
             -m "${basedir}/disk.fat" 
             -o "${basedir}/grub.efi"  

但我的系统的目标是极简主义和安全性,因此是微内核,所以 grub 及其漏洞是毫无疑问的。

所以我的问题是: 如何创建类似于 grub-mkimage 的可启动应用程序映像?

我已阅读有关 efi 存根启动的信息,但无法真正弄清楚如何构建 efi 存根映像。

通常我是一个裸机嵌入式程序员,所以整个 uefi 启动对我来说有点奇怪。我很高兴有任何提示或建议。另外我认为堆栈溢出可能不是解决此类低级问题的最佳场所,您能推荐其他论坛吗?

【问题讨论】:

  • 我已经阅读了一些文章,但找不到将精灵和引导加载程序包含到单个应用程序映像中的方法,您知道具体的吗?

标签: c linux kernel boot uefi


【解决方案1】:

我想通过 q​​emu -kernel 选项直接启动它

为什么?这是一个特定于 qemu 的 hack,在其他任何东西(包括任何真实的计算机)上都不存在。通过使用这个 hack,您唯一要做的就是无法测试您通常用来启动的任何东西(因此无法测试任何真正重要的东西)。

(这是我使用 AMD SEV 时的一些特殊要求)

这没有任何意义(这有点像说“我的耳朵里有一根香蕉,因为我正在努力学习如何弹钢琴”)。

AMD 的 SEV 是一组旨在增强虚拟机安全性的扩展,与您的启动方式(或者您是从 BIOS 还是 UEFI 或特定于 qemu 的 hack 启动)无关。

我很高兴收到任何提示或建议。

我的建议是停止使用特定于 GRUB(多引导)、特定于 Qemu (-kernel) 和特定于 Linux/Unix (elf) 的工具,并实际尝试使用 UEFI。这将要求您使用(Microsoft 的)PE32+ 文件格式编写自己的引导加载程序,该文件格式本身使用 UEFI 的服务。请注意,GNU 的工具(他们的 GCC 的“Gnu-EFI”东西)相对糟糕(它在 ELF 文件周围放置了一个 PE32+ 包装器,并进行运行时修补以使生成的 Franken-monster 工作);现在有更好的选择(例如 Clang/LLVM/lld 工具链)。

如果您关心安全性,那么还需要了解 UEFI SecureBoot(以及密钥管理和数字签名)。如果您关心安全虚拟机,我还建议您了解 AMD 手册中的 SKINIT 指令(用于在启动后创建动态信任根);但不要忘记这是 AMD 特定的,不会不能在任何 Intel CPU 上工作,而且大多已经过时(BIOS 和 TPM 中的“可信测量”东西大多被 SecureBoot 取代),而且(即使在 Intel CPU 上)如果你只是来宾,那么管理程序可以以任何它想要的方式模拟它(它不能保证任何东西都是安全的)。

最后;请注意,直接启动微内核也没有多大意义。微内核中没有设备驱动程序;因此,在启动微内核后,您最终会遇到“无法启动任何设备驱动程序,因为没有设备驱动程序”的问题。相反,您需要加载许多文件(例如,可能是初始 RAM 磁盘),然后(例如)启动某种“启动日志处理程序”(以显示错误消息等);然后找到并启动内核,然后启动其他进程(例如“设备管理器”来检测设备和驱动程序;“VFS 层”来处理文件系统和文件 IO 等)。对于整个事情;启动内核只是一个相对微不足道的小步骤(只不过是启动一个提供多任务处理的全局共享库),隐藏在完成所有工作的大量代码中。

可悲的是;直接启动单片内核是有意义的,因为它可以包含所有驱动程序(或者至少,如果内核的可执行文件是具有动态加载驱动程序的“模块化单片”,则它具有足够的内置内存来处理初始 RAM 磁盘);大多数初学者教程都假设这种“不属于任何微内核的东西的整体”想法。

【讨论】:

  • 谢谢,我现在讨论了大部分问题,但我会看看 Clang 和 LLVM。现在,一个快速的“hacky”解决方案可以用于测试。
猜你喜欢
  • 2014-05-03
  • 2021-01-24
  • 2020-08-21
  • 2018-01-06
  • 2020-04-07
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多