【问题标题】:Is it possible to develop a loadable kernel module (LKM) on Linux with C++?是否可以使用 C++ 在 Linux 上开发可加载内核模块(LKM)?
【发布时间】:2012-05-06 08:23:15
【问题描述】:

当我开发可加载内核模块 (LKM) 时,我应该使用 C 吗?

是否可以在 Linux 上使用非 C 语言(例如 C++)开发可加载内核模块 (LKM)?

【问题讨论】:

    标签: c++ c linux-kernel


    【解决方案1】:

    这在一定程度上是可能的,但请注意(来自http://www.tux.org/lkml/#s15-3):

    用 C++ 编写新的驱动程序是个好主意吗? 简短的回答是 不,因为内核中不支持 C++ 驱动程序。

    为什么不在内核中添加一个 C++ 接口层来支持 C++ 驱动程序? 简短的回答是为什么要麻烦,因为没有任何 C++ 驱动程序 Linux。

    我认为最好的办法是查阅现有资源(有几本内核驱动书籍,包括网上免费的一本),都是用 C 语言编写的,搞清楚基础知识,然后你可以试试看能不能搞定c++ 在那里工作。

    但我非常怀疑这会很容易。您甚至无法访问内核中的完整 C 标准库。需要考虑的一点:它不链接到共享库,并且总可执行映像通常为 2-3 MB。

    【讨论】:

    • 除此警告外,请记住,如果您的驱动程序不在 C 语言中,则无法将其接受到 Linus 的树中。
    • 用 C++ 编写的程序不需要任何共享库,无需标准库甚至无需 malloc 即可工作。我们可以将 C++ 作为系统语言的角色视为 C 的扩展。更好的语法,OOP。我个人用混合 C/C++ 为裸机微控制器编写了很多代码,并且都运行良好。所以我相信C++语言没有问题,问题在于编译器和每个Linux头文件周围的extern "C" {}
    【解决方案2】:

    我很确定我在某个地方看到了一个内核配置选项,允许在内核模块中使用 C++,不久前(但无法再次找到它)。 我可以看到某些模板在驱动程序模块中使用会非常有趣。仅供参考:OS X Mach 内核部分是用 C++ 编写的。

    【讨论】:

      【解决方案3】:

      最终归结为目标代码,由汇编器生成并随后链接在一起。

      所以是的,有可能,你会发现关于 here 的辩论。

      这取决于你想用 LKM 做什么,你想将它用于自己和一些实验,还是会在任何地方变得富有成效?

      【讨论】:

        【解决方案4】:

        有一个操作系统正在用 C++ 重写 Linux 内核,它被称为 Boss-Mool,您可以使用 C++ 编写驱动程序。这是链接:https://www.bosslinux.in/boss-mool

        【讨论】:

          【解决方案5】:

          嗯,最初的问题是针对 Linux,而不是 OS X 或 Windows 之类的。

          绝对没有办法用 C++ 编写 Linux 内核模式驱动程序! 那是因为您需要与不会与您的模块链接的 libstdc++ 链接。 libstdc++ 不能用于内核模式,就这么简单!

          【讨论】:

          • 这对已经在这里的关于这样做的糟糕智慧的补充很少,但它在技术上也是错误的,因为必要的支持可以包含在模块本身中,就像可以使用 C++对于根本不支持共享库的嵌入式目标。其他答案的作者考虑到了这一点。
          猜你喜欢
          • 2015-04-24
          • 1970-01-01
          • 1970-01-01
          • 2021-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-30
          相关资源
          最近更新 更多