【问题标题】:Print messages in kernel module using c++使用 C++ 在内核模块中打印消息
【发布时间】:2014-04-24 07:43:32
【问题描述】:

我正在编辑一个用 C++ 编写的内核模块。我想要一个打印消息的函数,但我想我不能使用cout 或任何标准输入/输出流库函数,因为该模块位于内核空间中。

我已尝试包含 iostream 库:

....
#include <iostream>
....

当我使用g++ 编译时,我得到:

 error: iostream: No such file or directory
 error: 'cout' was not declared in this scope

【问题讨论】:

  • Linux 内核不支持任何 C++ 运行时库。
  • 我尝试使用kprintf,但出现错误'kprintf' was not declared in this scope

标签: c++ linux linux-kernel cout


【解决方案1】:

使用 printk api 打印消息

printk(KERN_DEBUG "*** This is a debug message only. ***\n");

您可以检查内核模块的打印消息到 dmesg

【讨论】:

  • 我已尝试使用 printk,但我得到错误“printk”未在此范围内声明。
  • 你必须在你的源代码中包含#include #include
【解决方案2】:

Linux 内核根本不支持 C++,你不能使用 &lt;iostream&gt; - 我怀疑任何 STL 也完全不可能,但自从我查看以来已经有一段时间了Linux 内核模式下的 C++。

coutcerr 的标准实现使用的是操作系统特性,当然这些特性在内核中是行不通的。所以你不能使用那些。当然可以实现以相同方式工作的东西(称为kostream)和kostream&amp; operator&lt;&lt;(kostream&amp; os, sometype value),它会在缓冲区中产生一些输出,然后使用printkprintk 使用的一些原语来产生实际的输出。

无论是 C 还是 C++,你最终都会使用printk(或者它的组成部分)在 Linux 内核中打印东西。

请注意,使用fstreamstringstream 在内核中也不起作用。

【讨论】:

  • iostreams 绝对不可能。如果您使用自定义分配器而不是默认分配器 (std::allocator),则可能可以使用 STL 容器。你还需要弄清楚如何处理异常,然后,如果你让它发挥作用,期待来自 Linus 的长篇大论。
  • 问题只是缺少new/malloc吗?
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 2015-06-02
  • 2015-01-04
  • 2016-12-13
相关资源
最近更新 更多