如何在Windows内核中使用std :: map?STLPort的?

xml*_*lmx 8 c++ windows kernel stl cross-platform

在我最近的项目中,std::map强烈要求数据结构.但是,std::map使用C++异常的默认实现,在Windows内核中是不允许的.

我认为很难std::map在短时间内重新发明而没有任何错误或性能损失.所以,我想知道std::mapWindows内核中是否存在替换.

STLPort可能是候选人.但我不知道如何提取它的std::map唯一和禁用C++异常.

seh*_*ehe 4

内核模式下的 C++ 代码有几个(严重的)限制,这些限制先于没有(完整的)标准库的问题。

\n\n

请参阅http://msdn.microsoft.com/en-us/library/windows/hardware/gg487420.aspx

\n\n
\n

虽然目前还不可能为内核模式代码中使用的 C++ 的 \xe2\x80\x9c 完全安全\xe2\x80\x9d 子集提供严格且可测试的定义,但对于通常安全的构造,可以使用一些有用的指南以及那些通常不是的。

\n
\n\n

\n\n
\n

内核模式驱动程序的 C++ 问题

\n\n

Microsoft 开发人员发现 C++ 在许多领域给内核模式驱动程序带来了特殊问题。

\n\n

内存中的代码

\n\n

使用 C++ 编写内核模式驱动程序的最严重问题是内存页的管理,特别是内存中的代码,而不是数据。大型驱动程序可分页非常重要,并且分页代码并不总是位于内存中。在系统进入无法发生分页的状态之前,必须驻留所有需要的代码。

\n\n

C++ 编译器为非 POD 类和模板生成代码的方式使得了解执行函数所需的所有代码可能去哪里变得特别困难,因此很难使代码安全地可分页。编译器至少会自动为\n以下对象生成代码。这些对象被放置在 \xe2\x80\x9c 行之外,\xe2\x80\x9d 并且开发人员无法直接控制它们插入的部分,这意味着\n 它们可能会在需要时被调出。

\n\n
    \n
  • 编译器生成的代码,例如构造函数、析构函数、强制转换和赋值运算符。(这些通常可以明确提供,但需要小心地认识到需要提供它们。)
  • \n
  • 调整器 thunk,用于在层次结构中的各个类之间进行转换。
  • \n
  • 虚函数thunks,用于实现对虚函数的调用。
  • \n
  • 虚函数表thunks,用于管理基类和多态性。
  • \n
  • 模板代码体,除非显式实例化,否则在第一次使用时发出。
  • \n
  • 虚函数表本身。
  • \n
\n\n

C++ 编译器不提供直接控制这些实体在内存中的位置的机制。控制内存布局所需的编译指示在设计时并未考虑到 C++。

\n\n

图书馆

\n\n

创建和使用库有许多不同的问题:

\n\n
    \n
  • 导出的 C++ 函数的名称可能因版本而异。
  • \n
  • 并非所有在用户模式下可用的函数在内核模式库中都可用。
  • \n
  • 标准模板库设计用于处理来自单个 DLL 的数据对象。
  • \n
\n
\n