【问题标题】:Kernel mode programming using simplistic c++?使用简单的 C++ 进行内核模式编程?
【发布时间】:2012-01-13 12:54:38
【问题描述】:

我即将深入研究内核领域。我的问题与编程语言有关。我见过大多数用 C 编写的教程。我目前使用 C++ 和汇编编程。在C++之前我也学过C,但是用的不多。是否可以在不使用任何高级结构的情况下使用简单的 C++ 在内核模式下进行编程?基本上,我试图避免两种语言之间存在的细微差别(比如 C 中没有 bool,没有从 main 自动返回 0,真正的细微差别)。我不会使用模板、类等。那么是否有可能使用简单的 C++ 在内核模式下进行编程而没有任何大的烦恼?

【问题讨论】:

  • 你是指Windows内核开发还是其他操作系统开发?
  • Windows内核开发,抱歉
  • 如果你同意 C 是简单化的 C++...
  • 您可能想阅读 Microsoft 的 commentary 关于该主题的内容。如果您在阅读后有更具体的问题,您可能想在新的/单独的问题中提出。
  • 如果不尝试使用主要的 C++ 特性,就很难使用 C++。

标签: c++ windows kernel wdk


【解决方案1】:

即使没有官方支持,您也可以使用 C++ 作为 Windows 内核开发的开发语言。 您应该注意以下事项:

  • 您必须定义 new 和 delete 运算符以映射到 ExAllocatePoolWithTag 和 ExFreePool。

  • 尽量避免使用虚函数。似乎无法控制对象 vtable 的位置,如果它位于可分页部分并且您的代码使用 IRQL >= DISPATCH_LEVEL 调用,这可能会产生意外结果。

  • 如果在 IRQL >= DISPATCH_LEVEL 上使用之前,您仍然需要使用虚拟方法表而不是锁定 .rdata 段。

除了这些限制之外,您还可以使用 C++ 进行驱动程序开发。

【讨论】:

  • +1 表示 vtable 陷阱。我正要提到同样的事情。
  • 谢谢!所以我看到有一些并发症。你会提倡使用 C 还是使用 C++?我对此有点困惑。
  • 使用 C++ 作为更好的 C 可以正常工作。当编译器生成代码时会出现复杂情况 - 包括模板、vtables 和默认构造函数以及标量删除存根等内容。您无法控制 C++ 编译器决定在可执行文件的哪个部分发出这些信息,这意味着当需要它们的代码不能时,它们可以是可分页的。这可能会导致一些严重的问题。如果你小心,你可以避免这种情况。
  • @ThierryFranzetti 在 WDK 8 中,可以在类级别进行分页控制,从而确保 vtable 的位置。值得一提的另一件事是不要使用异常。
【解决方案2】:

如果您想在 WDK 中执行 C++,请添加两个链接。这是一次性设置工作。

The NT Insider:Guest Article: C++ in an NT Driver

The NT Insider:Global Relief Effort - C++ Runtime Support for the NT DDK

已经看到内核代码使用了大量的自动锁/智能指针;虽然它们使代码整洁,但我觉得它有一个让初学者完全理解的学习曲线,如果被滥用,大量的构造/破坏代码会减慢速度。

【讨论】:

    【解决方案3】:

    如果您仔细编写代码,了解每个定义、运算符、调用等背后的确切含义,那么用 C++ 编写内核代码应该没有问题。上面 cmets 中提到的 Microsoft 文档是一本很好的阅读材料,因为它描述了 C++ 不如 C 透明或不提供类似重要保证的情况,并且从中您知道应该避免什么。

    【讨论】:

      【解决方案4】:

      微软写了一个guide。基本上他们告诉我们要避开任何东西,除了使用 C++ 的变量声明的宽松规则......叹息。其他任何事情,你都是你自己的。无论如何,它不会那么糟糕,但这里有一些你需要记住的例子:

      • 在分页池中分配的内存可以被分页。如果您在IRQL 高于 PASSIVE_LEVEL 时尝试访问它,那么您就完蛋了(或者至少当您的客户抱怨您的驱动程序 BSODding 他们的系统时,您会每隔一段时间就会遇到这种情况)!在负载下的低内存系统上测试您的驱动程序!
      • 非分页池是有限的,您很可能无法从中分配所有需求。
      • 堆栈比用户模式下要小得多 ~12-24K。
      • 您所做的任何涉及内核中浮点路径的操作都必须受到KeSaveFloatingPointStateKeRestoreFloatingPointState 的保护
      • C++ 异常:

      阅读指南了解更多信息。现在,如果您可以确保生成的代码符合规则,请继续使用 C++。

      【讨论】:

      • 本指南有点过时了。 Max NonPaged pool 是物理 RAM 的一半,那么将所有代码标记为不可分页会占用多少内存?其他点是对的。
      猜你喜欢
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2018-02-22
      • 2012-06-15
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      相关资源
      最近更新 更多