1

最近在学习 UEFI(建议替换 BIOS)时,我尝试编写一些东西并使用 EDK2 进行编译。ide 是生成 .EFI 二进制文件,我可以在进入 UEFI shell 时启动它。我能够这样做。完美!

现在我的代码涉及纯 C 风格(基本上缺少 C++ 工具,例如类、构造函数、虚拟和 STL 容器类)。我想知道我是否可以使用 STL 容器类(如字符串、向量、哈希映射)并且仍然能够为 UEFI 编译和运行我的 .EFI?

我研究了一下,发现很多气馁!基本上,我收集到的是:

  1. UEFI 与 C 密切相关。开源实现不支持 C++
  2. 不支持新建和删除。
  3. vtable 生成依赖于编译器,因此生成的代码不可移植

此外,从这个网站可以学到很多东西: UEFI Programming

但不幸的是,我很困惑!

我的问题是我可以在我的代码中使用 STL 类(std::string/std::vector/std::map)并使用 EDK2 为 UEFI 环境编译它吗?

如果有人能指出我要寻找的解决方案/方向,我将不胜感激。现在,我正在使用的唯一选择是在此处找到的容器的 C 实现: UTHash 实现

有办法吗?

4

2 回答 2

2

问题不在于内存或 vtable。UEFI 具有高效的动态内存分配。并且可以实现新建和删除。和 vtable 一样,在内部它只是一个常规的 C 结构!但问题是 STL会引发异常。例外情况取决于平台/操作系统。在下面的 Windows STL 异常中,使用 SEH(结构化异常处理),它依赖于操作系统,并且与线程内部密切相关。在 UEFI 中没有这样的机制,但它可以实现。尽管这是一项非常重要的任务。

于 2015-05-07T19:58:36.677 回答
1

第2点不应该是一个大问题。对每个容器模板的默认参数的依赖newdelete主要是通过。std::allocator但这只是一个默认值。提供您自己的分配器(使用 UEFI 上可用的任何内存分配),您就有很大的机会让它工作。

无论如何,您的 STL 实现不太可能使用 vtables,因此 3 也没什么大不了的。不过,<iostream>将是另一回事。

于 2014-03-04T13:34:47.330 回答