将 DXE 驱动程序添加到 OVMF 映像

将 DXE 驱动程序添加到 OVMF 映像

这是尝试遵循第一点这个答案

目标

创建一个开发环境来测试我的 DXE 驱动程序是否正确注入 UEFI 固件映像。

第一次尝试

我已经按照vmware-vmx.exe注射指导上一个链接中建议的。这个技巧似乎不再有效,详情请见这个问题

第二次尝试

我没有提取 VMWare bios.rom,而是使用 UEFITool 来OVMF.fd达到同样的目的。

不幸的是,当我尝试使用 启动它时biosQEMU系统挂起并显示消息Guest has not initialized the display yet

我尝试过使用-D log.txt,但没有写入日志。

我也尝试过用标志来gdb连接,但查看程序集并不能帮助我了解失败的原因。QEMU-S -s

我的怀疑

如果一定要选一个原因的话,我会说是secure boot启用了。这不允许运行修改后的固件映像。

第三次尝试

我尝试使用OMVF.fd进行构建edk2,但构建时出现错误。如果我设法让 vanilla 版本工作,那么我会本地添加我的驱动程序。但我还不明白如何做到这一点。

进一步尝试

1 - 了解如何获取 QEMU 日志
2 - 了解如何禁用secure boot

这个问题OVMF_CODE.fd允许安全启动,但我找不到文件OVMF_CODE。这可能是一个可行的解决方案。

3 -OVMF自行构建,本地添加驱动程序
4——还有其他建议吗?

如果对我之前的尝试能提供任何帮助我将非常感激。


编辑,跟踪进展

第二次尝试

删除其中一个默认 DXE 驱动程序不会使其挂起,将其添加回来也不会使 QEMU 挂起。

添加我的驱动程序使其挂起。

对于要用 写入的日志-D,我还必须提供一个-d item,其中 item 是 之一-d help,例如int中断。

我还没有解码这些信息,因为它似乎这样做并不是一件简单的事情,但至少我能够评估 QEMU 是否已经崩溃。

所有日志都有这些INT=0x20,并且 PC 在这两个之间交替:

Servicing hardware INT=0x20
   397: v=20 e=0000 i=0 cpl=0 IP=0038:0000000006c6e115 pc=0000000006c6e115 SP=0030:0000000007e876d0 env->regs[R_EAX]=0000000000344f61

Servicing hardware INT=0x20
   394: v=20 e=0000 i=0 cpl=0 IP=0038:0000000006c6e127 pc=0000000006c6e127 SP=0030:0000000007e876f0 env->regs[R_EAX]=00000000002fc599
关于我的怀疑:

文件OVMF*.dsc开头为:

  #
  # Defines for default states.  These can be changed on the command line.
  # -D FLAG=VALUE
  #
  DEFINE SECURE_BOOT_ENABLE      = FALSE

这似乎意味着安全启动已被禁用。

尽管如此,我还是QEMU选择-bios OVMF.fd使用根据这篇文章不应该与此安全启动有关。

我还需要研究一下。但我认为安全启动不太可能是问题所在,因为我可以OVMF通过 UEFITool 修改映像。

第三次尝试

为了OVMF顺利构建,我必须安装并使用GCC5工具链:

TOOL_CHAIN_TAG = GCC5

本机添加我的驱动程序使 QEMU 挂起:

Guest has not initialized the display yet

日志表明出现异常:

check_exception old: 0xffffffff new 0x6

答案1

如果您有一个包含更改的 EDK2 分支,并且您提供了构建 OVMF 的确切步骤,那么解决问题将变得容易得多。如果没有代码,我们只能给出猜测,而这可能会让您感到沮丧。

我将你的帖子中的引文添加到[电子邮件保护]邮件列表,因为该邮件列表用于代码审查和社区管理。

2022 年 11 月 2 日星期三上午 7:02,d.meneses 通过 groups.io[电子邮件保护]写道:

正如 Super User 上的这篇文章中所述,我正在尝试将 DXE 驱动程序添加到我正在使用 edk2 构建的 OVMF 映像中。没有人能帮助我,所以我来这里寻求您的帮助。我还没有找到任何关于我试图实现的具体目标的正确文档,所以我可能遗漏了一些东西。  

我最近才弄清楚如何为我自己的简单 DXE 驱动程序 CocoDxe 实现这一点,https://github.com/deeglaze/edk2/commit/2397a74ee097787f9e1dbacde213988270603bc8

到目前为止我所做的是:

创建我管理的最简单的 DXE 驱动程序

在文件夹MdeModulePkg/Application/Hello中,我有:Hello.c:include ... while (1) SystemTable->ConOut->OutputString(SystemTable->ConOut, L"It works!\n");

你可能更喜欢

Print(L"It works!\n");

返回EFI_SUCCESS;

  Hello.inf:[定义] INF_VERSION = 0x00010005 BASE_NAME = Hello FILE_GUID = ...

您是否使用了新的 GUID?

  MODULE_TYPE = DXE_DRIVER VERSION_STRING = 1.0 ENTRY_POINT = UefiMain

通常,我认为驱动程序在其公共符号名称之前使用其驱动程序名称的前缀,例如我有 CocoDxeEntryPoint。我只在 UEFI 应用程序源中看到 UefiMain,而不是 DXE 驱动程序。我不确定链接器是否选择了其他 UefiMain 定义并导致您目睹的三重错误。

[资料来源] Hello.c

[包] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec

[库类] UefiDriverEntryPoint UefiLib

[Depex] 真实

将 OvmfPkg/OvmfPkgX64.dsc 设置为我的目标平台,使用 GCC5 作为工具链 将 MdeModulePkg/Application/Hello/Hello.inf 添加到 .dsc 文件中的组件部分末尾(我曾尝试将其添加到其他某些驱动程序之后)。是的,[Components] 似乎是正确的。将 MdeModulePkg/Application/Hello/Hello.inf 添加到 OvmfPkgX64.fdf 中 [FV.DXEFV] 部分的末尾(我也曾尝试将其添加到其他某些驱动程序之后)

是的,我认为这是正确的。

运行构建

什么命令?我按照https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformCI/ReadMe.md

使用生成的 OVMF 映像运行 QEMU:qemu-system-x86_64 -d int -D log.txt -bios OVMF.fd -net none -drive file=fat:rw:bootdrv,format=raw QEMU 挂起并显示消息“Guest has not initialise display (yet)”

当您不包含 DXE 驱动程序时,您会得到什么输出?

log.txt 有一个日志: check_exception 旧的: 0xffffffff 新的 0x6

该日志似乎表明发生了三重故障,这意味着发生了非常错误的事情。

  ,_


Groups.io 链接:

您将收到发送至该组的所有消息。

在线查看/回复 (#95863) | | 将此主题设为静音 | 新主题 您的订阅 | 联系群组所有者 | 取消订阅 [[电子邮件保护]]

,_

相关内容