问题标签 [edk2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - EDK2(UEFI 开发环境)在执行测试构建后失败
我正在使用 EDK2 和 Visual Studio 2019。我按照说明在 Windows 系统上设置 EDKII 构建环境。在 Windows 命令行上发送以下命令“edksetup.bat Rebuild”后,我收到以下消息。
...
是因为 Visual Studio 2019 的兼容性还是“BrotliCompress”有什么问题?我将标签更改为 TOOL_CHAIN_TAG = VS2019x86。但它没有用。为了 VS2019 兼容性,我还应该改变什么?与 NMAKE 文件有什么关系?
我测试了旧版本的 EDK2,它可以工作。但问题是我使用的是 VS2019,我想使用 edk2-stable201911。旧版本 (edk2-stable201908) 最多只能支持 VS2017。在 tools_de.txt 中没有 VS2019 的“通用路径宏”。上述错误是使用edk2-stable201911的结果
filesystems - EFI 应用程序错误写保护
我尝试对我列举的文件系统进行一些写/读操作。问题是当我想写入其他卷而不是我自己 (fs0) 时,它将返回WRITE PROTECTED
错误。
我也试过了ShellCreateDirectory
,ShellWriteFile
。我真的可以从 EFI 应用程序访问写入硬盘 (pci) 吗?
编辑:
drivers
命令输出:
uefi - 无法使用“GetSectionFromAnyFv”获取文件或使用固件卷协议->GetNextFile 遍历所有文件
我下载了 BIOS rom 并使用 UEFITool 获取文件列表: ROM Structure
所以我知道所有存在的文件的“名称”。然后我尝试使用“GetSectionFromAnyFv”获取文件,但无法获取所有文件,只能获取红色箭头下卷中的文件。例如紫色箭头下的音量也有文件,但我无法得到它。
LocateHandleBuffer (ByProtocol, &gEfiFirmwareVolume2ProtocolGuid, NULL, &NumberOfHandles, &HandleBuffer) 只返回 1 个句柄 [NumberOfHandles = 1],但我可以看到有超过 1 个卷。
如果我尝试使用 for(for NumberOfHandles) 获取文件并遍历所有获取 guid 的文件,则相同。只是无法获取所有文件。
可能是什么问题呢?PS:每个 FV2 HOB 的 ProcessFirmwareVolume 返回 20,这意味着“固件卷块协议”已经被处理。
- 获取所有支持 FV2 协议的句柄;
- 处理所有 HOB,因此支持 FV2 协议的句柄数量可能会增加;
- 对于 FV2 协议,我获取句柄数,然后获取卷名(支持 FV2 协议的句柄的设备路径)和文件数:在这里我可以看到并非所有卷都已处理;
- GetSectionFromAnyFv(*) 然后不使用简单文件系统协议的部分和最后保存文件。
uefi - 如何设置 dxe 驱动程序加载顺序?
据我所知,DXE 调度程序首先加载在 Apriori 文件中指定的驱动程序。然后加载其他考虑依赖项。我想在 AMITSE 之前或之后加载实用程序。如果在 AMITSE 之后的想法是 CreateEvent(EVT_SIGNAL_EXIT_BOOT_SERVICES, ..., MAINFCN,...),但在 MAINFCN 中我无法处理其他事件。也许更好的策略是在收到 EVT_SIGNAL_EXIT_BOOT_SERVICES 时加载 UEFI_APPLICATION?
我要解决的主要问题是 AMITSE 屏幕之间的执行驱动程序(邀请按键进入设置和设置屏幕)。
所以我尝试了:
- 将驱动程序放在卷中的不同位置 - 没有解决问题(驱动程序在 AMITSE 邀请屏幕后加载)。
- 将 TRUE 放在 [depex] 部分 - 根本没有加载驱动程序。
- CreateEvent(..) - 不能处理其他事件(捕捉按键)。
没试过:
- 在执行启动服务之前会引发事件以加载应用程序的驱动程序。
也许有更简单的方法?
uefi - 在 LocateProtocol 服务之后是否需要 CloseProtocol 服务?
嗨,我是学习 UEFI 并试图找出使用协议的逻辑的初学者。
我已阅读 和 的源CoreOpenProtocol
代码。CoreCloseProtocol
CoreLocateProtocol
我发现虽然CoreOpenProtocol
会创建一个OPEN_PROTOCOL_DATA
结构并链接到PROTOCOL_INTERFACE->OpenList
,CoreLocateProtocol
但不会创建这样的结构。
CoreCloseProtocol
实际上会删除OPEN_PROTOCOL_DATA
fromPROTOCOL_INTERFACE->OpenList
并释放它占用的内存。
所以既然CoreLocateProtocol
不创建OPEN_PROTOCOL_DATA
,关闭程序似乎毫无意义。
真的吗?
非常感谢!
uefi - AllocatePages 将内存类型的 EFI_INVALID_PARAMETER 返回为 EfiConventionalMemory?
您好我正在使用 edk2 为内核编写引导服务,并且需要应用AllocatePages
服务来应用类型为 EfiConventionalMemory 的内存。
但是,它返回 EFI_INVALID_PARAMETER 的错误代码。
我查看了git的源代码,实际功能如下:
它调用函数CoreInternalAllocatePages
,如下:
因此,如果内存类型为 EfiConventionalMemory,它实际上会返回 EFI_INVALID_PARAMETER。
我还阅读了UEFI 规范,该规范在调用之前将 EfiConventionalMemory 定义为“空闲(未分配)内存”类型,之后将其定义为ExitBootServices()
“可用于一般用途的内存”。
所以我有点困惑,如果我得到 EFI_INVALID_PARAMETER 是正常的,如果不是,我应该怎么做才能获得正确的内存分配?
非常感谢!
qemu - 在linux中构建edk2
我开始用 edk2 编写一个小而简单的应用程序。
所以要编写一个简单的 edk2 UEFI 应用程序,我是这样开始的:
#git 克隆https://github.com/tianocore/edk2.git
(在那里,我放了:TARGET_ARCH = IA32 X64 TOOL_CHAIN_TAG = VS2017)
为什么构建失败?是因为存储库不好??构建后如何创建 OVMF.fd 文件?
c - 将 CHAR16 变量添加到字符串
我是 C 的新手,正在尝试修改和编译 EDK2 EFI 程序。
我要更改的程序部分有一个函数MsgLog
,它接受一个Char16 *
变量并使用它来写入日志文件。
当前代码有这个
状态是一个 EFI_STATUS,可以是“成功”或“未找到”。IE,您可以在日志文件中获取以下内容:
或者
我想将其更改为:
或者
我已经加载 : ABC
或 : XYZ
进入一个Char16 *
变量(必须是 Char16 * 以匹配用于设置它的函数的其他限制)
然后我尝试了各种选项将其附加到字符串中,例如
和
但我最终得到
和
我不确定我应该使用什么格式占位符,或者我是否应该或如何将 myVariable 转换为其他适当的格式,并希望得到一些指示。
请注意,这是一个更广泛的程序,我正在更改其中的一小部分,并且我没有定义不同变量类型的范围。
编辑:添加上下文
原始工作代码
问题代码
uefi - 是否可以在 Visual Studio 中使用 GNU-EFI 中的标准 libc 功能?
我正在使用 gnu-efi 作为 Visual Studio 2019 项目。我的 UEFI 程序在真实硬件上按预期工作。下一步,我需要像“ pow(...); ”这样的C特性。自然,在使用 efi 时,所有这些功能都被禁用。当我直接包含<math.h>时,我得到unresolved external ... error。如果我启动一个成功构建的不受限制的项目。
我问过它,有人建议我下载 EDK2 libc,但我不知道如何在我的项目中使用它,或者它是否适用于 GNU-EFI。我不知道该怎么做才能使用 C 功能。如果有人告诉我该怎么做,我会很高兴。
assembly - ARMv8 AARCH64 - 错误:立即超出范围
我开始为 ARMv8 编写程序集,但在比较值以创建条件代码时遇到错误:
第一种方法:
但是当我托盘编译代码时,我收到了消息:“错误:立即超出范围”。
我还更改了代码以从cmp
指令中删除立即数,如下所示:
第二种方法:
在这种方法中,我可以编译代码,但是当我运行代码时,我得到的值不同于零(0xF03730B4)。这是我的C 代码:
最后,如果我#0xff
在第一种方法中使用一个小的立即数,一切正常。有什么办法可以使这种比较有效吗?如果我错过了什么,我不会。
感谢你们。