所以我正在尝试学习编写 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 时,我可以清楚地看到消息在缓冲区中,但永远不会进入控制台。我并不是真的需要它们打印到控制台,但我真的很想了解这一切是如何工作的。