0

所以我正在尝试学习编写 Linux 模块,现在我正在尝试一个基本的“Hello World”模块:

#include <linux/module.h>
#include <linux/init.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void){

    printk(KERN_ALERT "Hello, world.\n");
    return 0;
}

static void hello_exit(void){

    printk(KERN_ALERT "goodbye.\n");
}

module_init(hello_init);
module_exit(hello_exit);

我终于让这个模块工作了!当我使用 insmod 添加时,它会将“hello”打印到 kernel.log,当我使用 remmod 删除它时,它会将“goodbye”打印到 kernel.log。

我的麻烦是我决定尝试让输出也打印到控制台。根据我对 printk() 的了解,为了让消息显示在控制台中,控制台必须在 /proc/sys/kernel/printk 中设置为适当的消息级别。(这都是根据https://elinux.org/Debugging_by_printing)。我的控制台设置为 4 级。

猫/proc/sys/kernel/printk:

4       4       1       7

由于 KERN_ALERT 是 2 级,而我的控制台设置为打印 4 级及以下的消息,为什么我的控制台上没有出现 printk 消息?当我运行 dmesg 时,我可以清楚地看到消息在缓冲区中,但永远不会进入控制台。我并不是真的需要它们打印到控制台,但我真的很想了解这一切是如何工作的。

4

1 回答 1

0

我希望我能回答你的问题。我也遇到了同样的问题,并尽我所能将内核消息打印到控制台,但没有任何效果。然后我开始寻找原因...

原因是,如果 klogd 没有运行,除非您阅读 /proc/kmsg,否则消息将不会到达用户空间。参考:oreilly或 /dev/kmsg。klogd 读取内核日志消息并帮助处理这些消息并将其发送到适当的文件、套接字或用户。由于没有守护进程,它不会发送到标准输出。除非您从环形缓冲区或缓冲区溢出中读取消息,否则它将保留。

于 2021-12-20T15:28:01.103 回答