7

我编写了如下所述的小内核模块代码,我正在测试它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");

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]
4

1 回答 1

7

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

  • vprintk_emit您可以看到它如何根据尾随换行符的存在标记要刷新/缓冲的缓冲区

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

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

于 2016-08-08T07:26:03.673 回答