为什么printk不在内核日志中打印消息(dmesg)

Ank*_*ank 5 c kernel kernel-module linux-kernel printk

我编写了如下所述的小型内核模块代码,我正在对其进行测试 ubuntu 14.04

#include <linux/module.h> 
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>

int init_mod_func(void)
{
    printk(KERN_INFO "My module inserted\n ");
    return 0;
}

void cleanup_mod_func(void)
{
    printk(KERN_INFO "My module removed\n ");
}

module_init(init_mod_func);
module_exit(cleanup_mod_func);


MODULE_AUTHOR("Ankur");
MODULE_DESCRIPTION("TEST MODULE");
MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)

现在,当我使用上面的模块进行编译和插入时insmod,在dmesg中看不到printk消息。但是,在使用模块删除后,rmmod我看到了两个printk消息。

通过闭包外观,我发现它是由于在printk中出现spaceafter \n而引起的。
但是我不明白为什么会这样。

ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo dmesg -C /dev/null
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo insmod testmod.ko 
ankur:~/temp/tmp$ dmesg
ankur:~/temp/tmp$ 
ankur:~/temp/tmp$ sudo rmmod testmod
ankur:~/temp/tmp$ dmesg
[ 4062.140441] My module inserted
[ 4062.140441]  
[ 4073.324994] My module removed
[ 4073.324994]
Run Code Online (Sandbox Code Playgroud)

Mic*_*kis 6

从实现中可以看出,内核日志环形缓冲区的行为就像是行缓冲一样:

  • vprintk_emit你可以看到它标志着一个缓冲区被刷新/缓冲的基础上尾随换行符的存在

  • 在其中,log_output您可以看到实际的代码,该代码负责刷新或缓冲消息

显而易见,您的消息不包含尾随换行符。如果删除了尾随空格,则在printk调用中将消息刷新后,您将在内核日志中看到这些消息。