UEFI编译代码中的STL容器类

时间:2014-03-04 11:39:20

标签: c++ c stl uefi

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

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

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

  1. UEFI与C紧密相关。开源实现不支持C ++
  2. new并且不支持删除。
  3. vtable生成依赖于编译器,因此生成的代码不可移植
  4. 此外,还有很多东西需要从这个网站上学到: UEFI Programming

    但不幸的是我感到困惑!

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

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

    有办法吗?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

你的STL实现不太可能使用vtable,所以3也不是什么大问题。但是,<iostream>将是另一回事。