所以我正在尝试学习编写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".log当我使用 remmod 删除它时,它会向内核.log打印"再见"。
我的麻烦是我决定尝试让输出也打印到控制台。根据我对printk((的理解,为了使消息显示在控制台中,控制台必须在/proc/sys/kernel/printk中设置为适当的消息级别。(这都是根据 https://elinux.org/Debugging_by_printing(。我的控制台设置为级别 4。
cat/proc/sys/kernel/printk:
4 4 1 7
由于KERN_ALERT是级别 2,并且我的主机设置为打印出级别 4 及以下的消息,为什么 printk 消息没有出现在我的主机上?当我运行 dmesg 时,我可以看到消息清楚地在缓冲区中,但永远不会转到控制台。不是我真的需要它们打印到控制台,但我真的很想了解这一切是如何工作的。
我希望我能回答你的问题。我也遇到了同样的问题,并尽力将内核消息打印到控制台,但没有任何效果。然后我开始寻找原因...
原因是,如果 klogd 没有运行,除非您阅读/proc/kmsg,否则消息不会到达用户空间。参考:oreilly 或/dev/kmsg。klogd 读取内核日志消息,并帮助处理这些消息并将其发送到相应的文件、套接字或用户。由于缺少守护程序,它不会发送到标准输出。除非您从环形缓冲区或缓冲区溢出读取消息,否则它将保留。