【问题标题】:Kernel module print statement causing kernel crashes内核模块打印语句导致内核崩溃
【发布时间】:2016-01-06 11:38:25
【问题描述】:

每当我将任何 printk 语句放入 if-else 块中时,它都会使 Linux 中的内核崩溃。

示例代码如下:

if (device-> Some condition) {
        s = 0;
        e = 0;
        printk(KERN_INFO "I am 0 and 0 part \n");
        printk(KERN_ALERT "KERN_INFO Successfully registered module \n");
} else {
        s = 1;
        e = 2;
        printk(KERN_INFO "I am in 1 and 1 part \n");
}

上面的代码在我制作时编译成功。但在 insmod 期间,内核停止响应并最终崩溃。相反,如果我注释掉那些 printk 语句,那么我可以轻松地做到 insmod

我想知道这种行为的可能原因以及如何删除这些东西。

【问题讨论】:

  • 我怀疑崩溃与printk 通话有关。您可能在其他地方遇到了一些访问冲突 (UB),当您调用 printk 时就会出现这种情况。
  • 是的,我不确定是否会发生崩溃,因为我正在使用 putty 将 RDP 用于远程服务器。因此,每当我在某个 if-else 块(不是全部)中使用 printk 时,它在我执行 insmod 时根本不会响应。另外,在 printk 中我只是打印一个字符串,我什至没有尝试打印变量的值。所以我认为这与 printk 语句有关
  • 内核崩溃通常会在控制台上打印确切的错误和堆栈跟踪。
  • 你确定device 不能是NULL?没有内核堆栈跟踪很难说。
  • 所有 3 个 printk 你看到问题了吗?或者只有这 3 个中的任何一个,你会看到这个问题?尝试缩小导致陈述的范围...

标签: c linux linux-kernel


【解决方案1】:

有些情况下不应该调用 printk 看看

http://lkml.iu.edu/hypermail/linux/kernel/0606.1/2198.html

printk inside an interrupt handler , is it really that bad?

因此,如果您的整个代码都在这种情况下,请避免 printK() 尝试使用其他替代选项 dev_dbg()trace_printk()

【讨论】:

  • 这只是一个简单的 IF-ELSE 块人。我发誓这是我正在使用的确切代码(除了对设备-> 条件进行了一些更改,但这是条件语句的一部分)。内部块是相同的。另外,我刚刚尝试了 trace_printk() 方法,它也显示了同样的问题
  • 还有一件事Jeegar,你能告诉我以下事件的原因吗?当我在此问题发生 30 秒后重新连接到远程服务器时,Module.symvers、*ko 等所有文件都将被删除,就像我发出了 make clean 命令一样。为什么会这样?
  • 当崩溃发生后可能是您的远程系统自行重启。并且初始化服务应该有一些规则来清理这些文件。你的远程系统是什么?完整的x86系统?用 /proc/kmsg 试过了吗?
  • 这是一个 x64 SLES 系统
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2014-07-07
  • 1970-01-01
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
相关资源
最近更新 更多