这是尝试遵循第一点这个答案。
目标
创建一个开发环境来测试我的 DXE 驱动程序是否正确注入 UEFI 固件映像。
第一次尝试
我已经按照vmware-vmx.exe
注射指导上一个链接中建议的。这个技巧似乎不再有效,详情请见这个问题。
第二次尝试
我没有提取 VMWare bios.rom
,而是使用 UEFITool 来OVMF.fd
达到同样的目的。
不幸的是,当我尝试使用 启动它时bios
,QEMU
系统挂起并显示消息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) | | 将此主题设为静音 | 新主题 您的订阅 | 联系群组所有者 | 取消订阅 [[电子邮件保护]]
。,。,_